MySQL1

MySQL筆記1

MySQL


1、sql、DB秩伞、DBMS分別是什么,他們之間的關系欺矫?

DB:

DataBase(數據庫纱新,數據庫實際上在硬盤上以文件的形式存在)


DBMS:

DataBase Management System(數據庫管理系統(tǒng),常見的有:MySQL Oracle DB2 Sybase SqlServer...)


SQL:

結構化查詢語言穆趴,是一門標準通用的語言脸爱。標準的sql適合于所有的數據庫產品。

SQL屬于高級語言未妹。只要能看懂英語單詞的簿废,寫出來的sql語句,可以讀懂什么意思络它。

SQL語句在執(zhí)行的時候族檬,實際上內部也會先進行編譯,然后再執(zhí)行sql化戳。(sql語句的編譯由DBMS完成单料。)

DBMS負責執(zhí)行sql語句,通過執(zhí)行sql語句來操作DB當中的數據点楼。

DBMS -(執(zhí)行)-> SQL -(操作)-> DB


2扫尖、什么是表?


表:table


表:table是數據庫的基本組成單元掠廓,所有的數據都以表格的形式組織藏斩,目的是可讀性強。


一個表包括行和列:

行:被稱為數據/記錄(data)

列:被稱為字段(column)

學號(int) 姓名(varchar) 年齡(int)

------------------------------------

110 張三 20

120 李四 21


每一個字段應該包括哪些屬性却盘?

字段名狰域、數據類型媳拴、相關的約束。


3兆览、學習MySQL主要還是學習通用的SQL語句屈溉,那么SQL語句包括增刪改查,SQL語句怎么分類呢抬探?

DQL(數據查詢語言): 查詢語句子巾,凡是select語句都是DQL。

DML(數據操作語言):insert delete update小压,對表當中的數據進行增刪改线梗。

DDL(數據定義語言):create drop alter,對表結構的增刪改怠益。

TCL(事務控制語言):commit提交事務仪搔,rollback回滾事務。(TCL中的T是Transaction)

DCL(數據控制語言): grant授權蜻牢、revoke撤銷權限等烤咧。


4、導入數據(后期大家練習的時候使用這個演示的數據)

第一步:登錄mysql數據庫管理系統(tǒng)

dos命令窗口:

mysql -uroot -p333

第二步:查看有哪些數據庫

show databases; (這個不是SQL語句抢呆,屬于MySQL的命令煮嫌。)

+--------------------+

| Database ??????????|

+--------------------+

| information_schema |

| mysql ?????????????|

| performance_schema |

| test ??????????????|

+--------------------+

第三步:創(chuàng)建屬于我們自己的數據庫

create database bjpowernode; (這個不是SQL語句,屬于MySQL的命令抱虐。)

第四步:使用bjpowernode數據

use bjpowernode; (這個不是SQL語句昌阿,屬于MySQL的命令。)

第五步:查看當前使用的數據庫中有哪些表恳邀?

show tables; (這個不是SQL語句懦冰,屬于MySQL的命令。)

第六步:初始化數據

mysql> source D:\course\05-MySQL\resources\bjpowernode.sql

注意:數據初始化完成之后轩娶,有三張表:

+-----------------------+

| Tables_in_bjpowernode |

+-----------------------+

| dept ?????????????????|

| emp ??????????????????|

| salgrade ?????????????|

+-----------------------+


5儿奶、bjpowernode.sql框往,這個文件以sql結尾鳄抒,這樣的文件被稱為“sql腳本”。什么是sql腳本呢椰弊?

當一個文件的擴展名是.sql许溅,并且該文件中編寫了大量的sql語句,我們稱這樣的文件為sql腳本秉版。

注意:直接使用source命令可以執(zhí)行sql腳本贤重。

sql腳本中的數據量太大的時候,無法打開清焕,請使用source命令完成初始化并蝗。



6祭犯、刪除數據庫:drop database bjpowernode;


7、查看表結構:

+-----------------------+

| Tables_in_bjpowernode |

