DQL查詢數(shù)據(jù)

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ù)庫)
  1. 指定查詢字段

    SELECT 字段 FROM 表名; -- 特定字段
    SELECT * FROM 表名; -- 所有
    SELECT 字段 AS 別名 FROM 表名 AS 別名;-- 表和字段的別名
    SELECT CONCAT(字段,字符串) AS 新字段名 FROM 表名; -- 給查詢結(jié)果添加字符串
    

    語法:SELECT 字段, ... FROM 表名,表內(nèi)可以通過AS起別名

  2. 去重復(fù)

    SELECT DISTINCT 唯一性的字段 FROM 表名; --去重復(fù)來查詢,去除SELECT語句中查詢重復(fù)的結(jié)果
    
  3. 數(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)變量

  4. 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 條件 [邏輯(與或非)] 條件...
    
  1. 模糊查詢

    本質(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;
    
  1. 聯(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í)朦促,onwhere 條件的區(qū)別如下:

  1. on 條件是在生成臨時(shí)表時(shí)使用的條件,它不管 on 中的條件是否為真血当,但是在建立臨時(shí)表的時(shí)候會(huì)按照on條件來建立禀忆。

  2. where 條件是在臨時(shí)表生成好后,再對臨時(shí)表進(jìn)行過濾的條件离熏。這時(shí)已經(jīng)沒有 left join 的含義(必須返回左邊表的記錄)了戴涝,條件不為真的就全部過濾掉。

  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)鍵字钝满。
  • 在查詢的后面通過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ù)行)懂扼,頁面大小
  1. 嵌套子查詢

在子句中添加查詢子句,如

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'
  )
)
  1. 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();     /*用戶*/
  1. 聚合函數(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(*)效率較高疙渣。

  1. 數(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加密后的字符串
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喉悴,一起剝皮案震驚了整個(gè)濱河市箕肃,隨后出現(xiàn)的幾起案子今魔,更是在濱河造成了極大的恐慌,老刑警劉巖吟宦,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涩维,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜗侈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叫倍,“玉大人豺瘤,你說我怎么就攤上這事坐求。” “怎么了桥嗤?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵泛领,是天一觀的道長。 經(jīng)常有香客問我绰更,道長锡宋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮役首,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊崭。我一直安慰自己杰赛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布根时。 她就那樣靜靜地躺著蛤迎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪校辩。 梳的紋絲不亂的頭發(fā)上辆童,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音故黑,去河邊找鬼庭砍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诗轻,可吹牛的內(nèi)容都是我干的揭北。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫉柴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夯尽,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤匙握,失蹤者是張志新(化名)和其女友劉穎陈轿,沒想到半個(gè)月后秦忿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛾娶,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛔琅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辜窑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寨躁。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朽缎,死狀恐怖谜悟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情最筒,我是刑警寧澤蔚叨,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布蔑水,位于F島的核電站邢锯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搀别。R本人自食惡果不足惜丹擎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歇父。 院中可真熱鬧蒂培,春花似錦、人聲如沸榜苫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垂睬。三九已至媳荒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肺樟,已是汗流浹背檐春。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留么伯,地道東北人疟暖。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像田柔,于是被迫代替她去往敵國和親俐巴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361