使用DQL查询数据
文章目錄
- DQL語言
- ```SELECT語法```
- 制定查詢字段
- ```AS 子句作為別名```
- ```DISTINCT關(guān)鍵字的使用```
- ```使用表達(dá)式的列```
- where條件語句
- ```邏輯操作符```
- ```模糊查詢 : 比較操作符```
- 連接查詢
- ```JION```
- ```自連接```
- ```排序和分頁```
- ```子查詢```
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é)果按照哪幾個(gè)字段來分組 [HAVING] -- 過濾分組的記錄必須滿足的次要條件 [ORDER BY ...] -- 指定查詢記錄按一個(gè)或多個(gè)條件排序 [LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查詢的記錄從哪條至哪條注意 : [ ] 括號代表可選的 , { }括號代表必選的
制定查詢字段
-- 查詢表中所有的數(shù)據(jù)列結(jié)果 , 采用 **" \* "** 符號; 但是效率低,不推薦 . -- 查詢所有學(xué)生信息 SELECT * FROM student; -- 查詢指定列(學(xué)號 , 姓名) SELECT studentno,studentname FROM student;AS 子句作為別名
作用:
- 可給數(shù)據(jù)列取一個(gè)新別名
- 可給表取一個(gè)新別名
- 可把經(jīng)計(jì)算或總結(jié)的結(jié)果用另一個(gè)新名稱來代替
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á)式
- 避免SQL返回結(jié)果中包含 ’ . ’ , ’ * ’ 和括號等干擾開發(fā)語言程序.
where條件語句
作用:用于檢索數(shù)據(jù)表中 符合條件 的記錄
搜索條件可由一個(gè)或多個(gè)邏輯表達(dá)式組成 , 結(jié)果一般為真或假.
邏輯操作符
| AND 或 && | a AND b 或 a && b | 邏輯與,同時(shí)為真結(jié)果才為真 |
| OR 或 ∥\parallel∥ | a OR b 或 a∥\parallel∥b | 邏輯或,只要一個(gè)為真,則結(jié)果為真 |
| NOT 或 ! | NOT a 或 !a | 邏輯非,若操作數(shù)為假,則結(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;模糊查詢 : 比較操作符
| IS NULL | a IS NULL | 若操作符為NULL,則結(jié)果為真 |
| IS NOT NULL | a IS NOT NULL | 若操作符不為NULL,則結(jié)果為真 |
| BETWEEN | a BETWEEN b AND c | 若 a 范圍在 b 與 c 之間,則結(jié)果為真 |
| LIKE | a LIKE b | SQL 模式匹配,若a匹配b,則結(jié)果為真 |
| IN | a IN (a1,a2,a3,…) | 若 a 等于 a1,a2… 中的某一個(gè),則結(jié)果為真 |
注意:
- 數(shù)值數(shù)據(jù)類型的記錄之間才能進(jìn)行算術(shù)運(yùn)算 ;
- 相同數(shù)據(jù)類型的數(shù)據(jù)之間才能進(jìn)行比較 ;
測試:
連接查詢
JION
| INNER JOIN | 如果表中有至少一個(gè)匹配,則返回行 |
| LEFT JOIN | 即使右表中沒有匹配,也從左表中返回所有的行 |
| RIGHT JOIN | 即使左表中沒有匹配,也從右表中返回所有的行 |
測試:
自連接
/* 自連接 數(shù)據(jù)表與自身進(jìn)行連接 需求:從一個(gè)包含欄目ID , 欄目名稱和父欄目ID的表中 查詢父欄目名稱和其他子欄目名稱 */ -- 創(chuàng)建一個(gè)表 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條件子句中,又嵌套了另一個(gè)查詢語句 嵌套查詢可由多個(gè)子查詢組成,求解的方式是由里及外; 子查詢返回的結(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') )總結(jié)
- 上一篇: 豇豆米的功效与作用、禁忌和食用方法
- 下一篇: TCP(发消息:简易代码实现)