日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL语句中的select高级用法

發布時間:2024/9/5 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL语句中的select高级用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#轉載請聯系

為了更好的了解下面的知識點,我們先創建兩張表并插入數據。

# 學生表 +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 9 | 程坤 | 27 | 181.00 || 2 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | 12 | 靜香 | 12 | 180.00 || 4 | | | 13 | 郭靖 | 12 | 170.00 || 4 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+ #班級表 +----+------+ | id | name | +----+------+ | 1 | 1班 | | 2 | 2班 | +----+------+

?

  • as關鍵字

as關鍵字可以給表和字段起別名,可以讓表更加易讀,或者寫sql語句時更加方便。

# as 關鍵字給字段起別名,讓查詢到的表更加直觀 mysql> select name as '名字',age as '年齡' from students; +-----------+--------+ | 名字 | 年齡 | +-----------+--------+ | 小明 | 18 | | 小月月 | 18 | | 彭于晏 | 29 | | 劉德華 | 59 | | 黃蓉 | 38 | | 鳳姐 | 28 | | 王祖賢 | 18 | | 周杰倫 | 36 | | 程坤 | 27 | | 劉亦菲 | 25 | | 金星 | 33 | | 靜香 | 12 | | 郭靖 | 12 | | 周杰 | 34 | +-----------+--------+ # as 關鍵詞給表起別名 mysql> select s.name,s.age from students as s; +-----------+------+ | name | age | +-----------+------+ | 小明 | 18 | | 小月月 | 18 | | 彭于晏 | 29 | | 劉德華 | 59 | | 黃蓉 | 38 | | 鳳姐 | 28 | | 王祖賢 | 18 | | 周杰倫 | 36 | | 程坤 | 27 | | 劉亦菲 | 25 | | 金星 | 33 | | 靜香 | 12 | | 郭靖 | 12 | | 周杰 | 34 | +-----------+------+ # 上面兩個例子的用法結合使用 mysql> select s.name as '名字',s.age as '年齡' from students as s; +-----------+--------+ | 名字 | 年齡 | +-----------+--------+ | 小明 | 18 | | 小月月 | 18 | | 彭于晏 | 29 | | 劉德華 | 59 | | 黃蓉 | 38 | | 鳳姐 | 28 | | 王祖賢 | 18 | | 周杰倫 | 36 | | 程坤 | 27 | | 劉亦菲 | 25 | | 金星 | 33 | | 靜香 | 12 | | 郭靖 | 12 | | 周杰 | 34 | +-----------+--------+

?

  • distinct關鍵詞

distinct關鍵詞可以消除重復行。

mysql> select distinct gender from students; +--------+ | gender | +--------+ || || | 保密 | | 中性 | +--------+

