MySQL使用教程【十】:單表數據記錄查詢

1、簡單數據記錄查詢

【語法】

select 字段名 from 表名;

(1)查詢所有字段數據

mysql> select empno,ename,job,MSG,Hiredate,sal,comm,deptno from t_employee;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
+-------+--------+-------+------+------------+--------+------+--------+
4 rows in set (0.11 sec)
mysql> select * from t_employee;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
+-------+--------+-------+------+------------+--------+------+--------+
4 rows in set (0.00 sec)

(2)查詢指定字段數據

mysql> select ename,comm from t_employee;
+--------+------+
| ename  | comm |
+--------+------+
| SMITH  | NULL |
| ename1 | 1.00 |
| ename2 | 2.00 |
| ename3 | 3.00 |
+--------+------+
4 rows in set (0.00 sec)

(3)避免重複數據查詢-distinct

mysql> select distinct ename from t_employee;
+--------+
| ename  |
+--------+
| SMITH  |
| ename1 |
| ename2 |
| ename3 |
+--------+
4 rows in set (0.08 sec)

(4)實現數學四則運算數據查詢

mysql> select ename,sal*12 from t_employee;
+--------+---------+
| ename  | sal*12  |
+--------+---------+
| SMITH  | 9600.00 |
| ename1 |   12.00 |
| ename2 |   24.00 |
| ename3 |   36.00 |
| ename1 |   24.00 |
+--------+---------+
5 rows in set (0.04 sec)
#使用as給字段sal * 12重命名爲yearsalary顯示
mysql> select ename,sal * 12 as yearsalary from t_employee;
+--------+------------+
| ename  | yearsalary |
+--------+------------+
| SMITH  |    9600.00 |
| ename1 |      12.00 |
| ename2 |      24.00 |
| ename3 |      36.00 |
| ename1 |      24.00 |
+--------+------------+
5 rows in set (0.00 sec)

(5)設置顯示格式數據查詢

mysql> select concat(ename,'’s annual salary is :',sal * 12) yearsalary from t_employee;
+-------------------------------------+
| yearsalary                          |
+-------------------------------------+
| SMITH’s annual salary is :9600.00   |
| ename1’s annual salary is :12.00    |
| ename2’s annual salary is :24.00    |
| ename3’s annual salary is :36.00    |
| ename1’s annual salary is :24.00    |
+-------------------------------------+
5 rows in set (0.00 sec)

2、條件數據記錄查詢

【語法】

select 字段名 from 表名 where 條件語句; 

(1)帶關係運算符和邏輯運算符的條件數據查詢
在這裏插入圖片描述

  • 單條件數據查詢
mysql> select ename from t_employee where job='job2';
+--------+
| ename  |
+--------+
| ename2 |
+--------+
1 row in set (0.00 sec)
  • 多條件數據查詢
mysql> select ename from t_employee where job='job1'&&sal>1;
+--------+
| ename  |
+--------+
| ename1 |
+--------+
1 row in set (0.00 sec)

(2)帶between and關鍵字的範圍查詢

【語法】

select 字段名 from 表名 where between value1 and value2; 
  • 符合範圍的數據記錄查詢
mysql> select ename from t_employee where sal between 2 and 3;
+--------+
| ename  |
+--------+
| ename2 |
| ename3 |
| ename1 |
+--------+
3 rows in set (0.00 sec)
  • 不符合範圍的數據記錄查詢
mysql> select ename from t_employee where sal not between 2 and 3;
+--------+
| ename  |
+--------+
| SMITH  |
| ename1 |
+--------+
2 rows in set (0.00 sec)

(3)帶is null 關鍵字的空值查詢

【語法】

select 字段名 from 表名 where 字段名 is null; 
  • 空值數據記錄查詢
mysql> select ename from t_employee where comm is null;
+-------+
| ename |
+-------+
| SMITH |
+-------+
1 row in set (0.00 sec)
  • 不是空值數據記錄查詢
mysql> select ename from t_employee where not comm is null;
+--------+
| ename  |
+--------+
| ename1 |
| ename2 |
| ename3 |
| ename1 |
+--------+
4 rows in set (0.00 sec)

(4)帶in關鍵字的集合查詢
【語法】

select 字段名 from 表名 where field in (value1,value2……,valuen); 
  • 在集合中數據記錄查詢
mysql> select ename from t_employee where sal in (2,7,8);
+--------+
| ename  |
+--------+
| ename2 |
| ename1 |
+--------+
2 rows in set (0.00 sec)
mysql> select ename from t_employee where sal=2 or sal=7 or sal=8;
+--------+
| ename  |
+--------+
| ename2 |
| ename1 |
+--------+
2 rows in set (0.00 sec)
  • 不在集合中數據記錄查詢