+-----------------------+

| dept ?????????????????| ??(部門表)

| emp ??????????????????| ??(員工表)

| salgrade ?????????????| ??(工資等級表)

+-----------------------+



mysql> desc dept;

+--------+-------------+------+-----+---------+-------+

| Field ?| Type ???????| Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| DEPTNO | int(2) ?????| NO ??| PRI | NULL ???| ??????| 部門編號

| DNAME ?| varchar(14) | YES ?| ????| NULL ???| ??????| 部門名稱

| LOC ???| varchar(13) | YES ?| ????| NULL ???| ??????| 部門位置

+--------+-------------+------+-----+---------+-------+


mysql> desc emp;

+----------+-------------+------+-----+---------+-------+

| Field ???| Type ???????| Null | Key | Default | Extra |

+----------+-------------+------+-----+---------+-------+

| EMPNO ???| int(4) ?????| NO ??| PRI | NULL ???| ??????| 員工編號

| ENAME ???| varchar(10) | YES ?| ????| NULL ???| ??????| 員工姓名

| JOB ?????| varchar(9) ?| YES ?| ????| NULL ???| ??????| 工作崗位

| MGR ?????| int(4) ?????| YES ?| ????| NULL ???| ??????| 上級領導編號

| HIREDATE | date ???????| YES ?| ????| NULL ???| ??????| 入職日期

| SAL ?????| double(7,2) | YES ?| ????| NULL ???| ??????| 月薪

| COMM ????| double(7,2) | YES ?| ????| NULL ???| ??????| 補助/津貼

| DEPTNO ??| int(2) ?????| YES ?| ????| NULL ???| ??????| 部門編號

+----------+-------------+------+-----+---------+-------+


mysql> desc salgrade;

+-------+---------+------+-----+---------+-------+

| Field | Type ???| Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| GRADE | int(11) | YES ?| ????| NULL ???| ??????| 等級

| LOSAL | int(11) | YES ?| ????| NULL ???| ??????| 最低薪資

| HISAL | int(11) | YES ?| ????| NULL ???| ??????| 最高薪資

+-------+---------+------+-----+---------+-------+


8滚停、表中的數據沃粗?


mysql> select * from emp;

+-------+--------+-----------+------+------------+---------+---------+--------+

| EMPNO | ENAME ?| JOB ??????| MGR ?| HIREDATE ??| SAL ????| COMM ???| DEPTNO |

+-------+--------+-----------+------+------------+---------+---------+--------+

| ?7369 | SMITH ?| CLERK ????| 7902 | 1980-12-17 | ?800.00 | ???NULL | ????20 |

| ?7499 | ALLEN ?| SALESMAN ?| 7698 | 1981-02-20 | 1600.00 | ?300.00 | ????30 |

| ?7521 | WARD ??| SALESMAN ?| 7698 | 1981-02-22 | 1250.00 | ?500.00 | ????30 |

| ?7566 | JONES ?| MANAGER ??| 7839 | 1981-04-02 | 2975.00 | ???NULL | ????20 |

| ?7654 | MARTIN | SALESMAN ?| 7698 | 1981-09-28 | 1250.00 | 1400.00 | ????30 |

| ?7698 | BLAKE ?| MANAGER ??| 7839 | 1981-05-01 | 2850.00 | ???NULL | ????30 |

| ?7782 | CLARK ?| MANAGER ??| 7839 | 1981-06-09 | 2450.00 | ???NULL | ????10 |

| ?7788 | SCOTT ?| ANALYST ??| 7566 | 1987-04-19 | 3000.00 | ???NULL | ????20 |

| ?7839 | KING ??| PRESIDENT | NULL | 1981-11-17 | 5000.00 | ???NULL | ????10 |

| ?7844 | TURNER | SALESMAN ?| 7698 | 1981-09-08 | 1500.00 | ???0.00 | ????30 |

| ?7876 | ADAMS ?| CLERK ????| 7788 | 1987-05-23 | 1100.00 | ???NULL | ????20 |