?

  • 比較運算符
  • 等于: =
  • 大于: >
  • 大于等于: >=
  • 小于: <
  • 小于等于: <=
  • 不等于: != 或 <>
  • mysql> select * from students where age>18; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 9 | 程坤 | 27 | 181.00 || 2 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 邏輯運算符
  • and
  • or
  • not
  • 優先級:小括號 > 算術運算符 > 比較運算符 > not > and > or

    ?

    # 找出除了18歲以上女性的全部人信息 mysql> select * from students where not (age>18 and gender=''); +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 9 | 程坤 | 27 | 181.00 || 2 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | 12 | 靜香 | 12 | 180.00 || 4 | | | 13 | 郭靖 | 12 | 170.00 || 4 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 模糊查詢
  • like
  • %表示任意多個任意字符
  • _表示一個任意字符
  • # 查找姓周的全部同學 mysql> select * from students where name like '周%'; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 8 | 周杰倫 | 36 | NULL || 1 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+ # 查找姓周,且名字只有一個字的同學 mysql> select * from students where name like '周_'; +----+--------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+--------+------+--------+--------+--------+-----------+ | 14 | 周杰 | 34 | 176.00 || 5 | | +----+--------+------+--------+--------+--------+-----------+ # 查找姓名中 包含 "杰" 字的所有名字 mysql> select * from students where name like '%杰%'; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 8 | 周杰倫 | 36 | NULL || 1 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 范圍查詢
  • in用在一個非連續的范圍內
  • between ... and ...表示在一個連續的范圍內
  • # 查找id是1.3.5.7的同學 mysql> select * from students where id in (1,3,5,7); +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | +----+-----------+------+--------+--------+--------+-----------+ # 查找id為1-8的同學 mysql> select * from students where id between 1 and 8; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 8 | 周杰倫 | 36 | NULL || 1 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 空判斷
  • 判空 is null
  • 判非空 is not null
  • # 查找身高為空的同學 mysql> select * from students where height is null; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 8 | 周杰倫 | 36 | NULL || 1 | | +----+-----------+------+--------+--------+--------+-----------+ # 查找填了身高信息的女性 mysql> select * from students where height is not null and gender=2; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | | 12 | 靜香 | 12 | 180.00 || 4 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 排序
  • 將行數據按照列1進行排序,如果某些行 列1 的值相同時,則按照 列2 排序,以此類推
  • asc從小到大排列,即升序
  • desc從大到小排序,即降序
  • 默認按照列值從小到大排列(即asc關鍵字)
  • # 所有學生信息先按照年齡從大到小排序,當年齡相同時 按照身高從高到矮排序 mysql> select * from students order by age desc,height desc; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 14 | 周杰 | 34 | 176.00 || 5 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 9 | 程坤 | 27 | 181.00 || 2 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 12 | 靜香 | 12 | 180.00 || 4 | | | 13 | 郭靖 | 12 | 170.00 || 4 | | +----+-----------+------+--------+--------+--------+-----------+

    ?

    • 分頁
    select * from students limit start=0,count # start=可省略
  • 從start開始,獲取count條數據
  • start默認值為0
  • # 年齡從小到大,前6個作為第一頁 mysql> select * from students order by age asc limit 0,6; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 12 | 靜香 | 12 | 180.00 || 4 | | | 13 | 郭靖 | 12 | 170.00 || 4 | | | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | +----+-----------+------+--------+--------+--------+-----------+
    # 注意:在sql語句中limit后不可以直接加公式

    ?

    • 聚合函數
  • 聚合函數,aggregation function,又稱為組函數。默認情況下 聚合函數會對當前所在表當做一個組進行統計。
  • count(*) 計算總行數
  • max(列) 表示求此列的最大值
  • min(列)表示求此列的最小值
  • sum(列)表示求此列的和
  • avg(列)表示求此列的平均值
  • # 計算出全班同學的平均年齡 mysql> select avg(age) as '平均年齡' from students; +--------------+ | 平均年齡 | +--------------+ | 27.6429 | +--------------+

    ?

    • 分組 (第一part)
  • 所謂的分組就是將一個“數據集”劃分成若干個“小區域”,然后針對若干個“小區域”進行更精細化的處理。?
  • group by的含義:將查詢結果按照1個或多個字段進行分組,字段值相同的為一組
  • group by可用于單個字段分組,也可用于多個字段分組
  • # 性別分組 mysql> select gender from students group by gender; +--------+ | gender | +--------+ || || | 中性 | | 保密 | +--------+ # 查詢各個性別的平均年齡和平均身高,并保持兩位小數。 mysql> select gender,round(avg(age),2),round(avg(height),2) from students group by gender; +--------+-------------------+----------------------+ | gender | round(avg(age),2) | round(avg(height),2) | +--------+-------------------+----------------------+ || 32.60 | 177.75 | || 23.29 | 173.43 | | 中性 | 33.00 | 162.00 | | 保密 | 28.00 | 150.00 | +--------+-------------------+----------------------+

    ?

    • 分組 (第二part)
  • group by + group concat():group_concat(字段名)根據分組結果,使用group_concat()來放置每一個分組中某字段的集合
  • group by + having:having 條件表達式用來過濾分組結果。having作用和where類似,但having只能用于group by,而where是用來過濾表數據的。
  • # 查找各個性別分組里有哪些同學 mysql> select gender,group_concat(name) from students group by gender; +--------+-----------------------------------------------------------+ | gender | group_concat(name) | +--------+-----------------------------------------------------------+ || 彭于晏,劉德華,周杰倫,程坤,郭靖 | || 小明,小月月,黃蓉,王祖賢,劉亦菲,靜香,周杰 | | 中性 | 金星 | | 保密 | 鳳姐 | +--------+-----------------------------------------------------------+ # 按性別分組,分別統計出平均年齡超過30歲的組的性別以及姓名 mysql> select gender,avg(age),group_concat(name) from students group by gender having avg(age)>30; +--------+----------+---------------------------------------------+ | gender | avg(age) | group_concat(name) | +--------+----------+---------------------------------------------+ || 32.6000 | 彭于晏,劉德華,周杰倫,程坤,郭靖 | | 中性 | 33.0000 | 金星 | +--------+----------+---------------------------------------------+

    ?

    • 子查詢

    在一個 select 語句中,嵌入了另外一個 select 語句,那么被嵌入的 select 語句稱之為子查詢語句,外部那個select語句則稱為主查詢。

  • 標量子查詢: 子查詢返回的結果是一個數據(一行一列)
  • 列子查詢: 子查詢返回的結果是一列(一列多行)
  • 行子查詢: 子查詢返回的結果是一行(一行多列)
  • 表子查詢: 子查詢返回的結果是一個臨時表(多行多列)
  • # 標量子查詢,子查詢返回的結果是一個數據
    # 查找大于班級平均年齡的同學的信息 mysql
    > select * from students where age>(select avg(age) from students); +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 | | | 14 | 周杰 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+ # 列子查詢 子查詢返回的結果是一列 # 查找有對應班級的學生的全部信息 mysql> select * from students where cls_id in (select id from classes); +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 1 | 小明 | 18 | 180.00 || 1 | | | 2 | 小月月 | 18 | 180.00 || 2 | | | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 | | | 7 | 王祖賢 | 18 | 172.00 || 1 | | | 8 | 周杰倫 | 36 | NULL || 1 | | | 9 | 程坤 | 27 | 181.00 || 2 | | | 10 | 劉亦菲 | 25 | 166.00 || 2 | | +----+-----------+------+--------+--------+--------+-----------+ # 行子查詢 子查詢返回的結果是一行
    # 查找出年齡最大,而且身高最高的那個人。 mysql
    > select * from students where (age,height)=(select max(age),max(height) from students); Empty set (0.00 sec) # 表子查詢 子查詢返回的是一個表 # 查找學號小于6的男同學 mysql> select * from (select * from students where id<6) as a where a.gender=1; +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 3 | 彭于晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 | | +----+-----------+------+--------+--------+--------+-----------+ # 注意:子查詢返回的表是一個臨時表,所以一定要用as關鍵詞起個別名

    ?

    • 連接與自連接(參考我的另一篇博文:https://www.cnblogs.com/chichung/p/9588187.html)
    • 附錄 SQL的完整格式

    ?

    SELECT select_expr [,select_expr,...] [ FROM tb_name[JOIN 表名][ON 連接條件] [WHERE 條件判斷][GROUP BY {col_name | postion} [ASC | DESC], ...] [HAVING WHERE 條件判斷][ORDER BY {col_name|expr|postion} [ASC | DESC], ...][ LIMIT {[offset,]rowcount | row_count OFFSET offset}] ]# 精簡版 select distinct * from 表名 where .... group by ... having ... order by ... limit start,count#執行順序 from 表名 where .... group by ... select distinct * having ... order by ... limit start,count

    ?

    end~~~

    ?

    轉載于:https://www.cnblogs.com/chichung/p/9585127.html

    總結

    以上是生活随笔為你收集整理的SQL语句中的select高级用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。