133 MySQL單表查詢

1、單表查詢

1.1 語法

  • 每次查詢出來的一些記錄,他們都是一張表,只不過這張表是存在內存中的
  • 查詢記錄若是想要二次利用的話,能夠給這些查出來的表記錄起一個別名
  • 查詢表的某些記錄在顯示數據時,咱們能夠設置取出來的這個表的字段名,在查的時候直接在字段的後面as 別名,以下
select ditinct 字段1 as 別名1,字段2 as 別名2,···· from 表名
                                where 條件
                                group by 字段名
                                having 篩選
                                order by 字段名
                                limit 限制條數

1.2 關鍵字優先級

from : 找到表
where : 拿着where 後面的約束的條件,去表/文件中取出一些記錄
group by : 將取出的某些記錄進行分組,若是沒有group by,則總體做爲一組
select : 執行select
distinct : 對去取出的重複數據進行去重
having : 將分組的結果進行having過濾
order by : 將結果按條件排序
limit : 限制顯示的記錄條數

1.3 注意(重點)

  • 一條查詢語句,能夠擁有多種篩選條件,條件的順序必須按照上方順序進行逐步篩選sql

  • distinct稍有特殊(書寫位置),條件的種類能夠不全
  • 能夠缺失某個條件,但不能亂序數據庫

1.4 測試一個單表的distinct去重

# 建立一個表
create table t1(
    id int,
    x int,
    y int
);
1.插入幾條數據
insert into t1 values(1, 1, 1), (2, 1, 2), (3, 2, 2), (4, 2, 2);
############################cmd 圖示
mysql> select * from t1;
+------+------+------+
| id   | x    | y    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    2 |
|    3 |    2 |    2 |
|    4 |    2 |    2 |
+------+------+------+

2.查詢所有數據
select distinct * from t1; 
############################cmd 圖示
mysql> select distinct * from t1;
+------+------+------+
| id   | x    | y    |
+------+------+------+
|    1 |    1 |    1 |
|    2 |    1 |    2 |
|    3 |    2 |    2 |
|    4 |    2 |    2 |
+------+------+------+
4 rows in set (0.00 sec)

3.查詢結果中,把重複的數據去掉
select distinct x, y from t1
############################cmd 圖示
mysql> select distinct x,y from t1;
+------+------+
| x    | y    |
+------+------+
|    1 |    1 |
|    1 |    2 |
|    2 |    2 |
+------+------+
3 rows in set (0.00 sec)

4.查詢字段y,把y字段的重複值去掉
select distinct y from t1;  # 結果 1  2
############################cmd 圖示
mysql> select distinct y from t1;
+------+
| y    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)
  • distinct對參與查詢的全部字段,總體去重(所查的所有字段的值都相同,才認爲是重複數據)

2、表記錄查詢測試

在此以前,先提幾個經常使用函數函數

2.1經常使用函數

  • 拼接:concat() 、concat_ws()
  • 大小寫:upper() 、 lower()
  • 浮點型操做:ceil() 、 floor() |、round()
  • 整型:能夠直接運算

2.2 數據準備

咱們以員工表(emp)爲例:測試

員工id :id :intcode

員工姓名 : name : varcharregexp

員工性別 :gender :enum排序

員工年齡 :age : int內存

員工工資 : salary : floatrem

員工所在城市 :area :varcahr

員工所在地址 :addr : varchar

員工部門 :dep :varchar

1.先建立員工表(emp)
create table emp(
    id int primary key auto_increment,
    name varchar(10) not null,
    sex enum('男','女') default '女',
    age int unsigned default 25,
    salary float default 0,
    area varchar(20) null default '中國',
    addr varchar(20) null default '上海',
    dep varchar(20) null default '諮詢部'
);
########查看錶結構
mysql> desc emp;
+--------+-------------------+------+-----+-----------+----------------+
| Field  | Type              | Null | Key | Default   | Extra          |
+--------+-------------------+------+-----+-----------+----------------+
| id     | int(11)           | NO   | PRI | NULL      | auto_increment |
| name   | varchar(10)       | NO   |     | NULL      |                |
| sex    | enum('男','女')   | YES  |     | 女        |                |
| age    | int(10) unsigned  | YES  |     | 25        |                |
| salary | float             | YES  |     | 0         |                |
| area   | varchar(20)       | YES  |     | 中國      |                |
| addr   | varchar(20)       | YES  |     | 上海      |                |
| dep    | varchar(20)       | YES  |     | 諮詢部    |                |
+--------+-------------------+------+-----+-----------+----------------+