| ?7900 | JAMES ?| CLERK ????| 7698 | 1981-12-03 | ?950.00 | ???NULL | ????30 |

| ?7902 | FORD ??| ANALYST ??| 7566 | 1981-12-03 | 3000.00 | ???NULL | ????20 |

| ?7934 | MILLER | CLERK ????| 7782 | 1982-01-23 | 1300.00 | ???NULL | ????10 |

+-------+--------+-----------+------+------------+---------+---------+--------+


mysql> select * from dept;

+--------+------------+----------+

| DEPTNO | DNAME ?????| LOC ?????|

+--------+------------+----------+

| ????10 | ACCOUNTING | NEW YORK |

| ????20 | RESEARCH ??| DALLAS ??|

| ????30 | SALES ?????| CHICAGO ?|

| ????40 | OPERATIONS | BOSTON ??|

+--------+------------+----------+


mysql> select * from salgrade;

+-------+-------+-------+

| GRADE | LOSAL | HISAL |

+-------+-------+-------+

| ????1 | ??700 | ?1200 |

| ????2 | ?1201 | ?1400 |

| ????3 | ?1401 | ?2000 |

| ????4 | ?2001 | ?3000 |

| ????5 | ?3001 | ?9999 |

+-------+-------+-------+


9、常用命令键畴?

mysql> select database();查看當前使用的是哪個數據庫

+-------------+

| database() ?|

+-------------+

| bjpowernode |

+-------------+


mysql> select version();查看mysql的版本號最盅。

+-----------+

| version() |

+-----------+

| 5.5.36 ???|

+-----------+


\c命令,結束一條語句起惕。


exit命令涡贱,退出mysql。


10惹想、查看創(chuàng)建表的語句:

show create table emp;


11问词、簡單的查詢語句(DQL)


語法格式:

select字段名1,字段名2,字段名3,.... from 表名;


提示:

1、任何一條sql語句以“;”結尾勺馆。

2戏售、sql語句不區(qū)分大小寫。

查詢員工的年薪草穆?(字段可以參與數學運算灌灾。)

select ename,sal * 12 from emp;

+--------+----------+

| ename ?| sal * 12 |

+--------+----------+

| SMITH ?| ?9600.00 |

| ALLEN ?| 19200.00 |

| WARD ??| 15000.00 |

| JONES ?| 35700.00 |

| MARTIN | 15000.00 |

| BLAKE ?| 34200.00 |

| CLARK ?| 29400.00 |

| SCOTT ?| 36000.00 |

| KING ??| 60000.00 |

| TURNER | 18000.00 |

| ADAMS ?| 13200.00 |

| JAMES ?| 11400.00 |

| FORD ??| 36000.00 |

| MILLER | 15600.00 |

+--------+----------+

給查詢結果的列重命名?

select ename,sal * 12 as yearsal from emp;

別名中有中文悲柱?

select ename,sal * 12 as年薪 from emp; // 錯誤

select ename,sal * 12 as '年薪' from emp;

+--------+----------+

| ename ?|年薪 ???????|

+--------+----------+

| SMITH ?| ?9600.00 |

| ALLEN ?| 19200.00 |

| WARD ??| 15000.00 |

| JONES ?| 35700.00 |

| MARTIN | 15000.00 |

| BLAKE ?| 34200.00 |

| CLARK ?| 29400.00 |

| SCOTT ?| 36000.00 |

| KING ??| 60000.00 |

| TURNER | 18000.00 |

| ADAMS ?| 13200.00 |

| JAMES ?| 11400.00 |

| FORD ??| 36000.00 |

| MILLER | 15600.00 |

+--------+----------+

注意:標準sql語句中要求字符串使用單引號括起來锋喜。雖然mysql支持雙引號,盡量別用豌鸡。


as關鍵字可以省略嘿般?

mysql> select empno,ename,sal * 12 yearsal from emp;

+-------+--------+----------+

| empno | ename ?| yearsal ?|

+-------+--------+----------+

