MySql學習筆記(二)

僱員表:emp
字段名稱 字段類型 說明
empno int 員工編號
ename varchar(50)  員工姓名
job varchar(50)  員工工作
mgr int 領導編號
hiredate date 入職日期
sal decimal(7,2) 月薪
comm decimal(7,2) 獎金
deptno int 部分編號


CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);






---------------------------------------------------------------------------------------------------
* 模糊查詢:like
* 通配符
* _:匹配單個任意字符






比如: 我要查詢姓名是3個任意字符組成的
select  * from student sname like='___';
例如:我要查詢第二個字符是m的
select * from student where sanme like '_m%';




* %:匹配多個任意字符
例如:我要查詢名字中包含m的 select * from student where sname like '%m%';
例如我要查詢名字是a開頭的 select * from student where sname like 'a%';
例如我要查詢名字是b結尾的 select * from student wher like '%b';




* 字段控制:
* 修改字段的別名:AS (可以省略)
* 給字段起別名:
例如:   select sname as 姓名, sage 年齡 from student;
*給運算字段起別名:
例如: select sname as 姓名, (工資+獎金) as 總收入 from student;


* 給表起別名:給每一張表起一個別名。簡化書寫
` 例如: select stu.sname, stu.sage from student as stu;
* 字段運算:
* null參與的運算,結果都爲null  
比如 工資 是100  獎金是null  我們讓這兩個字段運算 那結果就爲null
* 一般會將null替換爲0: ifnull(字段名稱,如果是null的替換值)  ifnull 是mysql的方言

所有如果獎金字段爲null 一般我們把獎金替換爲0
例如: select sname,(工資+ifnull(獎金,0)) as 總收入from student;

* 去除重複記錄   比如我查詢工資是3000的 出現了多條工資爲3000 的記錄 那我只想展示一條3000的記錄  所以可以用 distinct 去除重複記錄
* DISTINCT     


例如: select distinct 工資  from student;


排序: order by  默認升序排列  ASC 默認值                DESC 降序排列
按工資從小到大排
select * from student order by 工資 asc;
按工資從大到小排
select * from student order by 工資 desc 
如果出現多條工資一樣的 那我們可以指定第二排序條件 
select * from student order by 工資 desc,獎金desc;
 
* 聚合函數:
* 聚合函數是用來做縱向運算的函數:
COUNT():統計指定列不爲NULL的記錄行數; 統計個數的 比如我統計有多少個學生
select count(sid) from student;  或者傳個星 號    select count(*) from student;         一般不要傳有null 值的字段


MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
  例如 查詢工資最大值    select max(工資) as 最高工資 from student;

MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
例如 查詢 最少工資   select min(工資) as 最小工資 from student;
SUM():計算指定列的數值和,如果指 定列類型不是數值類型,那麼計算結果爲0;
例如 計算總工資  select sun(工資) as 總支出 from student;


AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;
例如:計算平均 工資 select avg(工資) as 平均工資 from student;


* 分組查詢:group by     一般配合聚合函數使用 查出的數據纔有意義
* 查詢的字段:
1.分組字段本身
2.聚合函數
比如我按部分編號分組  比如有三個部門 然後我求每個部門的平均工資  那展示出來的數據應該有三條
例如: select 部門編號,AVG(工資) from student group by 部門編號;


1.例如查詢 每個部門的部門編號 已經每個部門工資大於1500的人數
select 部門編號, count(*) from student where 工資>1500 group by 部門編號;
注意這裏的 where 是對分組前的條件限定 也就是說不滿足條件的 不參與分組



* where和having
* where:在分組之前對條件進行限定。不滿足條件,就不會參與分組
* having:在分組之後,對結果集的篩選


2.例如 我要查詢 各個部門平均工資 大於2000 的部門


select 部門編號,avg(工資) from student group by 部門編號 having avg(工資)>2000;


3. 例如我要查詢 各個部門  員工工資大於1500 的平均工資  並且平均工資 大於2000的部門


上面這句話怎麼理解呢? 首先查詢各個部門 那肯定要按部門編號分組 分組前的條件限定是 員工工資大於1500的才參與分組
計算出平均工資  然後對結果再進行篩選 篩選出 平均工資 大於2000的部門

  select 部門編號,avg(工資) from student group by 部門編號 where avg(工資)>1500 having  avg(工資)>2000;


* 分頁查詢:limit
* limit 0,5 開始的記錄索引, 每一頁顯示的條數     索引從0開始
開始的記錄索引  = (頁碼-1)*每一頁顯示的條數


例如 我顯示第一頁  每頁5條記錄
select * from student limit 0,5 ;  這是第一頁 5 條記錄
select * from student limit 5,5 ; 這是第二頁 5條記錄
select * from student limit 10,5 這是第三頁 5條記錄

* oracle:rownum 分頁方言

* sqlserver:top 分頁方言

約束:
作用:
爲了保證數據的有效性和完整性
mysql中常用的約束:主鍵約束(primary key)  唯一約束(unique) 非空約束(not null) 外鍵約束(foreign key)
主鍵約束:被修飾過的字段唯一非空
注意:一張表只能有一個主鍵,這個主鍵可以包含多個字段
方式1:建表的同時添加約束 格式: 字段名稱 字段類型 primary key
方式2:建表的同時在約束區域添加約束 
所有的字段聲明完成之後,就是約束區域了
格式: primary key(字段1,字段2)

create table pk01(
id int,
username varchar(20),
primary key (id)
);

insert into pk01 values(1,'tom');-- 成功
insert into pk01 values(1,'tom');-- 失敗 Duplicate entry '1' for key 'PRIMARY'
insert into pk01 values(null,'tom');-- 失敗  Column 'id' cannot be null

create table pk01(
id int primary key,
username varchar(20),
primary key (id)
);-- 錯誤的 一張表只能有一個主鍵

方式3:建表之後,通過修改表結構添加約束
create table pk02(
id int,
username varchar(20)
);

alter table pk02 add primary key(字段名1,字段名2..);
alter table pk02 add primary key(id,username);

insert into pk02 values(1,'tom');-- 成功
insert into pk02 values(1,'tomcat');-- 成功
insert into pk02 values(1,'tomcat');-- 失敗

唯一約束:(瞭解)
被修飾過的字段唯一,對null不起作用
方式1:建表的同時添加約束 格式: 字段名稱 字段類型 unique
create table un(
id int unique,
username varchar(20) unique
);

insert into un value(10,'tom');-- 成功
insert into un value(10,'jack');-- 錯誤 Duplicate entry '10' for key 'id'
insert into un value(null,'jack');-- 成功
insert into un value(null,'rose');-- 成功

方式2:建表的同時在約束區域添加約束 
所有的字段聲明完成之後,就是約束區域了
unique(字段1,字段值2...)
方式3:建表之後,通過修改表結構添加約束
alter table 表名 add unique(字段1,字段2);-- 添加的聯合唯一
alter table 表名 add unique(字段1);-- 給一個添加唯一
alter table 表名 add unique(字段2);-- 給另一個添加唯一

////////////////
create table un01(
id int,
username varchar(20)
); 
alter table un01 add unique(id,username);
insert into un01 values(1,'tom');-- 成功
insert into un01 values(1,'jack');-- 成功
insert into un01 values(1,'tom');-- 失敗  Duplicate entry '1-tom' for key 'id'
/////////////////////
非空約束(瞭解)
特點:被修飾過的字段非空
方式:
create table nn(
id int not null,
username varchar(20) not null
);

insert into nn values(null,'tom');--  錯誤的 Column 'id' cannot be null
///////////////////////////////

發佈了38 篇原創文章 · 獲贊 1 · 訪問量 5464
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章