MySQL04:使用DQL查詢數(shù)據(jù)

DQL語言

DQL( Data Query Language 數(shù)據(jù)查詢語言 )

  • 查詢數(shù)據(jù)庫數(shù)據(jù) , 如SELECT語句

  • 簡單的單表查詢或多表的復(fù)雜查詢和嵌套查詢

  • 是數(shù)據(jù)庫語言中最核心,最重要的語句

  • 使用頻率最高的語句

SELECT語法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
  [left | right | inner join table_name2]  -- 聯(lián)合查詢
  [WHERE ...]  -- 指定結(jié)果需滿足的條件
  [GROUP BY ...]  -- 指定結(jié)果按照哪幾個字段來分組
  [HAVING]  -- 過濾分組的記錄必須滿足的次要條件
  [ORDER BY ...]  -- 指定查詢記錄按一個或多個條件排序
  [LIMIT {[offset,]row_count | row_countOFFSET offset}];
   -- 指定查詢的記錄從哪條至哪條

注意 : [ ] 括號代表可選的 , { }括號代表必選得

指定查詢字段

-- 查詢表中所有的數(shù)據(jù)列結(jié)果 , 采用 **" \* "** 符號; 但是效率低,不推薦 .

-- 查詢所有學(xué)生信息
SELECT * FROM student;

-- 查詢指定列(學(xué)號 , 姓名)
SELECT studentno,studentname FROM student;

AS 子句作為別名

作用:

  • 可給數(shù)據(jù)列取一個新別名

  • 可給表取一個新別名

  • 可把經(jīng)計(jì)算或總結(jié)的結(jié)果用另一個新名稱來代替

-- 這里是為列取別名(當(dāng)然as關(guān)鍵詞可以省略)
SELECT studentno AS 學(xué)號,studentname AS 姓名 FROM student;

-- 使用as也可以為表取別名
SELECT studentno AS 學(xué)號,studentname AS 姓名 FROM student AS s;

-- 使用as,為查詢結(jié)果取一個新名字
-- CONCAT()函數(shù)拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT關(guān)鍵字的使用

作用 : 去掉SELECT查詢返回的記錄結(jié)果中重復(fù)的記錄 ( 返回所有列的值都相同 ) , 只返回一條

--  查看哪些同學(xué)參加了考試(學(xué)號) 去除重復(fù)項(xiàng)
SELECT * FROM result; -- 查看考試成績
SELECT studentno FROM result; -- 查看哪些同學(xué)參加了考試
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重復(fù)項(xiàng) , (默認(rèn)是ALL)

使用表達(dá)式的列

數(shù)據(jù)庫中的表達(dá)式 : 一般由文本值 , 列值 , NULL , 函數(shù)和操作符等組成

應(yīng)用場景 :

  • SELECT語句返回結(jié)果列中使用

  • SELECT語句中的ORDER BY , HAVING等子句中使用

  • DML語句中的 where 條件語句中使用表達(dá)式

  -- selcet查詢中可以使用表達(dá)式
SELECT @@auto_increment_increment; -- 查詢自增步長
SELECT VERSION(); -- 查詢版本號
SELECT 100*3-1 AS 計(jì)算結(jié)果; -- 表達(dá)式

-- 學(xué)員考試成績集體提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;
  • 避免SQL返回結(jié)果中包含 ' . ' , ' * ' 和括號等干擾開發(fā)語言程序.

where條件語句

作用:用于檢索數(shù)據(jù)表中 符合條件 的記錄

搜索條件可由一個或多個邏輯表達(dá)式組成 , 結(jié)果一般為真或假.

邏輯操作符

圖片

測試

-- 滿足條件的查詢(where)
SELECT Studentno,StudentResult FROM result;

-- 查詢考試成績在95-100之間的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;

-- AND也可以寫成 &&
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 && StudentResult<=100;

-- 模糊查詢(對應(yīng)的詞:精確查詢)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;

-- 除了1000號同學(xué),要其他同學(xué)的成績
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;

-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

模糊查詢 :比較操作符

圖片

注意:

  • 數(shù)值數(shù)據(jù)類型的記錄之間才能進(jìn)行算術(shù)運(yùn)算 ;

  • 相同數(shù)據(jù)類型的數(shù)據(jù)之間才能進(jìn)行比較 ;

測試:

-- 模糊查詢 between and \ like \ in \ null