| ?7369 | SMITH ?| ?9600.00 |

| ?7499 | ALLEN ?| 19200.00 |

| ?7521 | WARD ??| 15000.00 |

| ?7566 | JONES ?| 35700.00 |

| ?7654 | MARTIN | 15000.00 |

| ?7698 | BLAKE ?| 34200.00 |

| ?7782 | CLARK ?| 29400.00 |

| ?7788 | SCOTT ?| 36000.00 |

| ?7839 | KING ??| 60000.00 |

| ?7844 | TURNER | 18000.00 |

| ?7876 | ADAMS ?| 13200.00 |

| ?7900 | JAMES ?| 11400.00 |

| ?7902 | FORD ??| 36000.00 |

| ?7934 | MILLER | 15600.00 |

+-------+--------+----------+


查詢所有字段?

select * from emp; //實際開發(fā)中不建議使用*涯冠,效率較低炉奴。


12、條件查詢蛇更。

語法格式:

select

字段,字段...

from

表名

where

條件;


執(zhí)行順序:先from瞻赶,然后where,最后select


查詢工資等于5000的員工姓名派任?

select ename from emp where sal = 5000;

+-------+

| ename |

+-------+

| KING ?|

+-------+

查詢SMITH的工資砸逊?

select sal from emp where ename = 'SMITH'; //字符串使用單引號括起來。

+--------+

| sal ???|

+--------+

| 800.00 |

+--------+

找出工資高于3000的員工掌逛?

select ename,sal from emp where sal > 3000;


select ename,sal from emp where sal >= 3000;


select ename,sal from emp where sal < 3000;


select ename,sal from emp where sal <= 3000;

找出工資不等于3000的师逸?

select ename,sal from emp where sal <> 3000;

select ename,sal from emp where sal != 3000;

找出工資在1100和3000之間的員工,包括1100和3000豆混?

select ename,sal from emp where sal >= 1100 and sal <= 3000;


select ename,sal from emp where sal between 1100 and 3000; // between...and...是閉區(qū)間 [1100 ~ 3000]


select ename,sal from emp where sal between 3000 and 1100; //查詢不到任何數據


between and在使用的時候必須左小右大篓像。


between and除了可以使用在數字方面之外动知,還可以使用在字符串方面。

select ename from emp where ename between 'A' and 'C';

+-------+

| ename |0

+-------+

| ALLEN |

| BLAKE |

| ADAMS |

+-------+

select ename from emp where ename between 'A' and 'D'; //左閉右開员辩。


找出哪些人津貼為NULL拍柒?

在數據庫當中NULL不是一個值,代表什么也沒有屈暗,為空拆讯。

空不是一個值,不能用等號衡量养叛。

必須使用is null或者is not null

select ename,sal,comm from emp where comm is null;

+--------+---------+------+

| ename ?| sal ????| comm |

+--------+---------+------+

| SMITH ?| ?800.00 | NULL |

| JONES ?| 2975.00 | NULL |

| BLAKE ?| 2850.00 | NULL |

| CLARK ?| 2450.00 | NULL |

| SCOTT ?| 3000.00 | NULL |

| KING ??| 5000.00 | NULL |

| ADAMS ?| 1100.00 | NULL |

| JAMES ?| ?950.00 | NULL |

| FORD ??| 3000.00 | NULL |

| MILLER | 1300.00 | NULL |

+--------+---------+------+

select ename,sal,comm from emp where comm = null;

Empty set (0.00 sec)


找出哪些人津貼不為NULL种呐?

select ename,sal,comm from emp where comm is not null;

+--------+---------+---------+

| ename ?| sal ????| comm ???|

+--------+---------+---------+

| ALLEN ?| 1600.00 | ?300.00 |

| WARD ??| 1250.00 | ?500.00 |

| MARTIN | 1250.00 | 1400.00 |

| TURNER | 1500.00 | ???0.00 |

+--------+---------+---------+

找出哪些人沒有津貼?

select ename,sal,comm from emp where comm is null or comm = 0;

+--------+---------+------+

