DQL查詢數(shù)據(jù)
Data Query Language
MySQL文檔地址:
5.7 https://dev.mysql.com/doc/refman/5.7/en/
8.0 https://dev.mysql.com/doc/refman/8.0/en/
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}]; -- 指定查詢的記錄從哪條至哪條 SELECT 去重 要查詢的字段 FROM 表 -- 表和字段可以取別名 xxx JOIN 要連接的表 ON 等值判斷 WHERE 具體的值,子查詢語句 GROUP BY 通過那個(gè)字段來分組 HAVING 過濾分組后的信息访得,類似where子句 ORDER BY 通過那個(gè)字段排序 DESC -- 默認(rèn)升序ASC 降序?yàn)镈ESC LIMIT 開始數(shù)據(jù)的所在行,頁面行數(shù) -- 業(yè)務(wù)層面:查詢(跨表悍抑,跨數(shù)據(jù)庫)
-
指定查詢字段
SELECT 字段 FROM 表名; -- 特定字段 SELECT * FROM 表名; -- 所有 SELECT 字段 AS 別名 FROM 表名 AS 別名;-- 表和字段的別名 SELECT CONCAT(字段,字符串) AS 新字段名 FROM 表名; -- 給查詢結(jié)果添加字符串
語法:
SELECT 字段, ... FROM 表名
,表內(nèi)可以通過AS
起別名 -
去重復(fù)
SELECT DISTINCT 唯一性的字段 FROM 表名; --去重復(fù)來查詢,去除SELECT語句中查詢重復(fù)的結(jié)果
-
數(shù)據(jù)庫的列
SELECT VERSION() -- 查詢系統(tǒng)版本 (函數(shù)) SELECT 100*3-1 AS 計(jì)算結(jié)果 -- 計(jì)算表達(dá)式(表達(dá)式) SELECT @@auto_increment_increment -- 查詢自增的步長(變量)
可以獲取數(shù)據(jù)庫中的文本值搜骡、列、NULL记靡、函數(shù)摸吠、表達(dá)式、系統(tǒng)變量
-
Where
條件字句寸痢,用于檢索數(shù)據(jù)中符合條件的值邏輯運(yùn)算符
運(yùn)算符 語法 描述 and && a and b a&&b 邏輯與 or || a or b a||b 邏輯或 not 啼止! not a !a 邏輯非 SELECT 屬性 FROM 表名 WHERE 條件 [邏輯(與或非)] 條件...
-
模糊查詢
本質(zhì)是比較運(yùn)算符
運(yùn)算符 語法 描述 IS NULL * IS NULL 如果*為NULL,返回true IS NOT NULL * IS NOT NULL 如果*不為NULL滓窍,返回true 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,a3...里面杠园,結(jié)果為真 -- 模糊查詢 between and \ like \ in \ null -- ============================================= -- LIKE -- ============================================= -- 查詢姓劉的同學(xué)的學(xué)號及姓名 -- 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)義符號 '\' -- 自定義轉(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 , 這是代表錯(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;
-
聯(lián)表查詢
JOIN
sql-join.png
笛卡兒積 join
自然連接 nature join
內(nèi)連接 inner join
- 查詢兩個(gè)表中的結(jié)果集中的交集
外連接 outer join
左外連接 left join
- 以左表作為基準(zhǔn),右邊表來一一匹配,匹配不上的,返回左表的記錄,右表以NULL填充)
右外連接 right join
- 以右表作為基準(zhǔn),左邊表來一一匹配,匹配不上的,返回右表的記錄,左表以NULL填充
等值連接和非等值連接
- 指的是where子句是=連接連個(gè)屬性還是不等的判斷符(如 >)連接兩個(gè)屬性
自連接
- 自己和自己連接陈醒,把一張表拆封為兩張表
SQL JOIN 中 on 與 where 的區(qū)別
數(shù)據(jù)庫在通過連接兩張或多張表來返回記錄時(shí)瞧甩,都會(huì)生成一張中間的臨時(shí)表,然后再將這張臨時(shí)表返回給用戶爷辙。
在使用 left jion 時(shí)朦促,on 和 where 條件的區(qū)別如下:
on 條件是在生成臨時(shí)表時(shí)使用的條件,它不管 on 中的條件是否為真血当,但是在建立臨時(shí)表的時(shí)候會(huì)按照on條件來建立禀忆。
where 條件是在臨時(shí)表生成好后,再對臨時(shí)表進(jìn)行過濾的條件离熏。這時(shí)已經(jīng)沒有 left join 的含義(必須返回左邊表的記錄)了戴涝,條件不為真的就全部過濾掉。
- 分頁和排序
語法 : ORDER BY
- ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進(jìn)行排序。
- ORDER BY 語句默認(rèn)按照ASC升序?qū)τ涗涍M(jìn)行排序郑什。
- 如果您希望按照降序?qū)τ涗涍M(jìn)行排序蒲肋,可以使用 DESC 關(guān)鍵字钝满。
- 在查詢的后面通過
ORDER BY 屬性
獲得按照指定屬性的查詢結(jié)果語法 :
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好處 : (用戶體驗(yàn),網(wǎng)絡(luò)傳輸,查詢壓力)推導(dǎo):
- 第一頁 : limit 0,5(顯示0申窘、1、2碎捺、3贷洲、4的數(shù)據(jù))
- 第二頁 : limit 5,5(顯示5优构、6、7钦椭、8、9的數(shù)據(jù))
- 第三頁 : limit 10,5(顯示10侥锦、11漫仆、12、13署照、14的數(shù)據(jù))
- ......
- 第N頁 : limit (pageNo-1)*pageSzie,pageSzie
- [pageNo:頁碼,pageSize:單頁面顯示條數(shù)]
(開始索引,頁面大小)
吗浩,所以下一頁從開始索引+1
開始
SELECT ... FROM ...
WHERE ...
ORDER BY 排序的屬性 DESC -- 通過指定屬性排序
LIMIT x,y -- LIMIT 起始位置(數(shù)據(jù)行)懂扼,頁面大小
- 嵌套子查詢
在子句中添加查詢子句,如
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' ) )
- MySQL函數(shù)
5.7 文檔地址:
https://dev.mysql.com/doc/refman/5.6/en/function-reference.html
-- 數(shù)學(xué)運(yùn)算
ABS() -- 絕對值
CEILING() -- 向上取整
FLOOR() -- 向下取整
RAND() -- 返回0-1的隨機(jī)數(shù)
SIGN() -- 判斷一個(gè)數(shù)的符號赶熟,復(fù)數(shù)-1陷嘴,整數(shù)1
-- 字符串函數(shù)
CHAR_LENGTH(''); /*返回字符串包含的字符數(shù)*/
CONCAT('我','愛','程序'); /*合并字符串,參數(shù)可以有多個(gè)*/
INSERT('我愛編程helloworld',1,2,'超級熱愛'); /*替換字符串,從某個(gè)位置開始替換某個(gè)長度*/
LOWER(''); /*小寫*/
UPPER(''); /*大寫*/
LEFT('hello,world',5); /*從左邊截取*/
RIGHT('hello,world',5); /*從右邊截取*/
REPLACE('','',''); /*替換字符串*/
SUBSTR('',,) /*截取字符串,開始和長度*/
REVERSE(''); /*反轉(zhuǎn)
-- 查詢姓周的同學(xué),改成鄒
-- SELECT REPLACE(studentname,'周','鄒') AS 新名字
-- FROM student WHERE studentname LIKE '周%';
-- 日期和時(shí)間函數(shù)
CURRENT_DATE(); /*獲取當(dāng)前日期*/
CURDATE(); /*獲取當(dāng)前日期*/
NOW(); /*獲取當(dāng)前日期和時(shí)間*/
LOCALTIME(); /*獲取當(dāng)前日期和時(shí)間*/
SYSDATE(); /*獲取當(dāng)前日期和時(shí)間*/
-- 獲取年月日,時(shí)分秒
YEAR(NOW());
MONTH(NOW());
DAY(NOW());
HOUR(NOW());
MINUTE(NOW());
SECOND(NOW());
-- 系統(tǒng)信息函數(shù)
VERSION(); /*版本*/
USER(); /*用戶*/
- 聚合函數(shù)
通過結(jié)合GOURP BY灾挨,從而獲取按照分組之后的函數(shù)結(jié)果
函數(shù)名稱 | 描述 |
---|---|
COUNT() |
返回滿足Select條件的記錄總和數(shù)竹宋,如 select count(*) 【不建議使用 *地技,效率低】 |
SUM() |
返回?cái)?shù)字字段或表達(dá)式列作統(tǒng)計(jì)莫矗,返回一列的總和。 |
AVG() |
通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì)趣苏,返回一列的平均值 |
MAX() |
可以為數(shù)值字段食磕,字符字段或表達(dá)式列作統(tǒng)計(jì),返回最大的值彬伦。 |
MIN() |
可以為數(shù)值字段单绑,字符字段或表達(dá)式列作統(tǒng)計(jì),返回最小的值搂橙。 |
GROUP BY
分組区转,分組后的聚集函數(shù)結(jié)果只有一個(gè)值
GROUP BY 分組依據(jù)字段
Having
過濾分組后的數(shù)據(jù)
HAVING 條件
count()
從含義上講吧享,
count(1)
與count(*)
都表示對全部數(shù)據(jù)行的查詢艰躺。
count(字段)
會(huì)統(tǒng)計(jì)該字段在表中出現(xiàn)的次數(shù)蜻韭,忽略字段為null 的情況。即不統(tǒng)計(jì)字段為null 的記錄肖方。
count(*)
包括了所有的列俯画,相當(dāng)于行數(shù),在統(tǒng)計(jì)結(jié)果的時(shí)候烹骨,包含字段為null 的記錄材泄;
count(1)
用1代表代碼行,在統(tǒng)計(jì)結(jié)果的時(shí)候峦树,包含字段為null 的記錄 旦事。很多人認(rèn)為
count(1)
執(zhí)行的效率會(huì)比count(*)
高,原因是count(*)
會(huì)存在全表掃描谷遂,而count(1)
可以針對一個(gè)字段進(jìn)行查詢卖鲤。其實(shí)不然,count(1)
和count(*)
都會(huì)對全表進(jìn)行掃描集晚,統(tǒng)計(jì)所有記錄的條數(shù)区匣,包括那些為null的記錄,因此莲绰,它們的效率可以說是相差無幾铸屉。而count(字段)
則與前兩者不同,它會(huì)統(tǒng)計(jì)該字段不為null的記錄條數(shù)顷啼。下面它們之間的一些對比:
1)在表沒有主鍵時(shí)昌屉,
count(1)
比count(*)
快
2)有主鍵時(shí),主鍵作為計(jì)算條件躬厌,count(主鍵)
效率最高;
3)若表格只有一個(gè)字段鸿捧,則count(*)
效率較高疙渣。
- 數(shù)據(jù)庫加密
MD5簡介
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致泼菌。是計(jì)算機(jī)廣泛使用的雜湊算法之一(又譯摘要算法啦租、哈希算法),主流編程語言普遍已有MD5實(shí)現(xiàn)焊刹。將數(shù)據(jù)(如漢字)運(yùn)算為另一固定長度值内地,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2非凌、MD3和MD4荆针。
md5() -- md5函數(shù),返回一個(gè)md5加密后的字符串