共計(jì) 8790 個(gè)字符,預(yù)計(jì)需要花費(fèi) 22 分鐘才能閱讀完成。
自動(dòng)寫代碼機(jī)器人,免費(fèi)開通
這篇文章將為大家詳細(xì)講解有關(guān)怎么使用 DQL 查詢數(shù)據(jù),丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
使用 DQL 查詢數(shù)據(jù)
DQL 語(yǔ)言
DQL(Data Query Language 數(shù)據(jù)查詢語(yǔ)言)
查詢數(shù)據(jù)庫(kù)數(shù)據(jù) , 如 SELECT 語(yǔ)句
簡(jiǎn)單的單表查詢或多表的復(fù)雜查詢和嵌套查詢
是數(shù)據(jù)庫(kù)語(yǔ)言中最核心, 最重要的語(yǔ)句
使用頻率最高的語(yǔ)句
SELECT 語(yǔ)法
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è)字段來(lái)分組
[HAVING] -- 過(guò)濾分組的記錄必須滿足的次要條件
[ORDER BY ...] -- 指定查詢記錄按一個(gè)或多個(gè)條件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查詢的記錄從哪條至哪條
注意 : [] 括號(hào)代表可選的 , {} 括號(hào)代表必選得
指定查詢字段
-- 查詢表中所有的數(shù)據(jù)列結(jié)果 , 采用 ** \* ** 符號(hào); 但是效率低,不推薦 .
-- 查詢所有學(xué)生信息
SELECT * FROM student;
-- 查詢指定列 (學(xué)號(hào) , 姓名)
SELECT studentno,studentname FROM student;
AS 子句作為別名
作用:
可給數(shù)據(jù)列取一個(gè)新別名
可給表取一個(gè)新別名
可把經(jīng)計(jì)算或總結(jié)的結(jié)果用另一個(gè)新名稱來(lái)代替
-- 這里是為列取別名 (當(dāng)然 as 關(guān)鍵詞可以省略)
SELECT studentno AS 學(xué)號(hào),studentname AS 姓名 FROM student;
-- 使用 as 也可以為表取別名
SELECT studentno AS 學(xué)號(hào),studentname AS 姓名 FROM student AS s;
-- 使用 as, 為查詢結(jié)果取一個(gè)新名字
-- CONCAT() 函數(shù)拼接字符串
SELECT CONCAT(姓名: ,studentname) AS 新姓名 FROM student;
DISTINCT 關(guān)鍵字的使用
作用 : 去掉 SELECT 查詢返回的記錄結(jié)果中重復(fù)的記錄 (返回所有列的值都相同) , 只返回一條
-- # 查看哪些同學(xué)參加了考試 (學(xué)號(hào)) 去除重復(fù)項(xiàng)
SELECT * FROM result; -- 查看考試成績(jī)
SELECT studentno FROM result; -- 查看哪些同學(xué)參加了考試
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重復(fù)項(xiàng) , (默認(rèn)是 ALL)
使用表達(dá)式的列
數(shù)據(jù)庫(kù)中的表達(dá)式 : 一般由文本值 , 列值 , NULL , 函數(shù)和操作符等組成
應(yīng)用場(chǎng)景 :
SELECT 語(yǔ)句返回結(jié)果列中使用
SELECT 語(yǔ)句中的 ORDER BY , HAVING 等子句中使用
DML 語(yǔ)句中的 where 條件語(yǔ)句中使用表達(dá)式
-- selcet 查詢中可以使用表達(dá)式
SELECT @@auto_increment_increment; -- 查詢自增步長(zhǎng)
SELECT VERSION(); -- 查詢版本號(hào)
SELECT 100*3-1 AS 計(jì)算結(jié)果; -- 表達(dá)式
-- 學(xué)員考試成績(jī)集體提分一分查看
SELECT studentno,StudentResult+1 AS 提分后 FROM result;
避免 SQL 返回結(jié)果中包含 . , * 和括號(hào)等干擾開發(fā)語(yǔ)言程序.
where 條件語(yǔ)句
作用:用于檢索數(shù)據(jù)表中 符合條件 的記錄
搜索條件可由一個(gè)或多個(gè)邏輯表達(dá)式組成 , 結(jié)果一般為真或假.
邏輯操作符
測(cè)試
-- 滿足條件的查詢 (where)
SELECT Studentno,StudentResult FROM result;
-- 查詢考試成績(jī)?cè)?95-100 之間的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult =95 AND StudentResult =100;
-- AND 也可以寫成
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult =95 StudentResult =100;
-- 模糊查詢 (對(duì)應(yīng)的詞: 精確查詢)
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
-- 除了 1000 號(hào)同學(xué), 要其他同學(xué)的成績(jī)
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)行比較 ;
測(cè)試:
-- 模糊查詢 between and \ like \ in \ null
-- =============================================
-- LIKE
-- =============================================
-- 查詢姓劉的同學(xué)的學(xué)號(hào)及姓名
-- like 結(jié)合使用的通配符 : % (代表 0 到任意個(gè)字符) _ (一個(gè)字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE 劉 %
-- 查詢姓劉的同學(xué), 后面只有一個(gè)字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE 劉_
-- 查詢姓劉的同學(xué), 后面只有兩個(gè)字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE 劉__
-- 查詢姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE % 嘉 %
-- 查詢姓名中含有特殊字符的需要使用轉(zhuǎn)義符號(hào) \
-- 自定義轉(zhuǎn)義符關(guān)鍵字: ESCAPE :
-- =============================================
-- IN
-- =============================================
-- 查詢學(xué)號(hào)為 1000,1001,1002 的學(xué)生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);
-- 查詢地址在北京, 南京, 河南洛陽(yáng)的學(xué)生
SELECT studentno,studentname,address FROM student
WHERE address IN ( 北京 , 南京 , 河南洛陽(yáng)
-- =============================================
-- NULL 空
-- =============================================
-- 查詢出生日期沒有填寫的同學(xué)
-- 不能直接寫 =NULL , 這是代表錯(cuò)誤的 , 用 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 對(duì)比
七種 Join:
測(cè)試
/*
如需要多張數(shù)據(jù)表的數(shù)據(jù)進(jìn)行查詢, 則可通過(guò)連接運(yùn)算符實(shí)現(xiàn)多個(gè)查詢
內(nèi)連接 inner join
查詢兩個(gè)表中的結(jié)果集中的交集
外連接 outer join
左外連接 left join
(以左表作為基準(zhǔn), 右邊表來(lái)一一匹配, 匹配不上的, 返回左表的記錄, 右表以 NULL 填充)
右外連接 right join
(以右表作為基準(zhǔn), 左邊表來(lái)一一匹配, 匹配不上的, 返回右表的記錄, 左表以 NULL 填充)
等值連接和非等值連接
-- 查詢參加了考試的同學(xué)信息 (學(xué)號(hào), 學(xué)生姓名, 科目編號(hào), 分?jǐn)?shù))
SELECT * FROM student;
SELECT * FROM result;
/* 思路:
(1): 分析需求, 確定查詢的列來(lái)源于兩個(gè)類,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é), 不考試的也會(huì)查出來(lái))
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
-- 查一下缺考的同學(xué) (左連接應(yīng)用場(chǎ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é)號(hào), 學(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)行連接
需求: 從一個(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ù)庫(kù)),
(5 , 1 , 美術(shù)設(shè)計(jì)),
(6 , 3 , web 開發(fā)),
(7 , 5 , ps 技術(shù)),
( 8 , 2 , 辦公信息
-- 編寫 SQL 語(yǔ)句, 將欄目的父子關(guān)系呈現(xiàn)出來(lái) (父欄目名稱, 子欄目名稱)
-- 核心思想: 把一張表看成兩張一模一樣的表, 然后將這兩張表連接查詢 (自連接)
SELECT a.categoryName AS 父欄目 ,b.categoryName AS 子欄目
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`
-- 思考題: 查詢參加了考試的同學(xué)信息 (學(xué)號(hào), 學(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é)員及所屬的年級(jí) (學(xué)號(hào), 學(xué)生姓名, 年級(jí)名)
SELECT studentno AS 學(xué)號(hào),studentname AS 學(xué)生姓名,gradename AS 年級(jí)名稱
FROM student s
INNER JOIN grade g
ON s.`GradeId` = g.`GradeID`
-- 查詢科目及所屬的年級(jí) (科目名稱, 年級(jí)名稱)
SELECT subjectname AS 科目名稱,gradename AS 年級(jí)名稱
FROM SUBJECT sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid
-- 查詢 數(shù)據(jù)庫(kù)結(jié)構(gòu) -1 的所有考試結(jié)果 (學(xué)號(hào) 學(xué)生姓名 科目名稱 成績(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ù)庫(kù)結(jié)構(gòu) -1
排序和分頁(yè)
測(cè)試
/*============== 排序 ================
語(yǔ)法 : ORDER BY
ORDER BY 語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序。 ORDER BY 語(yǔ)句默認(rèn)按照 ASC 升序?qū)τ涗涍M(jìn)行排序。 如果您希望按照降序?qū)τ涗涍M(jìn)行排序,可以使用 DESC 關(guān)鍵字。
-- 查詢 數(shù)據(jù)庫(kù)結(jié)構(gòu) -1 的所有考試結(jié)果 (學(xué)號(hào) 學(xué)生姓名 科目名稱 成績(jī))
-- 按成績(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ù)庫(kù)結(jié)構(gòu) -1
ORDER BY StudentResult DESC
/*============== 分頁(yè) ================
語(yǔ)法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好處 : (用戶體驗(yàn), 網(wǎng)絡(luò)傳輸, 查詢壓力)
第一頁(yè) : limit 0,5
第二頁(yè) : limit 5,5
第三頁(yè) : limit 10,5
......
第 N 頁(yè) : limit (pageNo-1)*pageSzie,pageSzie
[pageNo: 頁(yè)碼,pageSize: 單頁(yè)面顯示條數(shù)]
-- 每頁(yè)顯示 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ù)庫(kù)結(jié)構(gòu) -1
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
-- 查詢 JAVA 第一學(xué)年 課程成績(jī)前 10 名并且分?jǐn)?shù)大于 80 的學(xué)生信息 (學(xué)號(hào), 姓名, 課程名, 分?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
子查詢
/*============== 子查詢 ================
什么是子查詢?
在查詢語(yǔ)句中的 WHERE 條件子句中, 又嵌套了另一個(gè)查詢語(yǔ)句
嵌套查詢可由多個(gè)子查詢組成, 求解的方式是由里及外;
子查詢返回的結(jié)果一般都是集合, 故而建議使用 IN 關(guān)鍵字;
-- 查詢 數(shù)據(jù)庫(kù)結(jié)構(gòu) -1 的所有考試結(jié)果 (學(xué)號(hào), 科目編號(hào), 成績(jī)), 并且成績(jī)降序排列
-- 方法一: 使用連接查詢
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = 數(shù)據(jù)庫(kù)結(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ù)庫(kù)結(jié)構(gòu) -1
ORDER BY studentresult DESC;
-- 查詢課程為 高等數(shù)學(xué) -2 且分?jǐn)?shù)不小于 80 分的學(xué)生的學(xué)號(hào)和姓名
-- 方法一: 使用連接查詢
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é)號(hào)和姓名
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
-- 方法三: 使用子查詢
-- 分步寫簡(jiǎn)單 sql 語(yǔ)句, 然后將其嵌套起來(lái)
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 語(yǔ)言 -1 的前 5 名學(xué)生的成績(jī)信息 (學(xué)號(hào), 姓名, 分?jǐn)?shù))
使用子查詢, 查詢郭靖同學(xué)所在的年級(jí)名稱
*/
關(guān)于“怎么使用 DQL 查詢數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
向 AI 問(wèn)一下細(xì)節(jié)