| ename ?| sal ????| comm |

+--------+---------+------+

| SMITH ?| ?800.00 | NULL |

| JONES ?| 2975.00 | NULL |

| BLAKE ?| 2850.00 | NULL |

| CLARK ?| 2450.00 | NULL |

| SCOTT ?| 3000.00 | NULL |

| KING ??| 5000.00 | NULL |

| TURNER | 1500.00 | 0.00 |

| ADAMS ?| 1100.00 | NULL |

| JAMES ?| ?950.00 | NULL |

| FORD ??| 3000.00 | NULL |

| MILLER | 1300.00 | NULL |

+--------+---------+------+

找出工作崗位是MANAGER和SALESMAN的員工弃甥?

select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

+--------+----------+

| ename ?| job ?????|

+--------+----------+

| ALLEN ?| SALESMAN |

| WARD ??| SALESMAN |

| JONES ?| MANAGER ?|

| MARTIN | SALESMAN |

| BLAKE ?| MANAGER ?|

| CLARK ?| MANAGER ?|

| TURNER | SALESMAN |

+--------+----------+

and和or聯合起來用:找出薪資大于1000的并且部門編號是20或30部門的員工爽室。

select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno = 30; //錯誤的

select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30); //正確的。

注意:當運算符的優(yōu)先級不確定的時候加小括號淆攻。

in等同于or:找出工作崗位是MANAGER和SALESMAN的員工阔墩?

select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';

select ename,job from emp where job in('SALESMAN', 'MANAGER');


select ename,job from emp where sal in(800, 5000); // in后面的值不是區(qū)間,是具體的值瓶珊。

+-------+-----------+

| ename | job ??????|

+-------+-----------+

| SMITH | CLERK ????|

| KING ?| PRESIDENT |

+-------+-----------+

not in:不在這幾個值當中啸箫。

select ename,job from emp where sal not in(800, 5000);

模糊查詢like ?

找出名字當中含有O的?

(在模糊查詢當中伞芹,必須掌握兩個特殊的符號忘苛,一個是%,一個是_)

%代表任意多個字符唱较,_代表任意1個字符扎唾。

select ename from emp where ename like '%O%';

+-------+

| ename |

+-------+

| JONES |

| SCOTT |

| FORD ?|

+-------+

找出名字中第二個字母是A的南缓?

select ename from emp where ename like '_A%';

+--------+

| ename ?|

+--------+

| WARD ??|

| MARTIN |

| JAMES ?|

+--------+

找出名字中有下劃線的胸遇?

mysql> select * from t_user;

+------+----------+

| id ??| name ????|

+------+----------+

| ???1 | zhangsan |

| ???2 | lisi ????|

| ???3 | WANG_WU ?|

+------+----------+

select name from t_user where name like '%_%';

+----------+

| name ????|

+----------+

| zhangsan |

| lisi ????|

| WANG_WU ?|

+----------+

select name from t_user where name like '%\_%';

+---------+

| name ???|

+---------+

| WANG_WU |

+---------+


找出名字中最后一個字母是T的?

select ename from emp where ename like '%T';

+-------+

| ename |

+-------+

| SCOTT |

+-------+


13汉形、排序(升序纸镊、降序)


按照工資升序,找出員工名和薪資获雕?

select

ename,sal

from

emp

order by

sal;

+--------+---------+

| ename ?| sal ????|

+--------+---------+

| SMITH ?| ?800.00 |

| JAMES ?| ?950.00 |

| ADAMS ?| 1100.00 |

| WARD ??| 1250.00 |

| MARTIN | 1250.00 |

| MILLER | 1300.00 |

| TURNER | 1500.00 |

| ALLEN ?| 1600.00 |

| CLARK ?| 2450.00 |

| BLAKE ?| 2850.00 |

| JONES ?| 2975.00 |

| FORD ??| 3000.00 |

| SCOTT ?| 3000.00 |

| KING ??| 5000.00 |

+--------+---------+


