<form id="3hdj5"></form>

<form id="3hdj5"></form>

        <noframes id="3hdj5"><form id="3hdj5"><nobr id="3hdj5"></nobr></form>

          <form id="3hdj5"></form>

          <noframes id="3hdj5">

          mysql高階語句(一)

          mysql高階語句

          引言

          對mysql數據庫的查詢,除了基本的查詢外,有時候需要對查詢的結果集進行處理。列如只取20條數據、對查詢結果進行排序或分組等等。接下來讓我們一起來進入更深層次的學習吧!!!

          一、按照關鍵字排序

          使用select語句可以將需要的數據從 mysql 數據庫中查詢出來,如果對查詢的結果進行排序操作,可以使用 order by 語句完成排序,并且最終將排序后的結果返回給客戶。這個語句的排序不光可以針對某一個字段,也可以針對多個字段。

          ?select 字段 from 表名 order by 字段 ASC|DESC?
           
          ?ASC|DESC?
           
          ?ASC 是按照升序進行排名的,是默認的排序方式,即ASC可以省略?
           
          ?DESC 是按照降序的方式進行排序的?
           
          ?order by 也可以通過 where 子句對查詢結果進行進一步的過濾?
           
          ?可進行多字段的排序
          

          在這里插入圖片描述
          在這里插入圖片描述

          1.1 單字段排序

          在這里插入圖片描述
          在這里插入圖片描述

          1.1.1 按分數排序,默認不指定是升序和降序排列

          select * from info order by score; (asc默認省略)
          
          select * from info order by score desc;
          

          在這里插入圖片描述

          1.1.2 結合where進行條件過濾,篩選地址是shanghai的學生按分數降序排列

          select * from info where address=’shanghai’ order by score desc;
          

          在這里插入圖片描述

          1.2 多字段排序

          ORDER BY語句也可以使用多個字段來進行排序,當排序的第一個字段相同的記錄有多條的情況下,這些多條的記錄再按照第二個字段進行排序,ORDER BY后面跟多個字段時,字段之間使用英文逗號隔開,優先級是按先后順序而定,但order by之后的第一個參數只有在出現相同值時,第二個字段才有意義。

          1.2.1 查詢學生信息先按興趣id升序排列,相同分數的,id按降序排列

          select * from info order by hobbid,id desc;
          

          在這里插入圖片描述

          1.2.2 查詢學生信息先按興趣id升序排列,相同分數的,id按升序排列

          select * from info order by hobbid,id;
          

          在這里插入圖片描述

          1.3 區間判斷及查詢不重復記錄

          1.3.1 AND/OR ——且/或的使用

          select * from info where score>70 and score<=90;
           
          select * from info where score>70 or score<=90;
          

          在這里插入圖片描述
          在這里插入圖片描述

          1.3.2 嵌套/多條件

          select * from info where score>70 or (score>75 and score <90);
           
          select * from info where score>70 and (score>75 and score <90);
          

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          1.4 distinct 查詢不重復記錄

          select distinct 字段 from 表名﹔
           
           distinct 必須放在最開頭
           
           distinct 只能使用需要去重的字段進行操作
           
           distinct 去重多個字段時,含義是:幾個字段同時重復時才能被過濾,會默認按左邊第一個字段為依據。
          
          select distinct hobbid info;
          

          在這里插入圖片描述

          1.4.1 查看hobbid有多少種

          select distinct hobbid from info;
          

          在這里插入圖片描述
          在這里插入圖片描述

          二、對結果進行分組

          通過 SQL 查詢出來的結果,還可以對其進行分組,使用 GROUP BY 語句來實現 ,GROUP BY通常都是結合聚合函數一起使用的,常用的聚合函數包括:計數(COUNT)、求和(SUM)、求平均數(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分組的時候可以按一個或多個字段對結果進行分組處理。

          select 字段,聚合函數 from 表名 (where 字段名(匹配) 數值) group by 字段名;
          

          2.1 按hobbid相同的分組,計算相同分數的學生個數(基于name個數進行計數)

          在這里插入圖片描述

          2.2 結合where語句,篩選分數大于等于70的分組,計算學生個數

          在這里插入圖片描述
          在這里插入圖片描述

          全班同學成績表
          count(name):計數  score 分數 :
           
          score>=80 :優秀
          score >=60 and score <80 :優
           
          結合order by把分數按降序排列
          select count(name),score from info where score > 80 group by score oeder by score desc;
          

          2.3 連接查詢

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          2.3.1 inner join(等值相連)

          只返回兩個表中聯結字段相等的行

          SELECT * FROM students A INNER JOIN scores B on A.stuid = B.stuid;
          

          在這里插入圖片描述
          在這里插入圖片描述

          2.3.2 left join(左聯接)

          返回包括左表中的所有記錄和右表中聯結字段相等的記錄
          左連接也可以被稱為左外連接,在from子句中使用left join 或者 left outer join 關鍵字來表示。左連接以左側表為基礎表,接收左表的所有行,并用這些行與右側參考表中記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行。

          select * from scores A left join students B on A.stuid = B.stuid;
          

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          左連接中左表的記錄將會全部表示出來,而右表只會顯示符合搜索條件的記錄,右表記錄不足的地方均為`null。`
          

          2.3.3 right join(右聯接)

          select * from scores A right join students B on A.stuid = B.stuid;
          

          在這里插入圖片描述

          2.3.4 null值

          null值與空值的區別(空氣與真空)

          null,不占空間
          空字符和0,占用空間
          is null無法判斷空值
          空值使用"=“或者”<>"來處理(!=)
          count()計算時,NULL會忽略,空值會加入計算
          

          三、限制結果條目

          limit 限制輸出的結果記錄

          在使用 MySQL SELECT 語句進行查詢時,結果集返回的是所有匹配的記錄(行)。有時候僅需要返回第一行或者前幾行,這時候就需要用到LIMIT 子句

          (1)語法

          select 字段 from 表名 limit [offset,] number
           
          limit 的第一個參數是位置偏移量(可選參數),是設置 mysql 從哪一行開始
           
          如果不設定第一個參數,將會從表中的第一條記錄開始顯示。
           
          第一條偏移量是0,第二條為1
           
          offset 為索引下標
           
          number 為索引下標后的幾位
          

          3.1 查詢所有信息顯示前2行記錄

          select * from info limit 2;

          在這里插入圖片描述

          3.2 從第5行開始,往后顯示3行內容

          select * from info limit 4,3;

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          3.3 查詢某個單獨的行的記錄

          在這里插入圖片描述

          3.4 結合order by語句,按id的大小升序排列顯示前三行

          select * from info order by id limit 3;

          在這里插入圖片描述

          ?四、設置別名(alias ——》as)

          在 MySQL 查詢時,當表的名字比較長或者表內某些字段比較長時,為了方便書寫或者多次使用相同的表,可以給字段列或表設置別名。使用的時候直接使用別名,簡潔明了,增強可讀性。

          (1)語法

          對于列的別名:SELECT column_name AS alias_name FROM table_name;
          對于表的別名:SELECT column_name(s) FROM table_name AS alias_name;

          在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 語句是可選的。AS 之后的別名,主要是為表內的列或者表提供臨時的名稱,在查詢過程中使用,庫內實際的表名 或字段名是不會被改變的。

          列別名設置示例:
          select name as 姓名,score as 成績 from info;
          

          如果表的長度比較長,可以使用 AS 給表設置別名,在查詢的過程中直接使用別名
          臨時設置info的別名為i

          select i.name as 姓名,i.score as 成績 from info as i;
          

          使用場景:

          1、對復雜的表進行查詢的時候,別名可以縮短查詢語句的長度
          
          2、多表相連查詢的時候(通俗易懂、減短sql語句)
          

          4.1 查詢info表的字段數量,以number顯示

          mysql> select count(*) as number from info;

          在這里插入圖片描述
          在這里插入圖片描述

          4.2 AS 還可以作為連接語句的操作符

          創建tab1表,將info表的查詢記錄全部插入t1表
          create table info_bak as select * from info;

          在這里插入圖片描述
          此處AS起到的作用:

          1、創建了一個新表t1 并定義表結構,插入表數據(與info表相同)
          
          2、但是”約束“沒有被完全”復制“過來 #但是如果原表設置了主鍵,那么附表的:default字段會默認設置一個0
          

          相似:

          克隆、復制表結構
          
          create table t1 (select * from info);
          
          #也可以加入where 語句判斷
          
          create table test1 as select * from info where score >=60;
          

          在為表設置別名時,要保證別名不能與數據庫中的其他表的名稱沖突。

          列的別名是在結果中有顯示的,而表的別名在結果中沒有顯示,只在執行查詢時使用。

          在這里插入圖片描述
          在這里插入圖片描述

          五、通配符 like

          通配符主要用于替換字符串中的部分字符,通過部分字符的匹配將相關結果查詢出來。

          • 通常通配符都是跟LIKE 一起使用的,并協同 WHERE!
          • 子句共同來完成查詢任務。常用的通配符有兩個,分別是:
            • %:百分號表示零個、或者多個字符
            • _:下劃線表示單個字符
          通配符含義
          %表示零個,一個或者多個字符
          _下劃線表示單個字符
          A_Z所有以A開頭 Z 結尾的字符串 ‘ABZ’ ‘ACZ’ 'ACCCCZ’不在范圍內 下劃線只表示一個字符 AZ 包含a空格z
          ABC%所有以ABC開頭的字符串 ABCD ABCABC
          %CBA所有以CBA結尾的字符串 WCBA CBACBA
          %AN%所有包含AN的字符串 los angeles
          _AN%所有 第二個字母為 A 第三個字母 為N 的字符串

          5.1 查詢名字以y開頭的記錄

          select id,name from 表名 where name like ‘%y’;

          在這里插入圖片描述

          5.2 查詢具體到某個的字段

          在這里插入圖片描述

          5.3 查詢名字中間有g的

          select id ,name from info where name like ‘%g%’;

          在這里插入圖片描述

          5.4 查詢ma后面的3個字符的名字記錄

          select id ,name from info where name like ‘ma___’;

          在這里插入圖片描述

          5.5 查看以z開頭的字段(模糊查詢)

          在這里插入圖片描述
          在這里插入圖片描述

          六、子查詢

          子查詢也被稱作為內查詢或者嵌套查詢,是指在一個查詢語句里面還嵌套著另一個查詢語句。子查詢語句是先于主查詢語句被執行的,其結果作為外層的條件返回給主查詢進行子阿姨不得查詢過濾。

          PS:子語句可以與主語句所查詢的表相同,也可以是不同的表。
          相同表實例:select name,score from info where id in (select id from info where score >80);
          主語句:select name,score from info where id;
          子語句(集合):select id from info where score >80;
          PS:子語句中的sql語句是為了最后過濾出一個結果集,用于主語句的判斷條件
          ** in:將主表和字表關聯、連接的語法

          子查詢:

          select name,age from ky19 where id in (select id from ky19 where age>20);

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          多表查詢

          select id,name,score from info where id in(select * from ky19);

          在這里插入圖片描述

          子查詢不僅可以在select語句中使用,在inert、update、delete中也可以同樣適用。在嵌套的時候,子查詢內部還可以再次嵌套新的子查詢,也就是說可以多層嵌套。

          語法:<表達式> 【not】 IN <子查詢> ;
          

          當表達式與子查詢返回的結果集中的某個值相等時,返回true,否則返回false。若啟用了not關鍵字,則返回值相反。需要注意的是,子查詢只能返回一列數據,如果需求比較復雜,一列解決不了問題,可以使用多層嵌套的方式來應對,多數情況下,子查詢都是與select語句一起使用的。

          6.1克隆表的兩種方式

          • 一種是通過like
          • 另一種通過子查詢

          在這里插入圖片描述

          6.2 多表查詢

          select id,name,score from info where id in (select id from ky19);

          在這里插入圖片描述

          6.3 update語句也可以使用子查詢

          update內的子查詢,在set更新內容時,可以是單獨的一列,也可以是多列。
          

          update info set score=55 where id in (select * from ky20 where id =2);

          在這里插入圖片描述
          not in:表示取反

          update info set score=100 where id not in (select * from ky20 where id>1);

          在這里插入圖片描述

          6.4 delete 也適用于子查詢

          刪除分數大于等于80的記錄
          delete from info where id in (select id where score>=80)

          在這里插入圖片描述
          在IN前面還可以添加not,其作用于IN相反,表示否定(即不在子查詢的結果集里面)

          刪除分數不大于等于80的記錄
          delete from info where id not in (select id where score>=80)

          在這里插入圖片描述

          6.5 exists關鍵字也用于子查詢

          主要用于**判斷子查詢的結果集是否為空**。如果不為空,則返回true,反之,則返回false。

          查詢如果存在分數等于80的記錄則計算info的字段數
          select count(*) number from t1 where exists (select id from t1 where score=80);
          

          在這里插入圖片描述

          6.6 結果集

          將結果集作為一張表進行查詢的時候,我們也需要用到別名。

          **實例:** 從info表中的id和name字段的內容作為“內容”,輸出id的部分
          select a.id from (select id,name from info) a;
          select 表.字段 ,字段 from 表;
          

          在這里插入圖片描述

          七、mysql視圖

          7.1 視圖定義

          • 數據庫中的虛擬表,這張虛擬表中不包含真實數據,只是做了真實數據的映射。
          • 視圖可以理解為鏡花水月/倒影,動態保存結果集(數據)
          • 基礎表info ----》映射(投影)-----視圖
          #語法:
          CREATE VIEW "視圖表名" AS "SELECT 語句";
          

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          7.2 作用場景(圖)

          針對不同的 人(權限身份),提供不同結果集的“表”(以表格的形式展示)。
          

          作用范圍:

          select * from info; #展示的部分是info表 select * from view_name; # 展示的一張或多張表

          功能:

          • 簡化查詢結果集、靈活查詢、可以針對不同用戶呈現不同結果集、相對有更高的安全性。
          • 本質而言,視圖是一種select(結果集的呈現)

          PS:

          • 視圖適合于多表連接瀏覽時使用!不適合增刪改
          • 而存儲過程適用于使用較頻繁的sql語句,這樣可以提高執行效率!

          7.3 視圖案例

          #示例1:創建視圖表,表名為new_students,數據是跟在as后面的select語句,scores表的別名為a,students表的別名為b;將a表和b表等值連接,連接字段為stuid,將a表的score和stuid列顯示到新表中為score和stuid;將b表中的name列顯示到新表為name
          create view new_students as select a.score score,a.stuid stuid,b.name
          name from scores a inner join students b on a.stuid=b.stuid;

          #刪除視圖 drop view new_students;

          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述
          在這里插入圖片描述

          7.4 視圖和表的區別和聯系

          7.4.1 視圖和表的區別

            1、視圖是已經編譯好的sql語句。而表不是   
            2、視圖沒有實際的物理記錄。而表有。
            3、表是內容,視圖是窗口
            4、表只用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時四對它進行修改,但視圖只能有創建的語句來修改
            5、表是內模式,試圖是外模式
            6、視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL語句的集合。從安全的角度說,視圖可以不給用戶接觸數據表,從而不知道表結構。
            7、表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表。 
            8、視圖的建立和刪除只影響視圖本身,不影響對應的基本表。
            9、不能對視圖進行update或者insert into操作。
          

          7.4.2 視圖和表的聯系

          視圖(view)是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有數據行)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本表的抽象和在邏輯意義上建立的新關系。

          那要視圖有什么用?

          1、當一個查詢你需要頻頻的作為子查詢使用時,視圖可以簡化代碼,直接調用而不是每次都去重復寫這個東西,有點高級語言中的封裝的意思吧。
          2、其實視圖還有很多其他的用處,比如說你是一個系統的數據庫管理員,你需要給他人提供一張表的某兩列數據,而不希望他可以看到其他任何數據,這樣你就可以給他建一個只有這兩列數據的視圖,然后把視圖公布給他。
          常用視圖的場合應該就上述兩處了,至少我經常在這兩種情況下使用視圖,其他地方用視圖的還真不多。
          

          總結

          介紹了一些高階語句在數據表或者數據庫里面的用法!!

          評論 7 您還未登錄,請先 登錄 后發表或查看評論

          “相關推薦”對你有幫助么?

          • 非常沒幫助
          • 沒幫助
          • 一般
          • 有幫助
          • 非常有幫助
          提交
          ??2022 CSDN 皮膚主題:數字20 設計師:CSDN官方博客 返回首頁

          打賞作者

          寶貝富貴豬

          你的鼓勵是我最大的動力

          ¥2 ¥4 ¥6 ¥10 ¥20
          輸入1-500的整數
          余額支付 (余額:-- )
          掃碼支付
          掃碼支付:¥2
          獲取中
          掃碼支付

          您的余額不足,請更換掃碼支付或充值

          打賞作者

          實付
          使用余額支付
          點擊重新獲取
          掃碼支付
          錢包余額 0

          抵扣說明:

          1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
          2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

          余額充值
          狠狠激情五月丁香免费视频