MySQL 使用DQL命令查詢數(shù)據(jù)的實(shí)現(xiàn)方法
本篇文章博主將帶大家一起學(xué)習(xí)MySQL中常用的數(shù)據(jù)查詢語言。
DQL(Data Query Language 數(shù)據(jù)查詢語言)
SELECT 語法
SELECT [ALL | DISTINCT] { * | table.* | [table.field1 [as alias1][,table.field2] [as alias2][,...]]} FROM table_name [as table_alias] [left | out | inner join table_name2] #聯(lián)合查詢 [WHERE ...] #指定結(jié)果需要滿足的條件 [GROUP BY ...] #指定結(jié)果按照哪幾個字段來分組 [HAVING ...] #過濾分組的記錄必須滿足的次要條件 [ODER BY ...] #指定查詢記錄按一個或者多個條件排序 [LIMIT [偏移量,返回結(jié)果記錄數(shù)]; #指定查詢的記錄從哪條至哪條
基本查詢語句&AS
以下例子用student表中的數(shù)據(jù)。
查詢表中所有數(shù)據(jù)列結(jié)果,采用 “*” 符號,效率低
select * from student;
可指定查詢列,效率高
select StudentName,Phone from student;
AS 子句的作用和用法
注意:AS 可省略不寫
(1)可給數(shù)據(jù)列取一個新別名
select StudentName as '學(xué)生姓名' from student;
(2)給表取別名
select stu.address from student as stu;
(3)可把計(jì)算或總結(jié)的結(jié)果用另一個新名稱來代替
SELECT Phone +1 AS Tel FROM student;
DISTINCT 關(guān)鍵字
作用:去掉SELECT查詢出來的重復(fù)值(當(dāng)所有返回值都相同時,只返回一條記錄)
語法:
SELECT DISTINCT 字段名1,字段名2,... from 表名
注意:ALL 關(guān)鍵字是默認(rèn)的,返回所有記錄,與之相反
當(dāng)過濾多列重復(fù)值時,只有當(dāng)選擇過濾的列都存在重復(fù)值才進(jìn)行過濾
SELECT DISTINCT StudentNo,address from student;
過濾單列:查詢學(xué)生表中的地址
SELECT DISTINCT address from student;
SQL語句中的表達(dá)式
SELECT VERSION(),100*3 as 乘積; #返回Mysql 版本和計(jì)算結(jié)果 SELECT NOW() '當(dāng)前時間'; #返回當(dāng)前時間
避免SQL返回結(jié)果中包含“.” ,“*”,和括號等干擾開發(fā)語言程序
SELECT VERSION() as MySQL_V,12.3*100 as expression; #返回結(jié)果不會與后臺開發(fā)程序發(fā)生混淆
拼接 CONCAT
SELECT CONCAT(studentName,'@.com') as Email from student;
數(shù)值類型相加
select StudentNo+100 from student;
比較運(yùn)算符&通配符
where條件語句:用于檢索數(shù)據(jù)表中符合條件的記錄
搜索條件可以由一個或多個邏輯表達(dá)式組成,結(jié)果一般為真或假
搜索條件的組成:邏輯操作符、比較操作符
#where 條件語句 select * from student where address='四川'; #查詢學(xué)生表中電話號碼不為空的學(xué)員姓名 select StudentName from student where Phone is not null; #查詢學(xué)生表中電話號碼為空的學(xué)員姓名 select StudentName from student where Phone is null; #查詢剛刪掉的數(shù)據(jù)——空值 select StudentName from student where Phone = ''; # BETWEEN AND 適用于時間范圍
邏輯操作符
比較操作符
使用 LIKE 關(guān)鍵字進(jìn)行模糊查詢
- 與“%”一起使用,表示匹配0個或任意個字符
- 與“_”一起使用 表示匹配單個字符
#查詢學(xué)生表中姓張*的學(xué)生姓名 SELECT StudentName from student where studentname like '張_'; SELECT StudentName from student where studentname like '%麗%'; # IN SELECT * from student where Address in ('四川','上海');
注意:
- 數(shù)值數(shù)據(jù)類型的記錄之間才能進(jìn)行算數(shù)運(yùn)算
- 相同的數(shù)據(jù)類型的數(shù)據(jù)之間才能進(jìn)行比較
NULL
- null 代表“無值”
- 區(qū)別于零值0和空字符串“ ”
- 只能出現(xiàn)在定義允許為NULL的字段
- 須使用 IS NULL 或 IS NOT NULL 比較操作符去比較
內(nèi)連接&自查詢
如果需要多張數(shù)據(jù)表的數(shù)據(jù)進(jìn)行查詢,則可以通過連接運(yùn)算符實(shí)現(xiàn)多個查詢。
分類包括:
- 內(nèi)連接(inner jion):
- 等值和非等值的連接查詢
- 自身連接查詢
- 外連接(out jion)
- 左連接(LEFT JION)
- 右連接(RIGHT JION)
ORDER BY 排序查詢
對select 語句查詢得到的結(jié)果,按某些字段進(jìn)行排序
與DESC(降序)或ASC(升序)搭配使用,默認(rèn)為ASC
以subject表和grade表數(shù)據(jù)為例:
SELECT * from subject ORDER BY classhour; #升序 SELECT * from subject ORDER BY classhour desc; #降序
多字段排序:先按照第一個字段排序,再按照第二個字段排序。如果第一個字段數(shù)據(jù)相同,再按照第二個字段排序。
SELECT * from subject ORDER BY classHour,GradeID;
LIMIT分頁
LIMIT [m,] n 或 LIMIT n OFFSET m
限制SELECT返回結(jié)果的行數(shù)
m為第一個返回記錄行的偏移量
n返回記錄行的數(shù)目
注意:
- m不指定,則偏移量為0,從第一條開始返回前n條記錄
- LIMIT 常用于分頁顯示
- 如果超出表中數(shù)據(jù),則顯示全部
例如:
SELECT * FROM grade LIMIT 3; #返回前3條記錄 SELECT * FROM grade LIMIT 1,3; #返回2~4條記錄
總記錄數(shù):total
SELECT COUNT(subjectNO) '總數(shù)據(jù)' from subject;
總頁數(shù):int totalPage = total % pagesize ==0 ? total / pagesize : total / pagesize + 1
子查詢
在查詢語句WHERE 條件子句中,又嵌套了另外一個查詢語句
注意:子查詢返回的結(jié)果一般是集合,建議使用IN關(guān)鍵字
SELECT subjectName from subject where gradeID IN (SELECT GradeID from grade);
聚合函數(shù)
常用的統(tǒng)計(jì)函數(shù):COUNT()、SUM()、AVG()、MAX()、MIN()
SELECT COUNT(StudentNo) '總數(shù)據(jù)' FROM student; SELECT sum(classHour) '總學(xué)時'from subject; SELECT AVG(classHour) '平均學(xué)時' FROM subject; SELECT MAX(classHour) '最長學(xué)時' FROM subject; SELECT MIN(classHour) '最短學(xué)時' FROM subject;
分組 GROUP BY
使用 GROUP BY 關(guān)鍵字對查詢結(jié)果分組
- 對所有的數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)
- 分組的字段可以有多個,并依次分組
- 與 HAVING 結(jié)合使用,進(jìn)行分組后的數(shù)據(jù)篩選
以 student 表為例
(1)對student 表按照地址分組統(tǒng)計(jì) group by
SELECT Address,COUNT(Address) FROM student GROUP BY Address;
HAVING 過濾分組的記錄必須滿足的次要條件
(2)對 student 表 按照地址分組,滿足地址=1的 HAVING
SELECT GROUP_CONCAT(StudentName),COUNT(Address) FROM student GROUP BY Address HAVING COUNT(Address)=1;
合并 UNION 、UNION
- ALLUNION #合并完全相同數(shù)據(jù)
- UNION ALL #合并所有數(shù)據(jù)
注意:合并兩張表時,列數(shù)必須一樣才能合并。
兩表列數(shù)不同時,會報以下錯誤:
[SQL]SELECT * FROM grade UNION SELECT * FROM student;
[Err] 1222 - The used SELECT statements have a different number of columns
(1)合并 subject 表和 student表
SELECT * FROM subject UNION SELECT * FROM student; SELECT * FROM subject UNION ALL SELECT * FROM student;
子查詢 EXISTS ——>true false
EXISTS / NOT EXISTS 子查詢條件成立則顯示父查詢的結(jié)果,否則不顯示結(jié)果
(1)子查詢條件為真 (grade 表中 gradeid 1~5,存在 1)
SELECT subjectName,GradeID FROM subject WHERE EXISTS (SELECT * FROM grade WHERE GradeID=1);
或
SELECT subjectName,GradeID FROM subject WHERE NOT EXISTS (SELECT * FROM grade WHERE GradeID=999);
(2)子查詢條件為假 (grade 表中 gradeid 1~5,不存在 999)
SELECT subjectName,GradeID FROM subject WHERE EXISTS (SELECT * FROM grade WHERE GradeID=999);
或
SELECT subjectName,GradeID FROM subject WHERE NOT EXISTS (SELECT * FROM grade WHERE GradeID=1);
子查詢(any & all)
ANY :判斷條件中,若子查詢中任意一個值滿足條件,則執(zhí)行父查詢
ALL :判斷條件中,若子查詢中所有值滿足條件,則執(zhí)行父查詢
(1)滿足條件:存在 subject.gradeid >= grade.gradeid ,執(zhí)行父查詢
SELECT subjectname,gradeid FROM subject WHERE GradeID >=ANY (SELECT GradeID FROM grade);
(2)不滿足條件:所有subject.gradeid >= grade.gradeid ,不執(zhí)行父查詢
SELECT subjectname,gradeid FROM subject WHERE GradeID >=ALL (SELECT GradeID FROM grade);
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql使用全文索引(FullText?index)的實(shí)例代碼
使用索引時數(shù)據(jù)庫性能優(yōu)化的必備技能之一,下面這篇文章主要給大家介紹了關(guān)于Mysql使用全文索引(FullText?index)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04macOS 下的 MySQL 8.0.17 安裝與簡易配置教程圖解
這篇文章主要介紹了macOS 下的 MySQL 8.0.17 安裝與簡易配置教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09MySQL啟動報錯:Starting MySQL.. ERROR! The se
這篇文章給大家介紹了MySQL啟動報錯:Starting MySQL.. ERROR! The server quit without updating PID file的問題分析和解決辦法,文中給出了詳細(xì)的原因分析,需要的朋友可以參考下2023-12-12