數(shù)據(jù)庫基礎篇(二)—— SQL之數(shù)據(jù)查詢

寫在最前:當你讀到這篇文章時舅柜,前提是已經(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增刪改怨咪。一起加油!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末润匙,一起剝皮案震驚了整個濱河市诗眨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孕讳,老刑警劉巖匠楚,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異厂财,居然都是意外死亡芋簿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門璃饱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來与斤,“玉大人,你說我怎么就攤上這事荚恶×么” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵谒撼,是天一觀的道長食寡。 經(jīng)常有香客問我,道長廓潜,這世上最難降的妖魔是什么抵皱? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮辩蛋,結果婚禮上呻畸,老公的妹妹穿的比我還像新娘。我一直安慰自己堪澎,他們只是感情好擂错,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布味滞。 她就那樣靜靜地躺著樱蛤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剑鞍。 梳的紋絲不亂的頭發(fā)上昨凡,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音蚁署,去河邊找鬼便脊。 笑死,一個胖子當著我的面吹牛光戈,可吹牛的內(nèi)容都是我干的哪痰。 我是一名探鬼主播遂赠,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晌杰!你這毒婦竟也來了跷睦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肋演,失蹤者是張志新(化名)和其女友劉穎抑诸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹殊,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蜕乡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梗夸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片层玲。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绒瘦,靈堂內(nèi)的尸體忽然破棺而出称簿,到底是詐尸還是另有隱情,我是刑警寧澤惰帽,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布憨降,位于F島的核電站,受9級特大地震影響该酗,放射性物質發(fā)生泄漏授药。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一呜魄、第九天 我趴在偏房一處隱蔽的房頂上張望悔叽。 院中可真熱鬧,春花似錦爵嗅、人聲如沸娇澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟庄。三九已至,卻和暖如春伪很,著一層夾襖步出監(jiān)牢的瞬間戚啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工锉试, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猫十,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像拖云,于是被迫代替她去往敵國和親贷笛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容