注意:默認是升序薄腻。怎么指定升序或者降序呢收捣?asc表示升序届案,desc表示降序。

select ename , sal from emp order by sal; //升序

select ename , sal from emp order by sal asc; //升序

select ename , sal from emp order by sal desc; //降序罢艾。


按照工資的降序排列楣颠,當工資相同的時候再按照名字的升序排列尽纽。

select ename,sal from emp order by sal desc;

select ename,sal from emp order by sal desc , ename asc;

注意:越靠前的字段越能起到主導作用。只有當前面的字段無法完成排序的時候童漩,才會啟用后面的字段弄贿。


找出工作崗位是SALESMAN的員工,并且要求按照薪資的降序排列矫膨。

select

ename,job,sal

from

emp

where

job = 'SALESMAN'

order by

sal desc;

+--------+----------+---------+

| ename ?| job ?????| sal ????|

+--------+----------+---------+

| ALLEN ?| SALESMAN | 1600.00 |

| TURNER | SALESMAN | 1500.00 |

| WARD ??| SALESMAN | 1250.00 |

| MARTIN | SALESMAN | 1250.00 |

+--------+----------+---------+

select

字段 3

from

表名 1

where

條件 2

order by

.... 4

order by是最后執(zhí)行的差凹。


14、分組函數侧馅?

count計數

sum求和

avg平均值

max最大值

min最小值


記孜D颉:所有的分組函數都是對“某一組”數據進行操作的。


找出工資總和馁痴?

select sum(sal) from emp;

找出最高工資谊娇?

select max(sal) from emp;

找出最低工資?

select min(sal) from emp;

找出平均工資罗晕?

select avg(sal) from emp;

找出總人數济欢?

select count(*) from emp;

select count(ename) from emp;

分組函數一共5個。

分組函數還有另一個名字:多行處理函數小渊。

多行處理函數的特點:輸入多行法褥,最終輸出的結果是1行。


分組函數自動忽略NULL酬屉。

select count(comm) from emp;

+-------------+

| count(comm) |

+-------------+

| ??????????4 |

+-------------+


select sum(comm) from emp;

+-----------+

| sum(comm) |

+-----------+

| ??2200.00 |

+-----------+


select sum(comm) from emp where comm is not null; //不需要額外添加這個過濾條件挖胃。sum函數自動忽略NULL。


找出工資高于平均工資的員工梆惯?

select avg(sal) from emp; //平均工資

+-------------+

| avg(sal) ???|

+-------------+

| 2073.214286 |

+-------------+


select ename,sal from emp where sal > avg(sal); //ERROR 1111 (HY000): Invalid use of group function

思考以上的錯誤信息:無效的使用了分組函數酱鸭?

原因:SQL語句當中有一個語法規(guī)則,分組函數不可直接使用在where子句當中垛吗。why????

怎么解釋凹髓?

因為group by是在where執(zhí)行之后才會執(zhí)行的。

select 5

..

from 1

..

where 2

..

group by 3

..

having 4

..

order by 6

..

count(*)和count(具體的某個字段)怯屉,他們有什么區(qū)別蔚舀?

count(*):不是統(tǒng)計某個字段中數據的個數,而是統(tǒng)計總記錄條數锨络。(和某個字段無關)

count(comm):表示統(tǒng)計comm字段中不為NULL的數據總數量赌躺。

分組函數也能組合起來用:

select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;


+----------+----------+-------------+----------+----------+

| count(*) | sum(sal) | avg(sal) ???| max(sal) | min(sal) |

+----------+----------+-------------+----------+----------+

| ??????14 | 29025.00 | 2073.214286 | ?5000.00 | ??800.00 |

+----------+----------+-------------+----------+----------+

找出工資高于平均工資的員工?

第一步:找出平均工資

select avg(sal) from emp;

+-------------+

| avg(sal) ???|

+-------------+

| 2073.214286 |

+-------------+

第二步:找出高于平均工資的員工

select ename,sal from emp where sal > 2073.214286;

+-------+---------+

| ename | sal ????|