-- =============================================
-- LIKE
-- =============================================
-- 查詢姓劉的同學(xué)的學(xué)號及姓名
-- like結(jié)合使用的通配符 : % (代表0到任意個字符) _ (一個字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '劉%';

-- 查詢姓劉的同學(xué),后面只有一個字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '劉_';

-- 查詢姓劉的同學(xué),后面只有兩個字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '劉__';

-- 查詢姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%嘉%';

-- 查詢姓名中含有特殊字符的需要使用轉(zhuǎn)義符號 '\'
-- 自定義轉(zhuǎn)義符關(guān)鍵字: ESCAPE ':'

-- =============================================
-- IN
-- =============================================
-- 查詢學(xué)號為1000,1001,1002的學(xué)生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);

-- 查詢地址在北京,南京,河南洛陽的學(xué)生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛陽');

-- =============================================
-- NULL 空
-- =============================================
-- 查詢出生日期沒有填寫的同學(xué)
-- 不能直接寫=NULL , 這是代表錯誤的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;

-- 查詢出生日期填寫的同學(xué)
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

-- 查詢沒有寫家庭住址的同學(xué)(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;

連接查詢

JOIN 對比

圖片

七種Join:

圖片

測試

/*
連接查詢
   如需要多張數(shù)據(jù)表的數(shù)據(jù)進(jìn)行查詢,則可通過連接運(yùn)算符實(shí)現(xiàn)多個查詢
內(nèi)連接 inner join
   查詢兩個表中的結(jié)果集中的交集
外連接 outer join
   左外連接 left join
       (以左表作為基準(zhǔn),右邊表來一一匹配,匹配不上的,返回左表的記錄,右表以NULL填充)
   右外連接 right join
       (以右表作為基準(zhǔn),左邊表來一一匹配,匹配不上的,返回右表的記錄,左表以NULL填充)
       
等值連接和非等值連接

自連接
*/

-- 查詢參加了考試的同學(xué)信息(學(xué)號,學(xué)生姓名,科目編號,分?jǐn)?shù))
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,確定查詢的列來源于兩個類,student result,連接查詢
(2):確定使用哪種連接查詢?(內(nèi)連接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno

-- 右連接(也可實(shí)現(xiàn))
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno

-- 等值連接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno

-- 左連接 (查詢了所有同學(xué),不考試的也會查出來)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno

-- 查一下缺考的同學(xué)(左連接應(yīng)用場景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL

-- 思考題:查詢參加了考試的同學(xué)信息(學(xué)號,學(xué)生姓名,科目名,分?jǐn)?shù))
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

自連接

/*
自連接
   數(shù)據(jù)表與自身進(jìn)行連接

需求:從一個包含欄目ID , 欄目名稱和父欄目ID的表中
    查詢父欄目名稱和其他子欄目名稱
*/

-- 創(chuàng)建一個表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主題id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主題名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

-- 插入數(shù)據(jù)
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES('2','1','信息技術(shù)'),
('3','1','軟件開發(fā)'),
('4','3','數(shù)據(jù)庫'),
('5','1','美術(shù)設(shè)計(jì)'),
('6','3','web開發(fā)'),
('7','5','ps技術(shù)'),
('8','2','辦公信息');

-- 編寫SQL語句,將欄目的父子關(guān)系呈現(xiàn)出來 (父欄目名稱,子欄目名稱)
-- 核心思想:把一張表看成兩張一模一樣的表,然后將這兩張表連接查詢(自連接)
SELECT a.categoryName AS '父欄目',b.categoryName AS '子欄目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

-- 思考題:查詢參加了考試的同學(xué)信息(學(xué)號,學(xué)生姓名,科目名,分?jǐn)?shù))
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

-- 查詢學(xué)員及所屬的年級(學(xué)號,學(xué)生姓名,年級名)
SELECT studentno AS 學(xué)號,studentname AS 學(xué)生姓名,gradename AS 年級名稱
FROM student s
INNER JOIN grade g
ON s.`GradeId` = g.`GradeID`

-- 查詢科目及所屬的年級(科目名稱,年級名稱)
SELECT subjectname AS 科目名稱,gradename AS 年級名稱
FROM SUBJECT sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid

-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號 學(xué)生姓名 科目名稱 成績)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1'

排序和分頁

測試

/*============== 排序 ================
語法 : ORDER BY
   ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進(jìn)行排序导帝。
   ORDER BY 語句默認(rèn)按照ASC升序?qū)τ涗涍M(jìn)行排序堪唐。
   如果您希望按照降序?qū)τ涗涍M(jìn)行排序眶掌,可以使用 DESC 關(guān)鍵字。
   
*/

