1、資料庫概述及資料準備
1.1、SQL概述
SQL,全稱Structured Query Language,SQL用來和資料庫打交道,完成和資料庫的通信,SQL是一套標準,(90%以上的SQL都是通用的),
SQL:結構化語言,是一門標準通用的語言,SQL屬于高級語言,
SQL陳述句在執行的時候,實際上內部也會先進行編譯,然后再執行sql,(sql陳述句的編譯由DBMS完成),
1.2、什么是資料庫
資料庫,通常是一個或一組檔案,保存了一些符合特定規格的資料,資料庫對應的英文單詞是DataBase,簡稱:DB;
資料庫軟體稱為資料庫管理系統(DBMS),全稱為DataBaseManagement System,如:
Oracle、SQL Server、MySQL、Sysbase、infomix、DB2、interbase、PostgreSql,
DBMS負責執行sql陳述句,通過執行sql陳述句來操作DB當中的資料,
1.3、MySql概述
MySQL最初是由“MySQL AB”公司開發的一套關系型資料庫管理系統(RDBMS-Relational DataBaseManagement System),
2、什么是表?
表:table
表是一種結構化的檔案,可以用來存盤特定型別的資料,
一個表包括行和列:
-
行:被稱為資料/記錄(data) rows
-
列:被稱為欄位(column) cols
| 學號(int) | 姓名(varchar) | 年齡(int) |
|---|---|---|
| 110 | 張三 | 20 |
| 120 | 李四 | 21 |
每一個欄位應該包括哪些屬性?
- 欄位名、資料型別、相關的約束,
3、SQL陳述句的分類
(學習MySQL主要還是學習通用的SQL陳述句)
資料查詢語言(DQL-Data Query Language)
- 代表關鍵字:
select查詢陳述句,凡是select陳述句都是DQL,
資料操縱語言(DML-Data Manipulation Language)
- 代表關鍵字:
insert,delete,update對表中的資料進行增刪改,
資料定義語言(DDL-Data Definition Language)
- 代表關鍵字:
create,drop,alter對表結構的增刪改,
事務控制語言(TCL-Transactional Control Language)
- 代表關鍵字:
commit提交事務,rollback回滾事務,
資料控制語言(DCL-Data Control Language)
- 代表關鍵字:
grant授權,revoke撤銷權限等,
4、匯入資料(后期大家練習的時候使用這個演示的資料)
第一步:登錄mysql資料庫管理系統
dos命令視窗:
mysql -uroot -uroot
第二步:查看有哪些資料庫
show databases;
--------------------+
| Database |
+--------------------+
| bjpowernode |
| information_schema |
| mysql |
| performance_schema |
| springboot-vue |
| sys |
+--------------------+
第三步:創建屬于我們自己的資料庫
create database bjpowernode;
第四步:使用bjpowernode資料
use bjpowernode;
第五步:查看當前使用的資料庫中有哪些表?
show tables;
第六步:初始化資料
source D:\course\05-MySQL\resources\bjpowernode.sql # 盡量不要有帶中文的路徑
注意:資料初始化完成之后,通過“show tables;”查看選中資料庫中有幾張表
5、sql腳本
bjpowernode.sql,這個檔案以sql結尾,這樣的檔案被稱為“sql腳本”,
當一個檔案的擴展名是.sql,并且該檔案中撰寫了大量的sql陳述句,我們稱這樣的檔案為sql腳本,
注意:直接使用source命令可以執行sql腳本,
sql腳本中的資料量太大時,無法打開,請使用source命令完成初始化,
6、洗掉資料庫:drop database bjpowernode;
7、查看表結構
語法:desc 表名;---------------------簡單描述表結構,欄位型別
describe 表名;---------------------簡單描述表結構,欄位型別
顯示表結構,欄位型別,主鍵,是否為空等屬性,但不顯示外鍵,
desc dept;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| deptno | int(10) | NO | PRI | NULL | | 部門編號
| dname | varchar(14) | YES | | NULL | | 部門名稱
| loc | varchar(13) | YES | | NULL | | 部門位置
+--------+-------------+------+-----+---------+-------+
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 | | 部門編號
+----------+-------------+------+-----+---------+-------+
desc salgrade;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| grade | int(11) | YES | | NULL | | 工資等級
| losal | int(11) | YES | | NULL | | 最低薪資
| hisal | int(11) | YES | | NULL | | 最高薪資
+-------+---------+------+-----+---------+-------+
8、查看表格中的資料
select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SIMITH | 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 | NULL | 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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
select * from dept;
+--------+-------------+----------+
| deptno | dname | loc |
+--------+-------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCHING | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+-------------+----------+
select * from salgrade;
```shell
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 5000 |
+-------+-------+-------+
9、MySQL常用命令
9.1.1、查看mysql版本
MySQL程式選項具有以下兩種通用形式:
- 長選項,有單詞之前加兩個減號組成
C:\Users\聯想>mysql --version
mysql Ver 8.0.26 for Win64 on x86_64 (MySQL Community Server - GPL)
- 短選項,有單個字母之前加一個減號組成
C:\Users\聯想>mysql -V
mysql Ver 8.0.26 for Win64 on x86_64 (MySQL Community Server - GPL)
9.1.2、創建資料庫
create database 資料庫名稱;
9.1.3、使用資料庫/選擇資料庫
use 資料庫名稱;
在資料庫中建立表,因此創建表的時候必須要先選擇資料庫,
9.2、查詢當前使用的資料庫
select database();
查詢資料庫版本可以使用:
select version();
9.3、終止一條陳述句
如果想要終止一條正在撰寫的陳述句,可鍵入\c
9.4、退出mysql
可使用\q、QUIT或EXIT
如:
mysql>\q(crtl+c)
10、查看“演示資料”的表結構
10.1、查看和指定現有的資料庫
show databases;
10.2、指定當前預設資料庫
use bjpowernode;
10.3、查看當前庫中的表
show tables;
10.4、查看其他庫中的表
語法:
show tables form <database name>
如:查看exam庫中的表
show tables from exam;
查看bjpowernode庫中的表
show tables from bjpowernode;
查看表的結構
desc <table name>;
查看表的創建陳述句
show create table <table name>;
11、簡單的查詢
11.1、查詢一個欄位
語法格式:
select 欄位名1,欄位名2,欄位名3,... from <table name>;
查詢員工姓名
select ename from emp;
提示:
1、任何一條sql陳述句以";"結尾;
2、sql陳述句不區分大小寫,
查詢員工的年薪(欄位可以參與數學運算,)
select ename,sal * 12 from emp;
+--------+----------+
| ename | sal *12 |
+--------+----------+
| SIMITH | 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;
+--------+----------+
| ename | 年薪 |
+--------+----------+
| SIMITH | 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 ,直接加名稱, as可以省略
11.2、查詢全部欄位
selecr * from emp;# 實際開發中不建議使用*,效率較低,
12、條件查詢
語法格式:
select 欄位1,欄位2,... from <table name> where 條件;
條件查詢需要用到where陳述句,where必須放到from陳述句表的后面,
執行順序:先from,然后where,最后select,
where后面支持如下運算子:
between ... and ... 兩個值之間,等同于 >= and <=
is null 為null(is not null不為空)
and 并且
or 或者
in 包含,相當于多個or(not in不在這個范圍中)
not not可以取非,主要用在is或in中
like like稱為模糊查詢,支持%或下劃線匹配,%匹配任意個字符;下劃線_,一個下劃線只匹配一個字符
查詢工資等于5000的員工姓名?
select ename from emp where sal = 5000;
+-------+
| ename |
+-------+
| KING |
+-------+
查詢SMITH的工資?
select sal from emp where ename = 'SIMITH';# 字串使用單引號括起來
+--------+
| sal |
+--------+
| 800.00 |
+--------+
找出工資高于3000的員工?
select ename 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 ... 是閉區間
between ... and ... 在使用的時候必須要左小右大
between ... and ... 除了使用在數字方面之外,還可以使用在字串方面,對于字串來說,是左閉右開,
找出哪些人沒有津貼?在資料庫中,NULL代表一個值,代表什么也沒有,為空,
空不是一個值,不能用等號衡量,
必須使用is null或is not null
select ename,sal,comm from 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 |
+--------+---------+------+
找出哪些人津貼不為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的員工?
+--------+----------+
| ename | job |
+--------+----------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |`
+--------+----------+`
and和or聯合起來使用:找出薪資大于3000的,并且部門編號是20或者30的部門員工,
select ename,sal,deptno from emp where sal > 1000 and deptno = 20 or deptno = 30;
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| JONES | 2975.00 | 20 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| SCOTT | 3000.00 | 20 |
| TURNER | 1500.00 | 30 |
| ADAMS | 1100.00 | 20 |
| JAMES | 950.00 | 30 |
| FORD | 3000.00 | 20 |
+--------+---------+--------+
select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| JONES | 2975.00 | 20 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| SCOTT | 3000.00 | 20 |
| TURNER | 1500.00 | 30 |
| ADAMS | 1100.00 | 20 |
| FORD | 3000.00 | 20 |
+--------+---------+--------+
注意:當運算子的優先級不確定的時候加小括號,
in等同于or:找出作業崗位是MANAGER和SALESMAN的員工?
select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select ename,job from emp where job in('MANAGER','SALESMAN');
in和or不是區間,是具體的值,
select ename,sal from emp where sal in(1000,5000);
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
not in:不在這幾個值當中
select ename,job from emp where sal not in(800,5000);
+--------+----------+
| ename | job |
+--------+----------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| SCOTT | ANALYST |
| TURNER | SALESMAN |
| ADAMS | CLERK |
| JAMES | CLERK |
| FORD | ANALYST |
| MILLER | CLERK |
+--------+----------+
模糊查詢like?
找出名字當中含有O的?
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 |
+--------+
找出名字中有下劃線的?
select name from t_user where name like '%\_%';
+---------+
| name |
+---------+
| WANG_WU |
+---------+
找出名字中最后一個字母是T的?
select ename from emp where ename like '%T';
13、排序(升序,降序)
按照工資升序,找出出員工名和薪資?
注意:默認是升序,怎么指定升序或者降序呢?asc表示升序,desc表示降序,
select ename,sal from emp order by sal asc;# 升序
select ename,sal from emp order by sal desc;# 降序
select
* 3
from 1
<table name>
where
條件 2
order by 4
...
eg:
找出作業崗位是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 |
+--------+----------+---------+
order by是最后執行的
按照工資的降序排列,當工資相同的時候再按照名字的升序排列,
select ename,sal from emp order by sal desc , ename asc;
注意:越靠前的欄位越能起到主導作用,
+--------+---------+
| ename | sal |
+--------+---------+
| KING | 5000.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SIMITH | 800.00 |
+--------+---------+
14、分組函式/聚合函式/多行處理函式
count 取得記錄數
sum 求和
avg 取平均
max 取最大的數
min 取最小的數
注意:分組函式自動忽略空值,不需要手動的加where條件排除空值,
select count(*) from emp where xxx;# 符合條件的所有記錄總數,
select count(comm) from emp;# comm這個欄位中不為空的元素總數,
注意:分組函式不能直接使用在where關鍵字后面,
記住:所有的分組函式都是對“某一組”資料進行操作的,
找出工資總和?
select sum(sal) from emp;
找出最高工資?
select max(sal) from emp;
找出最低工資?
select min(sal) from emp;
找出平均工資?
select avg(sal) from emp;
找出總人數?
select count(ename) from emp;
select count(*) from emp;
分組函式一共5個,
分組函式還有另一個名字:多行處理函式,
多行處理函式的特點:輸入多行,最終輸出的結果是1行,
分組函式自動忽略NULL,
select sum(comm) from emp where comm is not null; <---> select sum(comm) from emp;
找出工資高于平均工資的員工?
select ename,sal from emp where sal > avg(sal);
# ERROR 1111 (HY000): Invalid use of group function
SQL陳述句當中有一個語法規則,分組函式不可直接使用where子句當中,
怎么解釋:
因為group by是在where執行之后才會執行的,必須先分組,再執行分組函式,
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
15、單行處理函式?
輸入一行,輸出一行,
計算每個員工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
+--------+----------+
| ename | yearsal |
+--------+----------+
| SIMITH | NULL |
| ALLEN | 22800.00 |
| WARD | 21000.00 |
| JONES | NULL |
| MARTIN | 31800.00 |
| BLAKE | NULL |
| CLARK | NULL |
| SCOTT | NULL |
| KING | NULL |
| TURNER | NULL |
| ADAMS | NULL |
| JAMES | NULL |
| FORD | NULL |
| MILLER | NULL |
+--------+----------+
使用ifnull():
select ename,(sal + ifnull(comm,0))*12 as yearsal from emp;
重點:所有資料庫都是這樣的規定的,只要有NULL參與的運算結果一定是NULL,
ifnull() 空處理函式?
ifnull(可能為NULL的資料,被當做什么處理):屬于單行處理函式,
select ename,ifnull(comm,0) as comm from emp;
+--------+---------+
| ename | comm |
+--------+---------+
| SIMITH | 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 |
+--------+---------+
count所有和count具有某個欄位的區別
即count(*)和count(具體的某個欄位)的區別:
count(*):不是統計某個欄位中資料的個數,而是統計總記錄條數,count(具體的某個欄位):統計“具體的某個欄位,如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 |
+----------+----------+-------------+----------+----------+
16、group by 和 having
group by·:按照某個欄位或者某些欄位進行分組,
having:對分組之后的資料進行再次過濾,
案例:找出每個作業崗位的最高薪資
select job, max(sal) from emp group by job;
+-----------+----------+
| job | max(sal) |
+-----------+----------+
| ANALYST | 3000.00 |
| CLERK | 1300.00 |
| MANAGER | 2975.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1600.00 |
+-----------+----------+
注意:分組函式一般都會和group by聯合使用,這也是為什么它稱為分組函式的原因,并且任何一個分組函式(count sum avg max min)都是在group by陳述句執行結束之后才會執行,
當一條sql陳述句沒有group by的話,整張表的資料會自成一組,
找出工資高于平均工資的員工?
第一步:找出平均工資
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);
select ename,job,max(sal) from emp group by job;
# ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'bjpowernode.emp.ENAME' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
# 以上在mysql當中,查詢結果是有的,但是結果沒有意義,在Oracle資料庫當中會報錯,Oracle的語法規則比mysql更嚴謹,
記住一個規則:當一條陳述句中有group by的話,select的后面只能跟分組函式和參與分組(group by修飾的欄位)的欄位,
即以上陳述句應該改為:
select job,max(sal) from emp group by job;
每個作業崗位的平均薪資?
按照作業崗位分組: group by job;
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;
+--------+-----------+----------+
| deptno | job | max(sal) |
+--------+-----------+----------+
| 10 | CLERK | 1300.00 |
| 10 | MANAGER | 2450.00 |
| 10 | PRESIDENT | 5000.00 |
| 20 | ANALYST | 3000.00 |
| 20 | CLERK | 1100.00 |
| 20 | MANAGER | 2975.00 |
| 30 | CLERK | 950.00 |
| 30 | MANAGER | 2850.00 |
| 30 | SALESMAN | 1600.00 |
+--------+-----------+----------+
having和where的選擇:
找出每個部門的最高薪資,要求顯示薪資大于2900的資料,
第一步:找出每個部門的最高薪資
select deptno, max(sal) from emp group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+----------+
第二步:找出薪資大于2900
select deptno, max(sal) from emp group by deptno having max(sal) > 2900;# 這種方式效率低
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
+--------+----------+
第二步:建議使用where代替having,效率更高,
select deptno,max(sal) from emp where sal > 2900 group by deptno;# 這種方式效率較高,建議能夠使用where過濾的盡量使用where,
因為where比group by先執行,
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
+--------+----------+
找出每個部門的平均薪資,要求顯示薪資大于2000的資料,
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 20 | 2175.000000 |
| 10 | 2916.666667 |
+--------+-------------+
where后面不能使用分組函式:
select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno;# 錯誤
這種情況下,只能使用having過濾,
17、總結一個完整的DQL陳述句怎么寫?
select 5 查出來
..
from 1 通過from查詢表
..
where 2 通過where篩選
..
group by 3 分組
..
having 4 分組后的再篩選
..
order by 6 排序
..
#SQL陳述句執行順序from、where、group by、having、select、order by、limit,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/455457.html
標籤:其他
