寫在最前:當你讀到這篇文章時舅柜,前提是已經(jīng)將MySQL的環(huán)境以及客戶端安裝完成(如未安裝可參考上篇文章)梭纹,并掌握了它的基礎知識。那么致份,今天我們來學習SQL語言的DQL变抽,SQL語言分別包括DQL數(shù)據(jù)查詢、DML數(shù)據(jù)操作氮块、DDL數(shù)據(jù)定義绍载、TCL事務控制。工作中最常用的是數(shù)據(jù)查詢和數(shù)據(jù)操作語言滔蝉;數(shù)據(jù)定義(建庫击儡、建表等)一般由擁有權限的開發(fā)人員或者管理人員來創(chuàng)建;事務控制語言通常在開發(fā)場景使用的更多蝠引。所以阳谍,如果你是偏業(yè)務或者數(shù)據(jù)分析方向蛀柴,重點學習前兩個就夠用。
數(shù)據(jù)準備
接下來矫夯,我們將使用員工相關的四張樣本數(shù)據(jù)表鸽疾,來學習SQL,建議你在學習過程中多動手練習训貌,理解才會更深刻制肮。表和字段含義,如下圖:
如何利用SQL語句來操作以上數(shù)據(jù)呢递沪?我們必須將樣本數(shù)據(jù)導入MySQL客戶端(如:Navicat)中豺鼻。可以在客戶端操作數(shù)據(jù)款慨,或者在終端窗口拘领。工作中經(jīng)常在客戶端操作,所以本文所有SQL語句將在Navicat中學習樱调。
首先將sql腳本保存到桌面(獲取方式:關注"Python之每日一課"公眾號,后來回復"sql基礎數(shù)據(jù)"届良,即可笆凌。),導入SQL腳本的具體操作流程如下:
1士葫、 選中本地數(shù)據(jù)庫—>點擊運行SQL文件
2乞而、 選中三個點—>選擇要執(zhí)行的SQL腳本—>打開
3、 點擊開始—>數(shù)據(jù)導入成功—>關閉
4慢显、選中庫—>右鍵刷新—>完成爪模!
現(xiàn)在數(shù)據(jù)準備完成。這里是導入sql腳本荚藻;導出同理,選擇”轉儲SQL“文件。當然了刺下,Navicat也支持將當前表或查詢結果導出Excel树埠、CSV等文件類型。
下面可以寫SQL語句了(每個sql腳本可以保存疾呻,下次直接使用)除嘹,如下:
DQL語言的學習
1、 基礎查詢
1)語法
select 要查詢的東西 【from 表名】
2)特點
類似于Python中 :print(要打印的東西)
①通過select查詢完的結果 岸蜗,是一個虛擬的表格尉咕,不是真實存在
② 要查詢的東西 可以是常量值、表達式璃岳、字段年缎、也可以是函數(shù)
3)舉栗
# 查詢常量
補充:可以給字段起別名悔捶,好處是提高可讀性,更方便理解晦款;多表連接時炎功,區(qū)分字段。用AS 或 空格來實現(xiàn)缓溅。如下:
2蛇损、 條件查詢
條件查詢:根據(jù)條件過濾原始表的數(shù)據(jù),查詢到想要的數(shù)據(jù)
1)語法
select 要查詢的字段|表達式|常量值|函數(shù)from 表where 條件;
2)分類
①條件表達式
示例:salary>10000
②邏輯表達式
示例:salary>10000 && salary<20000
③模糊查詢
# 常用關鍵字
** 3)舉栗**
# 查詢工資大于12000的員工信息
? 注意:where 一定要放到 from 后面坛怪。NULL 不是假,也不是真,而是"空"淤齐;任何運算符,判斷符碰到NULL,都得NULL;NULL的判斷只能用is null,is not null袜匿;NULL 影響查詢速度,一般避免使值為NULL更啄。exists查詢可以與in型子查詢互換,它們之間區(qū)別以后語句優(yōu)化時會詳細講解。
3居灯、 排序查詢
1)語法
select 要查詢的東西from 表名where 條件order by 排序的字段|表達式|函數(shù)|別名 【asc|desc】
2)舉栗
# 查詢員工信息祭务,要求工資從高到低排序
SELECT
*
FROM
employees
ORDER BY salary DESC;
? 注意:order by 一定要放到 語句最后(limit前面)
4、分組查詢
1)語法
select 分組函數(shù)(字段)怪嫌,字段[要求出現(xiàn)在group by后面的字段] from 表名group by 分組的字段
2)特點
①可以按單個字段分組
②和分組函數(shù)一同查詢的字段最好是分組后的字段
③分組篩選(where 和 having區(qū)別)
④可以按多個字段分組义锥,字段之間用逗號隔開
⑤可以支持排序
⑥having后可以支持別名
3)舉栗
# 簡單分組:查詢每個部門的平均薪資
SELECT
AVG(salary),
department_id
FROM
employees
GROUP BY
department_id;
# 添加篩選條件:查詢2000(包含2000)年以前入職的各部門平均工資
SELECT
department_id,
AVG(salary)
FROM
employees
WHERE hiredate <= '2000-01-01'
GROUP BY
department_id;
# 添加復雜篩選條件:查詢哪個部門的員工個數(shù)大于5,并按降序排列,取前兩個
# 思路1岩灭、先按部門分組拌倍,查詢每個部門的員工個數(shù) 2、根據(jù)1噪径、的結果進行篩選
SELECT
department_id,
COUNT(*) as num
FROM
employees
GROUP BY
department_id
HAVING num >=5
ORDER BY num DESC
LIMIT 2;
? 注意:關鍵字順序是where —>group by—>having—>order by—>limit(having不能單獨使用柱恤,需結合group by ,表示對分組后的結果進行篩選找爱;而group by 必須結合分組聚合函數(shù)一起使用梗顺,比如:count()、max()等)
5车摄、 常見函數(shù)
1)單行函數(shù)
2)分組函數(shù)
sum() 求和
max() 最大值
min() 最小值
avg() 平均值
count() 計數(shù)
3)分組函數(shù)特點
①以上五個分組函數(shù)都忽略null值荚守,除了count(*)
②sum和avg一般處理數(shù)值型,max练般、min矗漾、count可以處理任何數(shù)據(jù)類型
③都可以搭配distinct使用,用于統(tǒng)計去重后的結果
④count的參數(shù)可以支持:字段薄料、*敞贡、常量值,一般放1
6摄职、連接查詢(多表查詢)
單個表不能滿足需求時誊役,需要結合多張表获列,去除有關聯(lián)的數(shù)據(jù)。這時就需要用連接查詢蛔垢,連接查詢有三種击孩,通常join使用的最多。
1)連接方式一 :等值連接(連接條件有等號)——非等值連接(相反)
①等值連接的結果 = 多個表的交集
②多個表不分主次鹏漆,沒有順序要求
③一般為表起別名巩梢,提高閱讀性和性能
# 等值連接:查詢所有員工的姓名、工種ID艺玲、工種名稱
2)連接方式二:通過join關鍵字實現(xiàn)連接
①語法
select 字段名括蝠,
……from 表1【inner|left|right】join 表2
on 連接條件
【where 篩選條件】
【group by 分組字段】
【having 分組后的篩選條件】
【order by 排序的字段或表達式】
②好處
語句上,連接條件和篩選條件實現(xiàn)了分離饭聚,簡潔忌警。
? 注意:左右連接可互換 A left join B 等價于B right join A;內(nèi)連接是左</pre>
右連接的交集秒梳;mysql沒有外連接法绵。
# 用內(nèi)連接 實現(xiàn)查詢所有員工的姓名、工種ID酪碘、工種名稱
SELECT
a.last_name,
a.job_id,
b.job_title
FROM
employees a
INNER JOIN jobs b ON a.job_id = b.job_id;
3)連接方式三:自連接
自連接相當于等值連接朋譬,但是等值連接涉及多個表,而自連接僅僅是它自己婆跑。如下:在員工信息表里,查詢員工名和直接上級的名庭呜。
# 自連接:查詢員工名和直接上級的名
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
# 等值連接方式
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
7滑进、子查詢
一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句募谎,稱為子查詢或內(nèi)查詢扶关。在外面的查詢語句,稱為主查詢或外查詢数冬。
1)特點
①子查詢都放在小括號內(nèi)
②子查詢可以放在from后面节槐、select后面、where后面拐纱、having后面铜异,但一般放在條件的右側
③子查詢優(yōu)先于主查詢執(zhí)行,主查詢使用了子查詢的執(zhí)行結果
④子查詢根據(jù)查詢結果的行數(shù)不同分為以下兩類:
?單行子查詢
結果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
a秸架、子查詢的結果為一組值
b揍庄、子查詢的結果為空
?多行子查詢
結果集有多行
一般搭配多行操作符使用:any、all东抹、in蚂子、not in
in:屬于子查詢結果中的任意一個就行
any和all往往可以用其他查詢代替
2)舉栗
# 查詢位置ID是1700的所有部門人員信息
SELECT
first_name
FROM
employees
WHERE
department_id IN (
SELECT
department_id
FROM
departments
WHERE
location_id = 1700
)
8沃测、分頁查詢 (可選)
實際web開發(fā)中,當顯示的數(shù)據(jù)食茎,一頁顯示不完時蒂破,需要分頁提交sql請求。
1)語法
select 字段|表達式,...
from 表名
【where 條件】
【group by 分組字段】var2=value2
【having 條件】
【order by 排序的字段】
limit 【起始的索引别渔,顯示個數(shù)】;
2)特點
①起始條目索引默認從0開始
②limit子句放在查詢語句的最后
③公式:select * from 表 limit (page-1)*sizePerPage,
sizePerPage:每頁顯示條目數(shù)
page:要顯示的頁數(shù)
3)舉栗
# 查詢 員工信息前5條(0可以省略)
SELECT
*
FROM
employees
LIMIT 0,5;
# 查詢 員工信息前5-10條
SELECT
*
FROM
employees
LIMIT 5,5;
9附迷、union聯(lián)合查詢
union用于把涉及多個表的SELECT語句的結果組合到一個結果集合中。適用于查詢條件較多钠糊,多個表之間沒有連接關系的場景挟秤。</pre>
1)語法
select 字段|常量|表達式|函數(shù)
【from 表】
【where 條件】
union 【all】
select 字段|常量|表達式|函數(shù)
【from 表】
【where 條件】
union 【all】
.....
select 字段|常量|表達式|函數(shù) 【from 表】 【where 條件】
2)特點
①多條查詢語句的查詢的列數(shù)必須是一致的
②多條查詢語句的查詢的列的類型幾乎相同
③union 代表去重,union all 代表不去重
3)舉栗
# 執(zhí)行下面語句抄伍,創(chuàng)建測試數(shù)據(jù)
# 學生表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` tinyint(4) DEFAULT NULL,
`classId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES ('1', 's1', '20', '1'), ('2', 's2', '22', '1'),('3', 's3', '22', '2'), ('4', 's4', '25', '2');
# 教師表
CREATE TABLE `teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `teacher` VALUES ('1', 't1', '36'), ('2', 't2', '33'), ('3', 's3', '22');
# 查詢所有學生和教師的id艘刚,姓名,年齡
# 查詢所有學生和教師的id截珍,姓名攀甚,年齡
# UNION
SELECT id, name, age FROM student
UNION
SELECT id, name, age FROM teacher;
# UNION ALL
SELECT id, name, age FROM student
UNION ALL
SELECT id, name, age FROM teacher;
UNION 和 UNION ALL 運行結果的區(qū)別如下:
? 注意:在多個 SELECT 語句中,第一個 SELECT 語句中被使用的字段名稱將被用于結果的字段名稱岗喉。當使用 UNION 時秋度,MySQL 會把結果集中重復的記錄刪掉,而使用 UNION ALL 钱床,MySQL 會把所有的記錄返回荚斯,且效率高于 UNION
好,今天學習到這里查牌。工作中用的最多就是查詢事期。如果能消化本文涉及到的所有內(nèi)容,大概能解決80%的工作需求纸颜。本文更多的是原理介紹兽泣,例子不多,只有先知道是什么胁孙,才能知道怎么學唠倦。那么,接下來最重要的是要多練習實踐涮较。因為實際的業(yè)務場景要復雜很多稠鼻,給大家推薦兩個刷題的網(wǎng)站,力扣和趴衿保客網(wǎng)枷餐,里面有大量的sql面試題。能進一步提高我們sql的水平。這篇文章主要是SQL的常用查詢毛肋。明天繼續(xù)學習SQL的DML增刪改怨咪。一起加油!