-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號 學(xué)生姓名 科目名稱 成績)
-- 按成績降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1'
ORDER BY StudentResult DESC

/*============== 分頁 ================
語法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好處 : (用戶體驗(yàn),網(wǎng)絡(luò)傳輸,查詢壓力)

推導(dǎo):
   第一頁 : limit 0,5
   第二頁 : limit 5,5
   第三頁 : limit 10,5
   ......
   第N頁 : limit (pageNo-1)*pageSzie,pageSzie
   [pageNo:頁碼,pageSize:單頁面顯示條數(shù)]
   
*/

-- 每頁顯示5條數(shù)據(jù)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

-- 查詢 JAVA第一學(xué)年 課程成績前10名并且分?jǐn)?shù)大于80的學(xué)生信息(學(xué)號,姓名,課程名,分?jǐn)?shù))
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一學(xué)年'
ORDER BY StudentResult DESC
LIMIT 0,10

子查詢

/*============== 子查詢 ================
什么是子查詢?
   在查詢語句中的WHERE條件子句中,又嵌套了另一個查詢語句
   嵌套查詢可由多個子查詢組成,求解的方式是由里及外;
   子查詢返回的結(jié)果一般都是集合,故而建議使用IN關(guān)鍵字;
*/

-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號,科目編號,成績),并且成績降序排列
-- 方法一:使用連接查詢
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '數(shù)據(jù)庫結(jié)構(gòu)-1'
ORDER BY studentresult DESC;

-- 方法二:使用子查詢(執(zhí)行順序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '數(shù)據(jù)庫結(jié)構(gòu)-1'
)
ORDER BY studentresult DESC;

-- 查詢課程為 高等數(shù)學(xué)-2 且分?jǐn)?shù)不小于80分的學(xué)生的學(xué)號和姓名
-- 方法一:使用連接查詢
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等數(shù)學(xué)-2' AND StudentResult>=80

-- 方法二:使用連接查詢+子查詢
-- 分?jǐn)?shù)不小于80分的學(xué)生的學(xué)號和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

-- 在上面SQL基礎(chǔ)上,添加需求:課程為 高等數(shù)學(xué)-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '高等數(shù)學(xué)-2'
)

-- 方法三:使用子查詢
-- 分步寫簡單sql語句,然后將其嵌套起來
SELECT studentno,studentname FROM student WHERE studentno IN(
   SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
       SELECT subjectno FROM `subject` WHERE subjectname = '高等數(shù)學(xué)-2'
  )
)

/*
練習(xí)題目:
   查 C語言-1 的前5名學(xué)生的成績信息(學(xué)號,姓名,分?jǐn)?shù))
   使用子查詢,查詢郭靖同學(xué)所在的年級名稱
*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末由桌,一起剝皮案震驚了整個濱河市突勇,隨后出現(xiàn)的幾起案子健芭,更是在濱河造成了極大的恐慌奸汇,老刑警劉巖施符,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往声,死亡現(xiàn)場離奇詭異擂找,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浩销,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門贯涎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慢洋,你說我怎么就攤上這事塘雳。” “怎么了普筹?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵败明,是天一觀的道長。 經(jīng)常有香客問我太防,道長妻顶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮讳嘱,結(jié)果婚禮上幔嗦,老公的妹妹穿的比我還像新娘。我一直安慰自己沥潭,他們只是感情好邀泉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钝鸽,像睡著了一般汇恤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拔恰,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天屁置,我揣著相機(jī)與錄音,去河邊找鬼仁连。 笑死蓝角,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饭冬。 我是一名探鬼主播使鹅,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昌抠!你這毒婦竟也來了患朱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤炊苫,失蹤者是張志新(化名)和其女友劉穎裁厅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侨艾,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡执虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唠梨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袋励。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖当叭,靈堂內(nèi)的尸體忽然破棺而出茬故,到底是詐尸還是另有隱情,我是刑警寧澤蚁鳖,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布磺芭,位于F島的核電站,受9級特大地震影響醉箕,放射性物質(zhì)發(fā)生泄漏钾腺。R本人自食惡果不足惜甘邀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垮庐。 院中可真熱鬧松邪,春花似錦、人聲如沸哨查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒亥。三九已至邮府,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溉奕,已是汗流浹背褂傀。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留加勤,地道東北人仙辟。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像鳄梅,于是被迫代替她去往敵國和親叠国。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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