+-------+---------+

| JONES | 2975.00 |

| BLAKE | 2850.00 |

| CLARK | 2450.00 |

| SCOTT | 3000.00 |

| KING ?| 5000.00 |

| FORD ?| 3000.00 |

+-------+---------+


select ename,sal from emp where sal > (select avg(sal) from emp);


15羡儿、單行處理函數

什么是單行處理函數礼患?

輸入一行,輸出一行。

計算每個員工的年薪缅叠?

select ename,(sal+comm)*12 as yearsal from emp;

重點:所有數據庫都是這樣規(guī)定的悄泥,只要有NULL參與的運算結果一定是NULL。

使用ifnull函數:

select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

ifnull()空處理函數肤粱?

ifnull(可能為NULL的數據,被當做什么處理) : 屬于單行處理函數弹囚。

select ename,ifnull(comm,0) as comm from emp;

+--------+---------+

| ename ?| comm ???|

+--------+---------+

| SMITH ?| ???0.00 |

| ALLEN ?| ?300.00 |

| WARD ??| ?500.00 |

| JONES ?| ???0.00 |

| MARTIN | 1400.00 |

| BLAKE ?| ???0.00 |

| CLARK ?| ???0.00 |

| SCOTT ?| ???0.00 |

| KING ??| ???0.00 |

| TURNER | ???0.00 |

| ADAMS ?| ???0.00 |

| JAMES ?| ???0.00 |

| FORD ??| ???0.00 |

| MILLER | ???0.00 |

+--------+---------+

16、group by 和 having

group by: 按照某個字段或者某些字段進行分組领曼。

having : having是對分組之后的數據進行再次過濾鸥鹉。


案例:找出每個工作崗位的最高薪資。

select max(sal),job from emp group by job;


+----------+-----------+

| max(sal) | job ??????|

+----------+-----------+

| ?3000.00 | ANALYST ??|

| ?1300.00 | CLERK ????|

| ?2975.00 | MANAGER ??|

| ?5000.00 | PRESIDENT |

| ?1600.00 | SALESMAN ?|

+----------+-----------+



注意:分組函數一般都會和group by聯合使用庶骄,這也是為什么它被稱為分組函數的原因宋舷。

并且任何一個分組函數(count sum avg max min)都是在group by語句執(zhí)行結束之后才會執(zhí)行的。

當一條sql語句沒有group by的話瓢姻,整張表的數據會自成一組祝蝠。


select ename,max(sal),job from emp group by job;

以上在mysql當中,查詢結果是有的幻碱,但是結果沒有意義绎狭,在Oracle數據庫當中會報錯。語法錯誤褥傍。

Oracle的語法規(guī)則比MySQL語法規(guī)則嚴謹儡嘶。

記住一個規(guī)則:當一條語句中有group by的話,select后面只能跟分組函數和參與分組的字段恍风。


每個工作崗位的平均薪資蹦狂?

select job,avg(sal) from emp group by job;

+-----------+-------------+

| job ??????| avg(sal) ???|

+-----------+-------------+

| ANALYST ??| 3000.000000 |

| CLERK ????| 1037.500000 |

| MANAGER ??| 2758.333333 |

| PRESIDENT | 5000.000000 |

| SALESMAN ?| 1400.000000 |

+-----------+-------------+

多個字段能不能聯合起來一塊分組?

案例:找出每個部門不同工作崗位的最高薪資朋贬。

select

deptno,job,max(sal)

from

emp

group by

deptno,job;

找出每個部門的最高薪資凯楔,要求顯示薪資大于2900的數據。


第一步:找出每個部門的最高薪資

select max(sal),deptno from emp group by deptno;

+----------+--------+

| max(sal) | deptno |

+----------+--------+

| ?5000.00 | ????10 |

| ?3000.00 | ????20 |

| ?2850.00 | ????30 |

+----------+--------+


第二步:找出薪資大于2900

select max(sal),deptno from emp group by deptno having max(sal) > 2900; //這種方式效率低锦募。

+----------+--------+