mysql> select ename from t_employee where not sal in (2,7,8);
+--------+
| ename  |
+--------+
| SMITH  |
| ename1 |
| ename3 |
+--------+
3 rows in set (0.01 sec)

mysql> select ename from t_employee where sal not in (2,7,8);
+--------+
| ename  |
+--------+
| SMITH  |
| ename1 |
| ename3 |
+--------+
3 rows in set (0.00 sec)
  • 關於集合查詢注意點
#使用關鍵字in時,查詢集合中存在null,不影響查詢
mysql> select ename from t_employee where sal in (2,7,8,null);
+--------+
| ename  |
+--------+
| ename2 |
| ename1 |
+--------+
2 rows in set (0.00 sec)

#使用關鍵字not in時,查詢集合中存在null,不會有任何查詢結果
mysql> select ename from t_employee where sal not in (2,7,8,null);
Empty set (0.00 sec)

(5)帶like關鍵字的模糊查詢

【語法】

select 字段名 from 表名 where field like value;
  • 帶有”%“通配符的查詢(該通配符能夠匹配任意長度的字符串)
mysql> select ename from t_employee where ename like 'e%';
+--------+
| ename  |
+--------+
| ename1 |
| ename2 |
| ename3 |
| ename1 |
+--------+
4 rows in set (0.00 sec)
mysql> select ename from t_employee where ename not like 'e%';
+-------+
| ename |
+-------+
| SMITH |
+-------+
1 row in set (0.18 sec)
  • 帶有”_“通配符的查詢(該通配符能匹配單個字符)
mysql> select ename from t_employee where ename like '_n%';
+--------+
| ename  |
+--------+
| ename1 |
| ename2 |
| ename3 |
| ename1 |
+--------+
4 rows in set (0.00 sec)
mysql> select ename from t_employee where ename not like '_n%';
+-------+
| ename |
+-------+
| SMITH |
+-------+
1 row in set (0.00 sec)

(5)排序數據記錄查詢

【語法】

select 字段名 from 表名 where 條件語句 order by 字段 [asc|desc];
  • 按照單子段排序
#升序排序
mysql> select * from t_employee order by sal;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     1 | ename1 | job1  |    3 | 2019-03-12 |   2.00 | 3.00 |      3 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+--------+-------+------+------------+--------+------+--------+
5 rows in set (0.06 sec)

mysql> select * from t_employee order by sal asc;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     1 | ename1 | job1  |    3 | 2019-03-12 |   2.00 | 3.00 |      3 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+--------+-------+------+------------+--------+------+--------+
5 rows in set (0.00 sec)
#降序排序
mysql> select * from t_employee order by sal desc;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     1 | ename1 | job1  |    3 | 2019-03-12 |   2.00 | 3.00 |      3 |
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
+-------+--------+-------+------+------------+--------+------+--------+
5 rows in set (0.00 sec)
  • 按照多字段排序
mysql> select * from t_employee order by sal,MSG desc;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     1 | ename1 | job1  |    3 | 2019-03-12 |   2.00 | 3.00 |      3 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+--------+-------+------+------------+--------+------+--------+
5 rows in set (0.00 sec)
mysql> select * from t_employee order by sal asc ,MSG desc;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     1 | ename1 | job1  |    3 | 2019-03-12 |   2.00 | 3.00 |      3 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 2.00 |      2 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|  7369 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+--------+-------+------+------------+--------+------+--------+
5 rows in set (0.00 sec)
  • 限制數據記錄查詢數量
    【語法】
select 字段名 from 表名 where 條件語句 limit offset_start,row_count;

(1)不指定初始位置

mysql> select * from t_employee where comm is null limit 2; 
+-------+-------+-------+------+------------+--------+------+--------+
| empno | ename | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+-------+-------+------+------------+--------+------+--------+
|  7369 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+-------+-------+------+------------+--------+------+--------+
1 row in set (0.01 sec)

(2)指定初始位置

mysql> select * from t_employee where comm is null order by MSG limit 0,5;
+-------+-------+-------+------+------------+--------+------+--------+
| empno | ename | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+-------+-------+------+------------+--------+------+--------+
|    73 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|    69 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|  7369 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+-------+-------+------+------------+--------+------+--------+
3 rows in set (0.06 sec)
mysql> select * from t_employee where comm is null order by MSG limit 5,10;
+-------+-------+-------+------+------------+--------+------+--------+
| empno | ename | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+-------+-------+------+------------+--------+------+--------+
|    73 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|    73 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|  7369 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|    69 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
|    73 | SMITH | CLERK | 7902 | 2019-03-12 | 800.00 | NULL |     20 |
+-------+-------+-------+------+------------+--------+------+--------+
5 rows in set (0.00 sec)