2.插入數據
insert into emp values
    (1, 'aaa', '男', 42, 10.5, '上海', '浦東', '教職部'),
    (2, 'bbb', '男', 38, 9.4, '山東', '濟南', '教學部'),
    (3, 'ccc', '女', 30, 3.0, '江蘇', '張家港', '教學部'),
    (4, 'ddd', '女', 28, 2.4, '廣州', '廣東', '教學部'),
    (5, 'eee', '男', 28, 2.4, '江蘇', '蘇州', '教學部'),
    (6, 'fff', '男', 18, 8.8, '中國', '黃浦', '諮詢部'),
    (7, 'ggg', '男', 18, 8.8, '安徽', '宣城', '教學部'),
    (8, 'hhh', '男', 28, 9.8, '安徽', '巢湖', '教學部'),
    (9, 'iii', '女', 36, 1.2, '安徽', '蕪湖', '諮詢部'),
    (10, 'jjj', '男', 36, 5.8, '山東', '濟南', '教學部'),
    (11, 'kkk', '女', 28, 1.2, '山東', '青島', '教職部'),
    (12, 'lll', '男', 30, 9.0, '上海', '浦東', '諮詢部'),
    (13, 'mmm', '男', 30, 6.0, '上海', '浦東', '諮詢部'),
    (14, 'nnn', '男', 30, 6.0, '上海', '浦西', '教學部'),
    (15, 'ooo', '女', 67, 2.501, '上海', '陸家嘴', '教學部');
########查看錶記錄
mysql> select * from emp;
+----+------+------+------+--------+--------+-----------+-----------+
| id | name | sex  | age  | salary | area   | addr      | dep       |
+----+------+------+------+--------+--------+-----------+-----------+
|  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
|  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南      | 教學部    |
|  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
|  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東      | 教學部    |
|  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
|  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦      | 諮詢部    |
|  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
|  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教學部    |
|  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖      | 諮詢部    |
| 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
| 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
| 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
| 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
| 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
| 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
+----+------+------+------+--------+--------+-----------+-----------+
15 rows in set (0.00 sec)

2.3 表記錄測試

2.3.1 where條件查詢

  • 語法

    select 字段1,字段2···· from 表名 where 條件表達式
  • 條件判斷規則

    1.比較符合  >   <   >=   <=   =    !=
    2.區間符合  between開始 and結束     in(自定義容器)
    3.邏輯符合  and    or   not
    4.類似符合  like _(下劃線表明單個字符)   %(能夠匹配多個)
    5.正則符合  regexp 正則語法
  • 數據測試實例(以員工表爲例)

    • 查詢工資salary大於5的的員工(比較符合)

      mysql> select * from emp where salary >5;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東   | 教職部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南   | 教學部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦   | 諮詢部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教學部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教學部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南   | 教學部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東   | 諮詢部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東   | 諮詢部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西   | 教學部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查詢id號爲偶數的全部員工(比較符合)

      mysql> select * from emp where id%2=0;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南   | 教學部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東   | 教學部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦   | 諮詢部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教學部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南   | 教學部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東   | 諮詢部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西   | 教學部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查詢工資在6和9之間的全部員工(區間符合between and)

      mysql> select * from emp where id between 6 and 9;
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦   | 諮詢部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教學部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教學部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖   | 諮詢部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查詢工資在1,3 ,7 ,20之間的(區間符合、自定義容器 in)

      mysql> select * from emp where id in(1,3,7,20);
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      |  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 查詢全部名字帶有o字符的員工(類似符合 like %)

      mysql> select * from emp where name like '%o%';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 查詢全部名第二個字符是m的員工**(類似符合 like _)**

      mysql> select * from emp where name like '_o%';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
    • 查詢全部名字前兩個字符是a的員工**(類似符合 like __)**

      mysql> select * from emp where name like '__a%';
      
      +----+------+------+------+--------+--------+--------+-----------+
      | id | name | sex  | age  | salary | area   | addr   | dep       |
      +----+------+------+------+--------+--------+--------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東   | 教職部    |
      +----+------+------+------+--------+--------+--------+-----------+
    • 查詢id號全部包含1的全部員工(正則匹配)

      • sql只支持部分正則語法
      • '.*\d'; 不支持\d表明數字,認爲\d
      • '.*[0-9]'; 支持[]語法
      mysql> select * from emp where id regexp '.*[1]';
      
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      +----+------+------+------+--------+--------+-----------+-----------+

2.3.2 group by 分組查詢

