常用函數(shù)
分類
-
按使用方式分為:
- 單行函數(shù)
- 分組函數(shù)
-
按用途分為:
- 字符函數(shù)
- 數(shù)學(xué)函數(shù)
- 日期函數(shù)
- 流程控制函數(shù)
用法:
SELECT 函數(shù)(參數(shù)) FROM 表;
函數(shù)應(yīng)用
字符函數(shù)實(shí)例:
- LENGTH(str):返字符串長度,以字節(jié)為單位
mysql> select length('abc');
+---------------+
| length('abc') |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
mysql> select length('你好');
+------------------+
| length('你好') |
+------------------+
| 6 |
+------------------+
1 row in set (0.00 sec)
mysql> select name, email, length(email) from employees where name='李平';
+--------+----------------+---------------+
| name | email | length(email) |
+--------+----------------+---------------+
| 李平 | liping@tedu.cn | 14 |
+--------+----------------+---------------+
1 row in set (0.00 sec)
- CHAR_LENGTH(str): 返回字符串長度,以字符為單位
mysql> select char_length('abc');
+--------------------+
| char_length('abc') |
+--------------------+
| 3 |
+--------------------+
1 row in set (0.00 sec)
mysql> select char_length('你好');
+-----------------------+
| char_length('你好') |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.00 sec)
- CONCAT(s1,s2,...): 返回連接參數(shù)產(chǎn)生的字符串,一個或多個待拼接的內(nèi)容,任意一個為NULL則返回值為NULL
// 拼接字符串
mysql> select concat(dept_id, '-', dept_name) from departments;
+---------------------------------+
| concat(dept_id, '-', dept_name) |
+---------------------------------+
| 1-人事部 |
| 2-財(cái)務(wù)部 |
| 3-運(yùn)維部 |
| 4-開發(fā)部 |
| 5-測試部 |
| 6-市場部 |
| 7-銷售部 |
| 8-法務(wù)部 |
+---------------------------------+
8 rows in set (0.00 sec)
- UPPER(str)和UCASE(str): 將字符串中的字母全部轉(zhuǎn)換成大寫
mysql> select name, upper(email) from employees where name like '李%';
+-----------+----------------------+
| name | upper(email) |
+-----------+----------------------+
| 李玉英 | LIYUYING@TEDU.CN |
| 李平 | LIPING@TEDU.CN |
| 李建華 | LIJIANHUA@TARENA.COM |
| 李瑩 | LIYING@TEDU.CN |
| 李柳 | LILIU@TARENA.COM |
| 李慧 | LIHUI@TARENA.COM |
| 李靜 | LIJING@TARENA.COM |
| 李瑞 | LIRUI@TARENA.COM |
+-----------+----------------------+
8 rows in set (0.00 sec)
- LOWER(str)和LCASE(str):將str中的字母全部轉(zhuǎn)換成小寫
// 轉(zhuǎn)小寫
mysql> select lower('HelloWorld');
+---------------------+
| lower('HelloWorld') |
+---------------------+
| helloworld |
+---------------------+
1 row in set (0.00 sec)
- SUBSTR(s, start, length): 從子符串s的start位置開始,取出length長度的子串,位置從1開始計(jì)算
mysql> select substr('hello world', 7);
+--------------------------+
| substr('hello world', 7) |
+--------------------------+
| world |
+--------------------------+
1 row in set (0.00 sec)
// 取子串,下標(biāo)從7開始取出3個
mysql> select substr('hello world', 7, 3);
+-----------------------------+
| substr('hello world', 7, 3) |
+-----------------------------+
| wor |
+-----------------------------+
1 row in set (0.00 sec)
- INSTR(str,str1):返回str1參數(shù),在str參數(shù)內(nèi)的位置
// 子串在字符串中的位置
mysql> select instr('hello world', 'or');
+----------------------------+
| instr('hello world', 'or') |
+----------------------------+
| 8 |
+----------------------------+
1 row in set (0.00 sec)
mysql> select instr('hello world', 'ol');
+----------------------------+
| instr('hello world', 'ol') |
+----------------------------+
| 0 |
+----------------------------+
1 row in set (0.00 sec)
- TRIM(s): 返回字符串s刪除了兩邊空格之后的字符串
mysql> select trim(' hello world. ');
+--------------------------+
| trim(' hello world. ') |
+--------------------------+
| hello world. |
+--------------------------+
1 row in set (0.00 sec)
數(shù)學(xué)函數(shù)實(shí)例
- ABS(x):返回x的絕對值
mysql> select abs(-10);
+----------+
| abs(-10) |
+----------+
| 10 |
+----------+
1 row in set (0.00 sec)
- PI(): 返回圓周率π,默認(rèn)顯示6位小數(shù)
mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
1 row in set (0.00 sec)
- MOD(x,y): 返回x被y除后的余數(shù)
mysql> select mod(10, 3);
+------------+
| mod(10, 3) |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
- CEIL(x)、CEILING(x): 返回不小于x的最小整數(shù)
mysql> select ceil(10.1);
+------------+
| ceil(10.1) |
+------------+
| 11 |
+------------+
1 row in set (0.00 sec)
- FLOOR(x): 返回不大于x的最大整數(shù)
mysql> select floor(10.9);
+-------------+
| floor(10.9) |
+-------------+
| 10 |
+-------------+
1 row in set (0.00 sec)
- ROUND(x)、ROUND(x,y): 前者返回最接近于x的整數(shù),即對x進(jìn)行四舍五入;后者返回最接近x的數(shù),其值保留到小數(shù)點(diǎn)后面y位,若y為負(fù)值,則將保留到x到小數(shù)點(diǎn)左邊y位
mysql> select round(10.6666);
+----------------+
| round(10.6666) |
+----------------+
| 11 |
+----------------+
1 row in set (0.00 sec)
mysql> select round(10.6666, 2);
+-------------------+
| round(10.6666, 2) |
+-------------------+
| 10.67 |
+-------------------+
1 row in set (0.00 sec)
日期和時間函數(shù)實(shí)例
- CURDATE()、CURRENT_DATE(): 將當(dāng)前日期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2021-03-09 |
+------------+
1 row in set (0.00 sec)
mysql> select curdate() + 0;
+---------------+
| curdate() + 0 |
+---------------+
| 20210309 |
+---------------+
1 row in set (0.00 sec)
- NOW(): 返回當(dāng)前日期和時間值,格式為"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS",具體格式根據(jù)函數(shù)用在字符串或數(shù)字語境中而定
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-03-09 02:28:26 |
+---------------------+
1 row in set (0.00 sec)
mysql> select now() + 0;
+----------------+
| now() + 0 |
+----------------+
| 20210309022848 |
+----------------+
1 row in set (0.00 sec)
- UNIX_TIMESTAMP()、UNIX_TIMESTAMP(date): 前者返回一個格林尼治標(biāo)準(zhǔn)時間1970-01-01 00:00:00到現(xiàn)在的秒數(shù),后者返回一個格林尼治標(biāo)準(zhǔn)時間1970-01-01 00:00:00到指定時間的秒數(shù)
mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
| 1615275274 |
+------------------+
1 row in set (0.00 sec)
- FROM_UNIXTIME(date): 和UNIX_TIMESTAMP互為反函數(shù),把UNIX時間戳轉(zhuǎn)換為普通格式的時間
mysql> select from_unixtime(0);
+---------------------+
| from_unixtime(0) |
+---------------------+
| 1969-12-31 19:00:00 |
+---------------------+
1 row in set (0.00 sec)
- MONTH(date)和MONTHNAME(date):前者返回指定日期中的月份,后者返回指定日期中的月份的名稱
mysql> select month('20211001120000');
+-------------------------+
| month('20211001120000') |
+-------------------------+
| 10 |
+-------------------------+
1 row in set (0.00 sec)
mysql> select monthname('20211001120000');
+-----------------------------+
| monthname('20211001120000') |
+-----------------------------+
| October |
+-----------------------------+
1 row in set (0.00 sec)
- DAYNAME(d)、DAYOFWEEK(d)、WEEKDAY(d): DAYNAME(d)返回d對應(yīng)的工作日的英文名稱,如Sunday、Monday等;DAYOFWEEK(d)返回的對應(yīng)一周中的索引,1表示周日、2表示周一;WEEKDAY(d)表示d對應(yīng)的工作日索引,0表示周一,1表示周二
mysql> select dayname('20211001120000');
+---------------------------+
| dayname('20211001120000') |
+---------------------------+
| Friday |
+---------------------------+
1 row in set (0.00 sec)
mysql> select dayname('20211001');
+---------------------+
| dayname('20211001') |
+---------------------+
| Friday |
+---------------------+
1 row in set (0.00 sec)
- WEEK(d): 計(jì)算日期d是一年中的第幾周
mysql> select week('20211001');
+------------------+
| week('20211001') |
+------------------+
| 39 |
+------------------+
1 row in set (0.00 sec)
- DAYOFYEAR(d)、DAYOFMONTH(d): 前者返回d是一年中的第幾天,后者返回d是一月中的第幾天
mysql> select dayofyear('20211001');
+-----------------------+
| dayofyear('20211001') |
+-----------------------+
| 274 |
+-----------------------+
1 row in set (0.00 sec)
- YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time): YEAR(date)返回指定日期對應(yīng)的年份,范圍是1970到2069;QUARTER(date)返回date對應(yīng)一年中的季度,范圍是1到4;MINUTE(time)返回time對應(yīng)的分鐘數(shù),范圍是0~59;SECOND(time)返回制定時間的秒值
mysql> select year('20211001');
+------------------+
| year('20211001') |
+------------------+
| 2021 |
+------------------+
1 row in set (0.00 sec)
mysql> select quarter('20211001');
+---------------------+
| quarter('20211001') |
+---------------------+
| 4 |
+---------------------+
1 row in set (0.00 sec)
流程控制函數(shù)實(shí)例
- IF(expr,v1,v2): 如果expr是TRUE則返回v1,否則返回v2
mysql> select if(3>0, 'yes', 'no');
+----------------------+
| if(3>0, 'yes', 'no') |
+----------------------+
| yes |
+----------------------+
1 row in set (0.00 sec)
mysql> select name, dept_id, if(dept_id=1, '人事部', '非人事部') from employees where name='張亮';
+--------+---------+--------------------------------------------+
| name | dept_id | if(dept_id=1, '人事部', '非人事部') |
+--------+---------+--------------------------------------------+
| 張亮 | 7 | 非人事部 |
+--------+---------+--------------------------------------------+
1 row in set (0.00 sec)
- IFNULL(v1,v2): 如果v1不為NULL,則返回v1,否則返回v2
mysql> select dept_id, dept_name, ifnull(dept_name, '未設(shè)置') from departments;
+---------+-----------+--------------------------------+
| dept_id | dept_name | ifnull(dept_name, '未設(shè)置') |
+---------+-----------+--------------------------------+
| 1 | 人事部 | 人事部 |
| 2 | 財(cái)務(wù)部 | 財(cái)務(wù)部 |
| 3 | 運(yùn)維部 | 運(yùn)維部 |
| 4 | 開發(fā)部 | 開發(fā)部 |
| 5 | 測試部 | 測試部 |
| 6 | 市場部 | 市場部 |
| 7 | 銷售部 | 銷售部 |
| 8 | 法務(wù)部 | 法務(wù)部 |
+---------+-----------+--------------------------------+
8 rows in set (0.00 sec)
mysql> insert into departments(dept_id) values(9);
mysql> select dept_id, dept_name, ifnull(dept_name, '未設(shè)置') from departments;
+---------+-----------+--------------------------------+
| dept_id | dept_name | ifnull(dept_name, '未設(shè)置') |
+---------+-----------+--------------------------------+
| 1 | 人事部 | 人事部 |
| 2 | 財(cái)務(wù)部 | 財(cái)務(wù)部 |
| 3 | 運(yùn)維部 | 運(yùn)維部 |
| 4 | 開發(fā)部 | 開發(fā)部 |
| 5 | 測試部 | 測試部 |
| 6 | 市場部 | 市場部 |
| 7 | 銷售部 | 銷售部 |
| 8 | 法務(wù)部 | 法務(wù)部 |
| 9 | NULL | 未設(shè)置 |
+---------+-----------+--------------------------------+
9 rows in set (0.00 sec)
- CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END: 如果expr等于某個vn,則返回對應(yīng)位置THEN后面的結(jié)果,如果與所有值都不想等,則返回ELSE后面的rn
mysql> select dept_id, dept_name,
-> case dept_name
-> when '運(yùn)維部' then '技術(shù)部門'
-> when '開發(fā)部' then '技術(shù)部門'
-> when '測試部' then '技術(shù)部門'
-> when null then '未設(shè)置'
-> else '非技術(shù)部門'
-> end as '部門類型'
-> from departments;
+---------+-----------+-----------------+
| dept_id | dept_name | 部門類型 |
+---------+-----------+-----------------+
| 1 | 人事部 | 非技術(shù)部門 |
| 2 | 財(cái)務(wù)部 | 非技術(shù)部門 |
| 3 | 運(yùn)維部 | 技術(shù)部門 |
| 4 | 開發(fā)部 | 技術(shù)部門 |
| 5 | 測試部 | 技術(shù)部門 |
| 6 | 市場部 | 非技術(shù)部門 |
| 7 | 銷售部 | 非技術(shù)部門 |
| 8 | 法務(wù)部 | 非技術(shù)部門 |
| 9 | NULL | 非技術(shù)部門 |
+---------+-----------+-----------------+
9 rows in set (0.00 sec)
mysql> select dept_id, dept_name,
-> case
-> when dept_name='運(yùn)維部' then '技術(shù)部門'
-> when dept_name='開發(fā)部' then '技術(shù)部門'
-> when dept_name='測試部' then '技術(shù)部門'
-> when dept_name is null then '未設(shè)置'
-> else '非技術(shù)部門'
-> end as '部門類型'
-> from departments;
+---------+-----------+-----------------+
| dept_id | dept_name | 部門類型 |
+---------+-----------+-----------------+
| 1 | 人事部 | 非技術(shù)部門 |
| 2 | 財(cái)務(wù)部 | 非技術(shù)部門 |
| 3 | 運(yùn)維部 | 技術(shù)部門 |
| 4 | 開發(fā)部 | 技術(shù)部門 |
| 5 | 測試部 | 技術(shù)部門 |
| 6 | 市場部 | 非技術(shù)部門 |
| 7 | 銷售部 | 非技術(shù)部門 |
| 8 | 法務(wù)部 | 非技術(shù)部門 |
| 9 | NULL | 未設(shè)置 |
+---------+-----------+-----------------+
9 rows in set (0.00 sec)
分組函數(shù)
用于統(tǒng)計(jì),又稱為聚合函數(shù)或統(tǒng)計(jì)函數(shù)
- sum() :求和
mysql> select employee_id, sum(basic+bonus) from salary where employee_id=10 and year(date)=2018;
+-------------+------------------+
| employee_id | sum(basic+bonus) |
+-------------+------------------+
| 10 | 116389 |
+-------------+------------------+
1 row in set (0.00 sec)
- avg() :求平均值
mysql> select employee_id, avg(basic+bonus) from salary where employee_id=10 and year(date)=2018;
+-------------+------------------+
| employee_id | avg(basic+bonus) |
+-------------+------------------+
| 10 | 29097.2500 |
+-------------+------------------+
1 row in set (0.00 sec)
- max() :求最大值
mysql> select employee_id, max(basic+bonus) from salary where employee_id=10 and year(date)=2018;
+-------------+------------------+
| employee_id | max(basic+bonus) |
+-------------+------------------+
| 10 | 31837 |
+-------------+------------------+
1 row in set (0.00 sec)
- min() :求最小值
mysql> select employee_id, min(basic+bonus) from salary where employee_id=10 and year(date)=2018;
+-------------+------------------+
| employee_id | min(basic+bonus) |
+-------------+------------------+
| 10 | 24837 |
+-------------+------------------+
1 row in set (0.00 sec)
- count() :計(jì)算個數(shù)
mysql> select count(*) from departments;
+----------+
| count(*) |
+----------+
| 9 |
+----------+
1 row in set (0.00 sec)
分組查詢
在對數(shù)據(jù)表中數(shù)據(jù)進(jìn)行統(tǒng)計(jì)時,可能需要按照一定的類別分別進(jìn)行統(tǒng)計(jì)。比如查詢每個部門的員工數(shù)。
使用GROUP BY按某個字段,或者多個字段中的值,進(jìn)行分組,字段中值相同的為一組
語法格式
- 查詢列表必須是分組函數(shù)和出現(xiàn)在GROUP BY后面的字段
- 通常而言,分組前的數(shù)據(jù)篩選放在where子句中,分組后的數(shù)據(jù)篩選放在having子句中
SELECT 字段名1(要求出現(xiàn)在group by后面),分組函數(shù)(),……
FROM 表名
WHERE 條件
GROUP BY 字段名1,字段名2
HAVING 過濾條件
ORDER BY 字段;
應(yīng)用實(shí)例
- 查詢每個部門的人數(shù)
mysql> select dept_id, count(*) from employees group by dept_id;
+---------+----------+
| dept_id | count(*) |
+---------+----------+
| 1 | 8 |
| 2 | 5 |
| 3 | 6 |
| 4 | 55 |
| 5 | 12 |
| 6 | 9 |
| 7 | 35 |
| 8 | 3 |
+---------+----------+
8 rows in set (0.00 sec)
- 查詢每個部門中年齡最大的員工
mysql> select dept_id, min(birth_date) from employees group by dept_id;
+---------+-----------------+
| dept_id | min(birth_date) |
+---------+-----------------+
| 1 | 1971-08-19 |
| 2 | 1971-11-02 |
| 3 | 1971-09-09 |
| 4 | 1972-01-31 |
| 5 | 1971-08-14 |
| 6 | 1973-04-14 |
| 7 | 1971-12-10 |
| 8 | 1989-05-19 |
+---------+-----------------+
8 rows in set (0.00 sec)
- 查詢每個部門入職最晚員工的入職時間
mysql> select dept_id, max(hire_date) from employees group by dept_id;
+---------+----------------+
| dept_id | max(hire_date) |
+---------+----------------+
| 1 | 2018-11-21 |
| 2 | 2018-09-03 |
| 3 | 2019-07-04 |
| 4 | 2021-02-04 |
| 5 | 2019-06-08 |
| 6 | 2017-10-07 |
| 7 | 2020-08-21 |
| 8 | 2019-11-14 |
+---------+----------------+
8 rows in set (0.00 sec)
- 統(tǒng)計(jì)各部門使用tedu.cn郵箱的員工人數(shù)
mysql> select dept_id, count(*) from employees where email like '%@tedu.cn' group by dept_id;
+---------+----------+
| dept_id | count(*) |
+---------+----------+
| 1 | 5 |
| 2 | 2 |
| 3 | 4 |
| 4 | 32 |
| 5 | 7 |
| 6 | 5 |
| 7 | 15 |
| 8 | 1 |
+---------+----------+
8 rows in set (0.00 sec)
- 查看員工2018年工資總收入,按總收入進(jìn)行降序排列
mysql> select employee_id, sum(basic+bonus) as total from salary where year(date)=2018 group by employee_id order by total desc;
- 查詢部門人數(shù)少于10人
mysql> select dept_id, count(*) from employees where count(*)<10 group by dept_id;
ERROR 1111 (HY000): Invalid use of group function
mysql> select dept_id, count(*) from employees group by dept_id having count(*)<10;
+---------+----------+
| dept_id | count(*) |
+---------+----------+
| 1 | 8 |
| 2 | 5 |
| 3 | 6 |
| 6 | 9 |
| 8 | 3 |
+---------+----------+
5 rows in set (0.00 sec)
連接查詢
- 也叫多表查詢。常用于查詢字段來自于多張表
- 如果直接查詢兩張表,將會得到笛卡爾積
mysql> select name, dept_name from employees, departments;
- 通過添加有效的條件可以進(jìn)行查詢結(jié)果的限定
mysql> select name, dept_name from employees, departments where employees.dept_id=departments.dept_id;
連接分類
按功能分類
- 內(nèi)連接(重要)
- 等值連接
- 非等值連接
- 自連接
- 外連接
- 左外連接(重要)
- 右外連接(重要)
- 全外連接(mysql不支持,可以使用UNION實(shí)現(xiàn)相同的效果)
- 交叉連接
按年代分類
- SQL92標(biāo)準(zhǔn):僅支持內(nèi)連接
- SQL99標(biāo)準(zhǔn):支持所功能的連接
SQL99標(biāo)準(zhǔn)多表查詢
- 語法格式
SELECT 字段...
FROM 表1 [AS] 別名 [連接類型]
JOIN 表2 [AS] 別名
ON 連接條件
WHERE 分組前篩選條件
GROUP BY 分組
HAVING 分組后篩選條件
ORDER BY 排序字段
內(nèi)連接
- 語法格式
select 查詢列表
from 表1 別名
inner join 表2 別名 on 連接條件
inner join 表3 別名 on 連接條件
[where 篩選條件]
[group by 分組]
[having 分組后篩選]
[order by 排序列表]
等值連接
- 查詢每個員工所在的部門名
mysql> select name, dept_name
-> from employees
-> inner join departments
-> on employees.dept_id=departments.dept_id;
- 查詢每個員工所在的部門名,使用別名
mysql> select name, dept_name
-> from employees as e
-> inner join departments as d
-> on e.dept_id=d.dept_id;
- 查詢每個員工所在的部門名,使用別名。兩個表中的同名字段,必須指定表名
mysql> select name, d.dept_id, dept_name
-> from employees as e
-> inner join departments as d
-> on e.dept_id=d.dept_id;
- 查詢11號員工的名字及2018年每個月工資
mysql> select name, date, basic+bonus as total
-> from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id
-> where year(s.date)=2018 and e.employee_id=11;
- 查詢2018年每個員工的總工資
mysql> select name, sum(basic+bonus) from employees
-> inner join salary
-> on employees.employee_id=salary.employee_id
-> where year(salary.date)=2018
-> group by name;
- 查詢2018年每個員工的總工資,按工資升序排列
mysql> select name, sum(basic+bonus) as total from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id
-> where year(s.date)=2018
-> group by name
-> order by total;
- 查詢2018年總工資大于30萬的員工,按工資降序排列
mysql> select name, sum(basic+bonus) as total from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id
-> where year(s.date)=2018
-> group by name
-> having total>300000
-> order by total desc;
非等值連接
- 附:創(chuàng)建工資級別表
創(chuàng)建表語法:
CREATE TABLE 表名稱
(
列名稱1 數(shù)據(jù)類型,
列名稱2 數(shù)據(jù)類型,
列名稱3 數(shù)據(jù)類型,
....
)
創(chuàng)建工資級別表:
- id:主鍵。僅作為表的行號
- grade:工資級別,共ABCDE五類
- low:該級別最低工資
- high:該級別最高工資
mysql> use nsd2021;
mysql> create table wage_grade
-> (
-> id int,
-> grade char(1),
-> low int,
-> high int,
-> primary key (id)
);
向表中插入數(shù)據(jù):
- 語法:
INSERT INTO 表名稱 VALUES (值1, 值2,....);
- 向wage_grade表中插入五行數(shù)據(jù):
mysql> insert into wage_grade values
-> (1, 'A', 5000, 8000),
-> (2, 'B', 8001, 10000),
-> (3, 'C', 10001, 15000),
-> (4, 'D', 15001, 20000),
-> (5, 'E', 20001, 1000000);
- 查詢2018年12月員工基本工資級別
mysql> select employee_id, date, basic, grade
-> from salary as s
-> inner join wage_grade as g
-> on s.basic between g.low and g.high
-> where year(date)=2018 and month(date)=12;
- 查詢2018年12月員工各基本工資級別的人數(shù)
mysql> select grade, count(*)
-> from salary as s
-> inner join wage_grade as g
-> on s.basic between g.low and g.high
-> where year(date)=2018 and month(date)=12
-> group by grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
| A | 13 |
| B | 12 |
| C | 30 |
| D | 32 |
| E | 33 |
+-------+----------+
5 rows in set (0.00 sec)
- 查詢2018年12月員工基本工資級別,員工需要顯示姓名
mysql> select name, date, basic, grade
-> from employees as e
-> inner join salary as s
-> on e.employee_id=s.employee_id
-> inner join wage_grade as g
-> on s.basic between g.low and g.high
-> where year(date)=2018 and month(date)=12;
自連接
-
要點(diǎn):
- 將一張表作為兩張使用
- 每張表起一個別名
查看哪些員的生日月份與入職月份相同
mysql> select e.name, e.hire_date, em.birth_date
-> from employees as e
-> inner join employees as em
-> on month(e.hire_date)=month(em.birth_date)
-> and e.employee_id=em.employee_id;
+-----------+------------+------------+
| name | hire_date | birth_date |
+-----------+------------+------------+
| 李玉英 | 2012-01-19 | 1974-01-25 |
| 鄭靜 | 2018-02-03 | 1997-02-14 |
| 林剛 | 2007-09-19 | 1990-09-23 |
| 劉桂蘭 | 2003-10-14 | 1982-10-11 |
| 張亮 | 2015-08-10 | 1996-08-25 |
| 許欣 | 2011-09-09 | 1982-09-25 |
| 王榮 | 2019-11-14 | 1999-11-22 |
+-----------+------------+------------+
7 rows in set (0.00 sec)
外連接
常用于查詢一個表中有,另一個表中沒有的記錄
如果從表中有和它匹配的,則顯示匹配的值
如要從表中沒有和它匹配的,則顯示NULL
外連接查詢結(jié)果=內(nèi)連接查詢結(jié)果+主表中有而從表中沒有的記錄
左外連接中,left join左邊的是主表
右外連接中,right join右邊的是主表
左外連接和右外連接可互換,實(shí)現(xiàn)相同的目標(biāo)
左外連接
- 語法
SELECT tb1.字段..., tb2.字段
FROM table1 AS tb1
LEFT OUTER JOIN table2 AS tb2
ON tb1.字段=tb2.字段
- 查詢所有部門的人員以及沒有員工的部門
mysql> select d.*, e.name
-> from departments as d
-> left outer join employees as e
-> on d.dept_id=e.dept_id;
右外連接
- 語法
SELECT tb1.字段..., tb2.字段
FROM table1 AS tb1
RIGHT OUTER JOIN table2 AS tb2
ON tb1.字段=tb2.字段
- 查詢所有部門的人員以及沒有員工的部門
mysql> select d.*, e.name
-> from employees as e
-> right outer join departments as d
-> on d.dept_id=e.dept_id;
交叉連接
- 返回笛卡爾積
- 語法:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
- 查詢員工表和部門表的笛卡爾積
mysql> select name, dept_name
-> from employees
-> cross join departments;
- 附:授予管理員root可以通過任意地址訪問數(shù)據(jù)庫,密碼是NSD2021@tedu.cn。默認(rèn)情況下,root只允許在本機(jī)訪問
mysql> grant all on *.* to root@'%' identified by 'NSD2021@tedu.cn';
向部門表中插入數(shù)據(jù):
mysql> insert into departments(dept_name) values('采購部');