| max(sal) | deptno |

+----------+--------+

| ?5000.00 | ????10 |

| ?3000.00 | ????20 |

+----------+--------+


select max(sal),deptno from emp where sal > 2900 group by deptno; ?//效率較高摆屯,建議能夠使用where過濾的盡量使用where。

+----------+--------+

| max(sal) | deptno |

+----------+--------+

| ?5000.00 | ????10 |

| ?3000.00 | ????20 |

+----------+--------+

找出每個部門的平均薪資糠亩,要求顯示薪資大于2000的數據虐骑。


第一步:找出每個部門的平均薪資

select deptno,avg(sal) from emp group by deptno;

+--------+-------------+

| deptno | avg(sal) ???|

+--------+-------------+

| ????10 | 2916.666667 |

| ????20 | 2175.000000 |

| ????30 | 1566.666667 |

+--------+-------------+


第二步:要求顯示薪資大于2000的數據

select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;

+--------+-------------+

| deptno | avg(sal) ???|

+--------+-------------+

| ????10 | 2916.666667 |

| ????20 | 2175.000000 |

+--------+-------------+


where后面不能使用分組函數:

select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno; //錯誤了。

這種情況只能使用having過濾赎线。


17廷没、總結一個完整的DQL語句怎么寫?


select 5

..

from 1

..

where 2

..

group by 3

..

having 4

..

order by 6

..

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末垂寥,一起剝皮案震驚了整個濱河市颠黎,隨后出現的幾起案子另锋,更是在濱河造成了極大的恐慌,老刑警劉巖盏缤,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蓖扑,居然都是意外死亡唉铜,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門律杠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潭流,“玉大人,你說我怎么就攤上這事柜去』壹担” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵嗓奢,是天一觀的道長讼撒。 經常有香客問我,道長股耽,這世上最難降的妖魔是什么根盒? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮物蝙,結果婚禮上炎滞,老公的妹妹穿的比我還像新娘。我一直安慰自己诬乞,他們只是感情好册赛,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震嫉,像睡著了一般森瘪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上票堵,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天柜砾,我揣著相機與錄音,去河邊找鬼换衬。 笑死痰驱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的瞳浦。 我是一名探鬼主播担映,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叫潦!你這毒婦竟也來了蝇完?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎短蜕,沒想到半個月后氢架,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡朋魔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年岖研,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片警检。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡孙援,死狀恐怖,靈堂內的尸體忽然破棺而出扇雕,到底是詐尸還是另有隱情拓售,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布镶奉,位于F島的核電站础淤,受9級特大地震影響,放射性物質發(fā)生泄漏哨苛。R本人自食惡果不足惜值骇,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望移国。 院中可真熱鬧吱瘩,春花似錦、人聲如沸迹缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝懂。三九已至票摇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚蓬,已是汗流浹背矢门。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灰蛙,地道東北人祟剔。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像摩梧,于是被迫代替她去往敵國和親物延。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 5.DML DML 語句 語句操作語言 INSERT UPDATE DELETE MERGE INSERT 方法:...
    喬震閱讀 942評論 0 0
  • 1.起列別名是仅父,有三種特殊情況需要加引號叛薯,以下不屬于這三種情況之一的選項是( )A.區(qū)分大小寫B(tài).含有特殊字符C....
    le_u閱讀 471評論 0 0
  • 一耗溜、上堂回顧 1.概念? 數據庫管理系統(tǒng)组力,數據庫,表? SQL的分類:DDL抖拴、DML燎字、DQL、DCL2.數據庫的使...
    WenErone閱讀 419評論 0 0
  • 主流關系型數據庫 關系型數據庫存儲數據的特點 結構化查詢語言: 數據類型: select * from emp; ...
    陳先森mansplain閱讀 684評論 0 0
  • 基本SELECT語句語法 SELECT子句 表示所需檢索的數據列城舞。 FROM子句 表示檢索的數據來自哪個表轩触。 語句...
    wqjcarnation閱讀 3,714評論 0 8