1、分組查詢的問題

  • 1.在sql_mode沒有 ONLY_FULL_GROUP_BY 限制下,能夠執行,但結果沒有意義

    • 分組後,表中數據考慮範圍就不是 單條記錄,由於每一個分組都包含了多條記錄,參照分組字段,對每一個分組中的 多條記錄 統一處理,因此對以上敘述進行以下測試
    # 按部門分組,每一個部門都有哪些人
    mysql> select * from emp group by dep;
    +----+------+------+------+--------+--------+--------+-----------+
    | id | name | sex  | age  | salary | area   | addr   | dep       |
    +----+------+------+------+--------+--------+--------+-----------+
    |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦   | 諮詢部    |
    |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南   | 教學部    |
    |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東   | 教職部    |
    +----+------+------+------+--------+--------+--------+-----------+
  • 2.有 ONLY_FULL_GROUP_BY 限制,報錯

    • 在數據庫配置文件my.ini中配置以下代碼,而後重啓服務

      sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    # 重啓服務後從新進行如上的分組測試
    1.會發現直接報錯,由於咱們有了這個分組限制之後,那麼select查詢的字段只能是分組的那個字段dep
    mysql>  select dep from emp group by dep;
    
    +-----------+
    | dep       |
    +-----------+
    | 諮詢部    |
    | 教學部    |
    | 教職部    |
    +-----------+

2、聚合函數

由於咱們有了這個分組限制之後,那麼select查詢的字段只能是分組的那個字段dep,而表裏日他字段的值都獲取不到,因此咱們這樣分組並非咱們想要的結果,因此想要獲取組內的其餘相關信息,須要藉助函數

1.聚合函數分類
最大值  max()
最小值  min()
平均值  avg()
求和    sum()
計數    count()
組內字段拼接,用來查看組內其餘字段   group_concat()
2.數據測試(以員工表爲例)
  • 按照部門分組,並查看組內成員名(group_concat())

    mysql> select dep,group_concat(name) from emp group by dep;
    
    +-----------+-------------------------------------+
    | dep       | group_concat(name)                  |
    +-----------+-------------------------------------+
    | 諮詢部    | mmm,lll,fff,iii                     |
    | 教學部    | ooo,nnn,jjj,hhh,ggg,eee,ddd,ccc,bbb |
    | 教職部    | kkk,aaa                             |
    +-----------+-------------------------------------+
  • 按部門分組,每一個部門都有哪些人、最高的薪資、最低的薪資、平均薪資、組裏一共有多少人

    mysql> select
        -> dep 部門,
        -> group_concat(name) 成員,
        -> max(salary) 最高薪資,
        -> min(salary) 最低薪資,
        -> avg(salary) 平均薪資,
        -> sum(salary) 總薪資,
        -> count(sex) 人數
        -> from emp group by dep;
  • 按部門分組,查看最高年齡

    mysql> select dep 部門,max(age) 最高年齡 from emp group by dep;
    
    +-----------+--------------+
    | 部門      | 最高年齡     |
    +-----------+--------------+
    | 諮詢部    |           36 |
    | 教學部    |           67 |
    | 教職部    |           42 |
    +-----------+--------------+

2.3.3 having 和 where

  • 在沒有分組的狀況下,where與having結果相同

  • 重點:having能夠對 聚合結果 進行篩選

    # 沒有分組時where和having測試
    mysql> select * from emp where id in (5, 10, 15, 20);
    +----+------+------+------+--------+--------+-----------+-----------+
    | id | name | sex  | age  | salary | area   | addr      | dep       |
    +----+------+------+------+--------+--------+-----------+-----------+
    |  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
    | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
    | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
    +----+------+------+------+--------+--------+-----------+-----------+
    
    
    mysql> select * from emp having salary > 5;# 報錯了,這裏由於我以前配置了數據庫的文件
    ERROR 1463 (42000): Non-grouping field 'salary' is used in HAVING clause
  • 分組後的having 進行篩選測試

    • 按部門分組,查看全部人、最高的薪資、最低的薪資、平均薪資、總人數當中的最低工資小於2的

      mysql> select
          -> dep 部門,
          -> group_concat(name) 成員,
          -> max(salary) 最高薪資,
          -> min(salary) 最低薪資,
          -> avg(salary) 平均薪資,
          -> sum(salary) 總薪資,
          -> count(sex) 人數
          -> from emp group by dep having min(salary)<2;
      # 因爲工資是小數,因此在數據庫裏可能會出現一些錯誤
      +-----------+-----------------+--------------+--------------------+---------------
      | 部門  | 成員            |最高薪資| 最低薪資| 平均薪資| 總薪資 |人數|
      +-----------+-----------------+--------------+--------------------+---------------
      | 諮詢部| mmm,lll,fff,iii |9      | 1.20  | 6.250  | 25.0  | 4 |
      | 教職部| kkk,aaa         |10.5   | 1.20  | 5.85   | 11.7  | 2 |
      +-----------+-----------------+--------------+--------------------+---------------

2.3.4 排序 order by

1、語法規則

asc : 字段升序排序,默認是升序
desc : 字段降序排序

# 語法
order by 主排序字段 [asc|desc], 次排序字段1 [asc|desc], ...次排序字段n [asc|desc]
#1.先按主排序字段排序,若是出現主排序字段有某兩個或多個字段相同,那就再去按次排序字段排序