4、統計函數和分組數據記錄查詢

【語法】

select 統計函數(字段) from 表名 where 條件語句;

【統計函數】

  • count()函數:統計表中記錄的條數 avg()函數:計算字段值的平均值
  • sum()函數:計算字段值的總和
  • max()函數:查詢字段值的最大值
  • min()函數:查詢字段值的最小值
  • 如果所操作的表裏沒有任何數據,則count()函數返回數據0,其他函數則返回null

(1)mysql支持的統計函數

  • 統計數據記錄條數
mysql> select count(*) number from t_employee;
+--------+
| number |
+--------+
|     14 |
+--------+
1 row in set (0.00 sec)
mysql> select count(comm) number from t_employee;
+--------+
| number |
+--------+
|      4 |
+--------+
1 row in set (0.00 sec)
mysql> select count(comm) number from t_employee where not comm=0;
+--------+
| number |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)

  • 統計計算平均值
mysql> select avg(comm) average from t_employee where not comm=0;
+----------+
| average  |
+----------+
| 2.333333 |
+----------+
1 row in set (0.00 sec)
  • 統計計算求和
mysql> select sum(comm) sumvalue from t_employee where not comm=0;
+----------+
| sumvalue |
+----------+
|     7.00 |
+----------+
1 row in set (0.00 sec)
  • 統計計算最大值和最小值
mysql> select max(sal) maxval,min(sal) minval from t_employee;
+--------+--------+
| maxval | minval |
+--------+--------+
| 800.00 |   1.00 |
+--------+--------+
1 row in set (0.01 sec)

(2)分組數據查詢

  • 簡單分組查詢(分組中顯示的數據記錄爲隨機的)

【語法】

select 統計函數 from 表名 where 條件語句 group by 字段名;

【實例】

mysql> select * from t_employee group by deptno;
+-------+--------+-------+------+------------+--------+------+--------+
| empno | ename  | job   | MSG  | Hiredate   | sal    | comm | deptno |
+-------+--------+-------+------+------------+--------+------+--------+
|     1 | ename1 | job1  |    1 | 2019-03-12 |   1.00 | 1.00 |      1 |
|     2 | ename2 | job2  |    2 | 2019-03-12 |   2.00 | 0.00 |      2 |
|     3 | ename3 | job3  |    3 | 2019-03-12 |   3.00 | 3.00 |      3 |
|    73 | SMITH  | CLERK | 7902 | 2019-03-12 | 800.00 | 0.00 |     20 |
+-------+--------+-------+------+------------+--------+------+--------+
4 rows in set (0.01 sec)

  • 實現統計功能分組查詢

【語法】

select group_concat(字段名) from 表名 where 條件語句 group by 字段名;

【實例】

mysql> select deptno,group_concat(ename) enames,count(ename) number 
    ->   from t_employee group by deptno;
+--------+-------------------------------------------------------+--------+
| deptno | enames                                                | number |
+--------+-------------------------------------------------------+--------+
|      1 | ename1                                                |      1 |
|      2 | ename2                                                |      1 |
|      3 | ename3,ename1                                         |      2 |
|     20 | SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH |      9 |
+--------+-------------------------------------------------------+--------+
4 rows in set (0.06 sec)
  • 實現多個字段分組查詢

【語法】

select group_concat(field),function(field) from 表名 where 條件語句 group by field1……fieldn;

【實例】

mysql> select deptno,MSG,group_concat(ename) enames,count(ename) number
    ->  from t_employee group by deptno,MSG;
+--------+------+-------------------------------------------------------+--------+
| deptno | MSG  | enames                                                | number |
+--------+------+-------------------------------------------------------+--------+
|      1 |    1 | ename1                                                |      1 |
|      2 |    2 | ename2                                                |      1 |
|      3 |    3 | ename3,ename1                                         |      2 |
|     20 | 7902 | SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH |      9 |
+--------+------+-------------------------------------------------------+--------+
4 rows in set (0.00 sec)
  • 實現having子句限定分組查詢

【語法】

select function(field) from 表名 where 條件語句 group by field1……fieldn having 條件語句;

【實例】

mysql> select deptno,avg(sal) average,group_concat(ename) enames,count(ename) number
    ->  from t_employee
    ->   group by deptno
    ->     having avg(sal) > 3;
+--------+------------+-------------------------------------------------------+--------+
| deptno | average    | enames                                                | number |
+--------+------------+-------------------------------------------------------+--------+
|     20 | 800.000000 | SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH,SMITH |      9 |
+--------+------------+-------------------------------------------------------+--------+
1 row in set (0.09 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章