MySQL查詢進(jìn)階多表查詢

      網(wǎng)友投稿 826 2022-05-29

      一、基本的select語句

      1.查詢常量

      2.從表中查數(shù)據(jù)

      SELECT 標(biāo)識選擇哪些列

      FROM 標(biāo)識從哪個(gè)表中選擇

      很明顯,它的意思就是說,我們要從哪一張表中查詢數(shù)據(jù)

      比如說,我們要從員工表emp中查詢所有數(shù)據(jù),

      當(dāng)然了,如果我們只是想要查詢部分?jǐn)?shù)據(jù),我們完全可以指定要查詢的字段名字

      Mysql中的SQL語句是

      不區(qū)分大小寫的

      ,因此SELECT和select的作用是相同的,但是,許多開發(fā)人員習(xí)慣將關(guān)鍵字大寫、數(shù)據(jù)列和表名小寫,讀者也應(yīng)該養(yǎng)成一個(gè)良好的編程習(xí)慣,這樣寫出來的代碼更容易閱讀和維護(hù)。

      注意:一般情況下,除非需要使用表中所有的字段數(shù)據(jù),最好不要使用通配符‘*’。使用通配符雖然可以節(jié)省輸入查詢語句的時(shí)間,但是獲取不需要的列數(shù)據(jù)通常會降低查詢和所使用的應(yīng)用程序的效率。通配符的優(yōu)勢是,當(dāng)不知道所需要的列的名稱時(shí),可以通過它獲取它們。

      在開發(fā)的時(shí)候,我們最好不要使用*來進(jìn)行查詢,你想想看,開發(fā)過程中,數(shù)據(jù)庫中的數(shù)據(jù)是不是有很多,然后如果使用通配符一下子把所有記錄查詢出來,電腦可能就直接死機(jī)了。

      3.使用列的別名查詢

      我們發(fā)現(xiàn)在進(jìn)行數(shù)據(jù)查詢的時(shí)候,有的時(shí)候字段名很長,我們寫起來也不是很方便,我們就考慮能不能通過別名來查數(shù)據(jù)呢

      方式一:列名和別名之間加上as關(guān)鍵字

      方式二:列名和別名之間用空格隔開

      注意:我們需要保證表中的字段、表名等沒有和保留字、數(shù)據(jù)庫系統(tǒng)或常用方法沖突。如果真的相同,請?jiān)赟QL語句中使用一對``(著重號)引起來。

      我們使用select語句來進(jìn)行查詢,那么查詢的結(jié)果會影響到數(shù)據(jù)庫中表的記錄嗎?

      接下來我們來看一下

      我們剛剛不是用來別名了嗎,為什么表中沒有改變呢,大家可能會有這樣的疑惑,事實(shí)上,使用select語句查詢出來的是一個(gè)

      臨時(shí)的表

      。

      你看看,我們用select查詢出來的結(jié)果,是不是和表長得很像,上面是第一行都是字段,然后下面都是數(shù)據(jù)。就相當(dāng)于是客戶端新建了一張臨時(shí)的表用來存放我們剛剛用select查詢出來的數(shù)據(jù),當(dāng)它把查詢結(jié)果顯示出來給我們看以后,內(nèi)存就釋放了,當(dāng)然不會影響硬盤中的數(shù)據(jù),。

      4.去重

      使用關(guān)鍵字distinct

      我們先來看看distinct用在單給字段上面的情況

      接下來我們來看看對多個(gè)字段進(jìn)行去重的情況

      5.空值NULL參與運(yùn)算

      所有運(yùn)算符或列值遇到null值,運(yùn)算的結(jié)果都為null

      先回顧一下表中數(shù)據(jù)

      發(fā)現(xiàn)和null運(yùn)算結(jié)果為null

      6.過濾數(shù)據(jù)

      使用where可以過濾數(shù)據(jù),篩選出我們想要選的數(shù)據(jù)

      SELECT 字段1,字段2

      FROM 表名

      WHERE 過濾條件

      補(bǔ)充一下:desc可以顯示表的結(jié)構(gòu)

      Field:表示字段名稱。

      Type:表示字段類型,這里 barcode、goodsname 是文本型的,price 是整數(shù)類型的。

      Null:表示該列是否可以存儲NULL值。

      Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示在列中某個(gè)給定值允許出現(xiàn)多次。

      Default:表示該列是否有默認(rèn)值,如果有,那么值是多少。

      Extra:表示可以獲取的與給定列有關(guān)的附加信息,例如AUTO_INCREMENT等。

      二、 運(yùn)算符

      1.算術(shù)運(yùn)算符

      2.比較運(yùn)算符

      比較運(yùn)算符用來對表達(dá)式左邊的操作數(shù)和右邊的操作數(shù)進(jìn)行比較,

      比較的結(jié)果為真則返回1,比較的結(jié)果為假則返回0,其他情況則返回NULL。

      比較運(yùn)算符經(jīng)常被用來作為SELECT查詢語句的條件來使用,返回符合條件的結(jié)果記錄。

      1.等號運(yùn)算符

      2.安全等于運(yùn)算符

      3.不等于運(yùn)算符

      空運(yùn)算符(IS NULL或者ISNULL)判斷一個(gè)值是否為NULL,如果為NULL則返回1,否則返回0。

      mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL; +--------------+--------------+-------------+-----------+ | NULL IS NULL | ISNULL(NULL) | ISNULL('a') | 1 IS NULL | +--------------+--------------+-------------+-----------+ | 1 | 1 | 0 | 0 | +--------------+--------------+-------------+-----------+

      BETWEEN運(yùn)算符使用的格式通常為SELECT D FROM TABLE WHERE C BETWEEN A AND B,此時(shí),當(dāng)C大于或等于A,并且C小于或等于B時(shí),結(jié)果為1,否則結(jié)果為0。

      IN運(yùn)算符

      IN運(yùn)算符用于判斷給定的值是否是IN列表中的一個(gè)值,如果是則返回1,否則返回0。如果給定的值為NULL,或者IN列表中存在NULL,則結(jié)果為NULL。

      LIKE運(yùn)算符主要用來匹配字符串,通常用于模糊匹配,如果滿足條件則返回1,否則返回0。如果給定的值或者匹配條件為NULL,則返回結(jié)果為NULL。

      LIKE運(yùn)算符通常使用如下通配符: “%”:匹配0個(gè)或多個(gè)字符。 “_”:只能匹配一個(gè)字符。

      3.邏輯運(yùn)算符

      邏輯非

      邏輯與

      邏輯或

      OR可以和AND一起使用,但是在使用時(shí)要注意兩者的優(yōu)先級,由于AND的優(yōu)先級高于OR,因此先對AND兩邊的操作數(shù)進(jìn)行操作,再與OR中的操作數(shù)結(jié)合。

      邏輯異或運(yùn)算符

      4.位運(yùn)算符

      位運(yùn)算符是在二進(jìn)制數(shù)上進(jìn)行計(jì)算的運(yùn)算符。位運(yùn)算符會先將操作數(shù)變成二進(jìn)制數(shù),然后進(jìn)行位運(yùn)算,最后將計(jì)算結(jié)果從二進(jìn)制變回十進(jìn)制數(shù)。

      MySQL支持的位運(yùn)算符如下:

      1.按位與運(yùn)算符

      按位與(&)運(yùn)算符將給定值對應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯與運(yùn)算。當(dāng)給定值對應(yīng)的二進(jìn)制位的數(shù)值都為1時(shí),則該位返回1,否則返回0。

      mysql> SELECT 1 & 10, 20 & 30; +--------+---------+ | 1 & 10 | 20 & 30 | +--------+---------+ | 0 | 20 | +--------+---------+ 1 row in set (0.00 sec)

      1的二進(jìn)制數(shù)為0001,10的二進(jìn)制數(shù)為1010,所以1 & 10的結(jié)果為0000,對應(yīng)的十進(jìn)制數(shù)為0。20的二進(jìn)制數(shù)為10100,30的二進(jìn)制數(shù)為11110,所以20 & 30的結(jié)果為10100,對應(yīng)的十進(jìn)制數(shù)為20。

      2. 按位或運(yùn)算符

      按位或(|)運(yùn)算符將給定的值對應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯或運(yùn)算。當(dāng)給定值對應(yīng)的二進(jìn)制位的數(shù)值有一個(gè)或兩個(gè)為1時(shí),則該位返回1,否則返回0。

      mysql> SELECT 1 | 10, 20 | 30; +--------+---------+ | 1 | 10 | 20 | 30 | +--------+---------+ | 11 | 30 | +--------+---------+ 1 row in set (0.00 sec)

      1的二進(jìn)制數(shù)為0001,10的二進(jìn)制數(shù)為1010,所以1 | 10的結(jié)果為1011,對應(yīng)的十進(jìn)制數(shù)為11。20的二進(jìn)制數(shù)為10100,30的二進(jìn)制數(shù)為11110,所以20 | 30的結(jié)果為11110,對應(yīng)的十進(jìn)制數(shù)為30。

      3. 按位異或運(yùn)算符

      按位異或(^)運(yùn)算符將給定的值對應(yīng)的二進(jìn)制數(shù)逐位進(jìn)行邏輯異或運(yùn)算。當(dāng)給定值對應(yīng)的二進(jìn)制位的數(shù)值不同時(shí),則該位返回1,否則返回0。

      mysql> SELECT 1 ^ 10, 20 ^ 30; +--------+---------+ | 1 ^ 10 | 20 ^ 30 | +--------+---------+ | 11 | 10 | +--------+---------+ 1 row in set (0.00 sec)

      1的二進(jìn)制數(shù)為0001,10的二進(jìn)制數(shù)為1010,所以1 ^ 10的結(jié)果為1011,對應(yīng)的十進(jìn)制數(shù)為11。20的二進(jìn)制數(shù)為10100,30的二進(jìn)制數(shù)為11110,所以20 ^ 30的結(jié)果為01010,對應(yīng)的十進(jìn)制數(shù)為10。

      再舉例:

      mysql> SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL; +--------+--------+--------+ | 12 & 5 | 12 | 5 | 12 ^ 5 | +--------+--------+--------+ | 4 | 13 | 9 | +--------+--------+--------+ 1 row in set (0.00 sec)

      可能這樣還是很懵,可以看看這張圖理解一下,位運(yùn)算會先把數(shù)字轉(zhuǎn)換成二進(jìn)制,然后逐位進(jìn)行運(yùn)算

      4. 按位取反運(yùn)算符

      按位取反(~)運(yùn)算符將給定的值的二進(jìn)制數(shù)逐位進(jìn)行取反操作,即將1變?yōu)?,將0變?yōu)?。

      mysql> SELECT 10 & ~1; +---------+ | 10 & ~1 | +---------+ | 10 | +---------+ 1 row in set (0.00 sec)

      由于按位取反(~)運(yùn)算符的優(yōu)先級高于按位與(&)運(yùn)算符的優(yōu)先級,所以10 & ~1,首先,對數(shù)字1進(jìn)行按位取反操作,結(jié)果除了最低位為0,其他位都為1,然后與10進(jìn)行按位與操作,結(jié)果為10。

      5. 按位右移運(yùn)算符

      按位右移(>>)運(yùn)算符將給定的值的二進(jìn)制數(shù)的所有位右移指定的位數(shù)。右移指定的位數(shù)后,右邊低位的數(shù)值被移出并丟棄,左邊高位空出的位置用0補(bǔ)齊。

      mysql> SELECT 1 >> 2, 4 >> 2; +--------+--------+ | 1 >> 2 | 4 >> 2 | +--------+--------+ | 0 | 1 | +--------+--------+ 1 row in set (0.00 sec)

      6. 按位左移運(yùn)算符

      按位左移(<<)運(yùn)算符將給定的值的二進(jìn)制數(shù)的所有位左移指定的位數(shù)。左移指定的位數(shù)后,左邊高位的數(shù)值被移出并丟棄,右邊低位空出的位置用0補(bǔ)齊。

      按位左移和上面的右移是一樣道理,這里就不說了。

      mysql> SELECT 1 << 2, 4 << 2; +--------+--------+ | 1 << 2 | 4 << 2 | +--------+--------+ | 4 | 16 | +--------+--------+ 1 row in set (0.00 sec)

      三、 排序和分頁

      1.排序

      使用order by進(jìn)行排序

      ASC(ascend): 升序

      DESC(descend):降序

      如果沒有使用排序操作,默認(rèn)情況下查詢返回的數(shù)據(jù)是按照我們添加的順序顯示。

      如果在ORDER BY后沒有顯示的指明排序順序,則默認(rèn)為升序排列。

      可以使用列的別名進(jìn)行排序。

      列的別名只能ORDER BY中使用,不能在WHERE 當(dāng)中使用來進(jìn)行篩選。

      ORDER BY的字段不一定是要查詢的字段。

      強(qiáng)調(diào)格式:WHERE 需要聲明在FROM后,ORDER BY之前。

      可以使用不在SELECT列表中的列排序。 在對多列進(jìn)行排序的時(shí)候,首先排序的第一列必須有相同的列值,才會對第二列進(jìn)行排序。如果第一列數(shù)據(jù)中所有值都是唯一的,將不再對第二列進(jìn)行排序。

      2.分頁

      使用LIMIT進(jìn)行分頁

      什么是分頁呢,我們來看一下下面的圖片,其實(shí)分頁很常見的

      我們在瀏覽器輸入要查找的數(shù)據(jù),瀏覽器就會返回一些數(shù)據(jù)給我們,當(dāng)我們點(diǎn)擊下一頁,或者是指定也是頁數(shù)的時(shí)候,它就會跳轉(zhuǎn)到相應(yīng)頁面。

      那么我們?yōu)槭裁匆M(jìn)行分頁呢,理由其實(shí)很簡單

      MySQL查詢進(jìn)階之多表查詢

      假如現(xiàn)在,我們想要查找一些信息,然后瀏覽器把所有的信息都返回給我們,那這樣的話,服務(wù)器的壓力就會很大,因?yàn)閿?shù)據(jù)很龐大,而且對于用戶來說,我們可能在前面幾條信息就已經(jīng)得到了我們想要的答案,那我們就不會浪費(fèi)時(shí)間繼續(xù)往下看。那么后面的那些數(shù)據(jù)是不是就浪費(fèi)掉了呢?而且這樣也很影響效率,速度很慢,而且你想想把所有數(shù)據(jù)返回,網(wǎng)站相應(yīng)速度就會很慢的,用戶等了好久也等不到網(wǎng)站的響應(yīng),那用戶可能就等不下去了,這樣長久以往,這個(gè)網(wǎng)站就會失去很多的用戶。

      再來舉個(gè)例子:以我們在淘寶買東西為例,我們想買東西,我們點(diǎn)擊下一頁,才返回一些物品信息給我們,我們?nèi)绻麤]有點(diǎn)擊下一頁,就沒有必要返回物品信息給我們了。

      格式:LIMIT [位置偏移量,] 行數(shù)

      第一個(gè)“位置偏移量”參數(shù)指示MySQL從哪一行開始顯示,是一個(gè)可選參數(shù),如果不指定“位置偏移量”,將會從表中的第一條記錄開始(第一條記錄的位置偏移量是0,第二條記錄的位置偏移量是1,以此類推);第二個(gè)參數(shù)“行數(shù)”指示返回的記錄條數(shù)。

      --前10條記錄: SELECT * FROM 表名 LIMIT 0,10; 或者 SELECT * FROM 表名 LIMIT 10; --第11至20條記錄: SELECT * FROM 表名 LIMIT 10,10; --第21至30條記錄: SELECT * FROM 表名 LIMIT 20,10;

      MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是獲取從第5條記錄開始后面的3條記錄,和“LIMIT 4,3;”返回的結(jié)果相同。

      分頁顯式公式 :(當(dāng)前頁數(shù)-1)*每頁條數(shù),每頁條數(shù)

      SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;

      注意:LIMIT 子句必須放在整個(gè)SELECT語句的最后!

      使用 LIMIT 的好處

      約束返回結(jié)果的數(shù)量可以減少數(shù)據(jù)表的網(wǎng)絡(luò)傳輸量,也可以提升查詢效率。如果我們知道返回結(jié)果只有 1 條,就可以使用LIMIT 1,告訴 SELECT 語句只需要返回一條記錄即可。這樣的好處就是 SELECT不需要掃描完整的表,只需要檢索到一條符合條件的記錄即可返回。

      下一篇我會更新數(shù)據(jù)庫的高級查詢,比如多表查詢,子查詢等,數(shù)據(jù)庫的CRUD語句中,最重要的就是select語句了,希望對大家有幫助

      下一篇MySQL查詢進(jìn)階

      MySQL 數(shù)據(jù)庫 面向?qū)ο缶幊?/p>

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:解密華為云FusionInsight MRS單集群2萬節(jié)點(diǎn)優(yōu)化實(shí)踐
      下一篇:內(nèi)存數(shù)據(jù)庫究竟是如何發(fā)揮內(nèi)存優(yōu)勢的?
      相關(guān)文章
      亚洲av永久无码精品网址| 国产亚洲视频在线播放| 亚洲AV无码一区二区三区在线观看| 亚洲中文字幕无码久久2020| 亚洲精品在线免费观看| 亚洲伊人tv综合网色| 亚洲av无码专区在线播放 | 综合亚洲伊人午夜网 | 亚洲色欲或者高潮影院| 亚洲精品91在线| 亚洲最大在线视频| 亚洲成人午夜电影| 亚洲av乱码一区二区三区香蕉 | 亚洲av无码不卡私人影院| 亚洲第一福利网站在线观看| 亚洲av麻豆aⅴ无码电影| 亚洲毛片av日韩av无码| 中文字幕精品亚洲无线码一区 | 亚洲欧美日韩中文字幕一区二区三区 | 久久亚洲国产精品五月天婷| 国产亚洲精品拍拍拍拍拍| 亚洲中文久久精品无码ww16| 国产成人亚洲综合色影视| 亚洲高清视频在线观看| 亚洲精品福利网泷泽萝拉| 亚洲一区二区三区在线观看蜜桃| 亚洲中文字幕一二三四区苍井空| 亚洲私人无码综合久久网| 亚洲GV天堂无码男同在线观看| 国产精品亚洲色婷婷99久久精品| 亚洲成a人片在线观看日本麻豆| 国产亚洲精品国看不卡| 精品亚洲永久免费精品| 2022年亚洲午夜一区二区福利| 亚洲国产成AV人天堂无码| 亚洲中文无码永久免费| 国产精品亚洲综合一区在线观看| 精品国产人成亚洲区| 亚洲短视频男人的影院| 亚洲三级中文字幕| 亚洲heyzo专区无码综合|