2、數據測試

  • 未分組狀態下測試

    • 按年齡升序

      mysql> select * from emp order by age asc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦      | 諮詢部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教學部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東      | 教學部    |
      |  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖      | 諮詢部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南      | 教學部    |
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按薪資降序

      mysql> select * from emp order by salary desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教學部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南      | 教學部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦      | 諮詢部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
      |  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東      | 教學部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖      | 諮詢部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按薪資降序,若是相同,再按年齡降序

      mysql> select * from emp order by salary desc,age desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教學部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南      | 教學部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦      | 諮詢部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
      |  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東      | 教學部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖      | 諮詢部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
      +----+------+------+------+--------+--------+-----------+-----------+
    • 按齡降序,若是相同,再按薪資降序

      mysql> select * from emp order by age desc,salary desc;
      +----+------+------+------+--------+--------+-----------+-----------+
      | id | name | sex  | age  | salary | area   | addr      | dep       |
      +----+------+------+------+--------+--------+-----------+-----------+
      | 15 | ooo  | 女   |   67 |  2.501 | 上海   | 陸家嘴    | 教學部    |
      |  1 | aaa  | 男   |   42 |   10.5 | 上海   | 浦東      | 教職部    |
      |  2 | bbb  | 男   |   38 |    9.4 | 山東   | 濟南      | 教學部    |
      | 10 | jjj  | 男   |   36 |    5.8 | 山東   | 濟南      | 教學部    |
      |  9 | iii  | 女   |   36 |    1.2 | 安徽   | 蕪湖      | 諮詢部    |
      | 12 | lll  | 男   |   30 |      9 | 上海   | 浦東      | 諮詢部    |
      | 14 | nnn  | 男   |   30 |      6 | 上海   | 浦西      | 教學部    |
      | 13 | mmm  | 男   |   30 |      6 | 上海   | 浦東      | 諮詢部    |
      |  3 | ccc  | 女   |   30 |      3 | 江蘇   | 張家港    | 教學部    |
      |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖      | 教學部    |
      |  5 | eee  | 男   |   28 |    2.4 | 江蘇   | 蘇州      | 教學部    |
      |  4 | ddd  | 女   |   28 |    2.4 | 廣州   | 廣東      | 教學部    |
      | 11 | kkk  | 女   |   28 |    1.2 | 山東   | 青島      | 教職部    |
      |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城      | 教學部    |
      |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦      | 諮詢部    |
      +----+------+------+------+--------+--------+-----------+-----------+
  • 分組狀態下

    • 按最高薪資降序(已上面group by分組後爲例)

      mysql> select
          -> dep 部門,
          -> group_concat(name)成員,
          -> max(salary) 最高薪資,
          -> min(salary) 最低薪資,
          -> avg(salary) 平均薪資,
          -> sum(salary) 總薪資,
          -> count(sex) 人數
          -> from emp group by dep order by 最高薪資 desc;
      
      # 因爲工資是小數,因此在數據庫裏可能會出現一些錯誤
      +-----------+-------------------------------------+--------------+--------------+-
      | 部門 | 成員                                 |最高薪資| 最低薪資|平均薪資|總薪資|人數   |
      +-----------+-------------------------------------+--------------+--------------+-
      | 教職部| kkk,aaa                             |10.5  |1.2     |5.85   |11.7 |2 |
      | 教學部| ooo,nnn,jjj,hhh,ggg,eee,ddd,ccc,bbb |9.8   |2.4     |5.56   |50.1 |9 |
      | 諮詢部| mmm,lll,fff,iii                     |9     |1.2     |6.2    |25.0 |4 |
      +-----------+-------------------------------------+--------------+--------------+-

2.3.5 limit限制

1、語法

limit 條數 
limit 偏移量,條數 偏移量就是跳過幾條數據後開始取

2、數據測試(限制 limit)

  • 工資小於8的員工姓名和工資,按工工資降序排列後,選取1條

    select name,salary from emp where salary<8 order by salary desc limit 1;
    +------+--------+
    | name | salary |
    +------+--------+
    | mmm  |      6 |
    +------+--------+
  • 查詢全部員工表裏的數據,先偏移5條知足條件的記錄,再查詢3條

    mysql> select * from emp limit 5,3;
    +----+------+------+------+--------+--------+--------+-----------+
    | id | name | sex  | age  | salary | area   | addr   | dep       |
    +----+------+------+------+--------+--------+--------+-----------+
    |  6 | fff  | 男   |   18 |    8.8 | 中國   | 黃浦   | 諮詢部    |
    |  7 | ggg  | 男   |   18 |    8.8 | 安徽   | 宣城   | 教學部    |
    |  8 | hhh  | 男   |   28 |    9.8 | 安徽   | 巢湖   | 教學部    |
    +----+------+------+------+--------+--------+--------+-----------+
相關文章
相關標籤/搜索