MySQL 基礎 查詢

別名

  查詢數據時,若是表名很長,使用起來不方便,此時,就能夠爲表取一個別名,用這個別名來代替表的名稱 。同時爲了更好的顯示所查詢出來的字段,也能夠給字段取別名。mysql

一,表做爲別名:sql

mysql> select a.name,a.age from student as a;  // a爲別名
+--------+------+
| name   | age  |
+--------+------+
| quert  |   15 |
| peilin |   20 |
| 微微   |   21 |
| 老晴   |   22 |
| aa     |   33 |
+--------+------+
5 rows in set (0.00 sec)

二,字段爲別名函數

mysql> select a.name as 姓名,a.age as 年齡 from student as a;  // 中文顯示
+--------+------+
| 姓名   | 年齡 |
+--------+------+
| quert  |   15 |
| peilin |   20 |
| 微微   |   21 |
| 老晴   |   22 |
| aa     |   33 |
+--------+------+
5 rows in set (0.00 sec)

條件

where子句(條件查詢):按照「條件表達式」指定的條件進行查詢spa

where經常使用:code

符號 描述 備註
= 等於  
<>, != 不等於  
> 大於  
< 小於  
<= 小於等於  
>= 大於等於  
BETWEEN 在兩值之間 >=min&&<=max
NOT BETWEEN 不在兩值之間  
IN 在集合中  
NOT IN 不在集合中  
<=> 嚴格比較兩個NULL值是否相等 兩個操做碼均爲NULL時,其所得值爲1;而當一個操做碼爲NULL時,其所得值爲0
LIKE 模糊匹配  
REGEXP 或 RLIKE 正則式匹配  
IS NULL 爲空  
IS NOT NULL 不爲空

 

例如:對象

mysql> select * from student where id >3;
+----+------+------+
| id | name | age  |
+----+------+------+
|  4 | 老晴 |   22 |
| 18 | aa   |   33 |
+----+------+------+
2 rows in set (0.00 sec)

分頁(limit)

mysql> select * from student limit 1, 3;  // 1表示偏移位置,3表示輸出個數
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  2 | peilin |   20 |
|  3 | 微微   |   21 |
|  4 | 老晴   |   22 |
+----+--------+------+
3 rows in set (0.00 sec)

 排序(order by)

一,按照一個字段排序:blog

SELECT
    id,
    age,
    salary
FROM tbs_test.`test_2`
ORDER BY age;

查詢出的字段如圖所示排序

二,按照多個字段排序:qt

SELECT
    id,
    age,
    salary
FROM tbs_test.`test_2`
ORDER BY age, salary;

 以下圖:先對第一個字段排序,若是第一個字段相同的,用第二個字段排序。數學

分組(group by)

SELECT 
    provice AS '省份',
    school  AS '學校',
    class_num AS '班級數量'
FROM tbs_test.`pro_school` 
GROUP BY provice;

 原數據:

group by後的數據,看似沒什麼意義: 可是能夠結合聚合函數進行使用。默認默認顯示是是相同數據的第一條。

 結合聚合示例:

SELECT 
    provice AS '省份',
    SUM(class_num) AS '班級數量和'
FROM tbs_test.`pro_school` 
GROUP BY provice;

查詢出的數據:

聚合函數

常見的聚合函數

1max(列名):求最大值。

(2min(列名):求最小值。

(2sum(列名):求和。

(4avg(列名):求平均值。

(5count(列名):統計記錄的條數。

max:

 for the right syntax to use near 'selec * from klass' at line 1
mysql> select * from klass;
+----+----------+-------+--------+-----------+
| id | name     | grade | course | class_num |
+----+----------+-------+--------+-----------+
|  1 | 三年八班 | 高三  | 數學   |        10 |
|  2 | 三年八班 | 高三  | 語文   |        20 |
|  3 | 三年八班 | 高三  | 美術   |        30 |
|  4 | 三年八班 | 高三  | 語文   |        22 |
|  5 | 二年八班 | 高二  | 語文   |        22 |
|  6 | 二年八班 | 高二  | 數學   |        32 |
|  7 | 二年八班 | 高二  | 英語   |        62 |
|  8 | 二年八班 | 高二  | 體育   |        11 |
+----+----------+-------+--------+-----------+
8 rows in set (0.00 sec)

mysql> select max(class_num) as 最多的課時, course,grade, name from klass;
+------------+--------+-------+----------+
| 最多的課時 | course | grade | name     |
+------------+--------+-------+----------+
|         62 | 數學   | 高三  | 三年八班 |
+------------+--------+-------+----------+
1 row in set (0.00 sec)

min:

mysql> select * from klass;
+----+----------+-------+--------+-----------+
| id | name     | grade | course | class_num |
+----+----------+-------+--------+-----------+
|  1 | 三年八班 | 高三  | 數學   |        10 |
|  2 | 三年八班 | 高三  | 語文   |        20 |
|  3 | 三年八班 | 高三  | 美術   |        30 |
|  4 | 三年八班 | 高三  | 語文   |        22 |
|  5 | 二年八班 | 高二  | 語文   |        22 |
|  6 | 二年八班 | 高二  | 數學   |        32 |
|  7 | 二年八班 | 高二  | 英語   |        62 |
|  8 | 二年八班 | 高二  | 體育   |        11 |
|  9 | 二年八班 | 高二  | 音樂   |        10 |
+----+----------+-------+--------+-----------+
9 rows in set (0.00 sec)

mysql> select min(class_num) as 最多的課時, course,grade, name from klass;
+------------+--------+-------+----------+
| 最多的課時 | course | grade | name     |
+------------+--------+-------+----------+
|         10 | 數學   | 高三  | 三年八班 |
+------------+--------+-------+----------+
1 row in set (0.00 sec)

注意:求最值時,如有兩個值相同,先找到第一個就不往下找了。

其餘函數就不一一介紹,用法一一致,這些聚合函數,結合分組纔有更多的實際意義。

分組和聚合聯合使用:

實例1:count 和 group by

mysql> select name, count(course) as 相同班級的課程數 from klass group by name;   // 先對其進行分組,再用聚合函數求值
+----------+------------------+
| name     | 相同班級的課程數 |
+----------+------------------+
| 三年八班 |                4 |
| 二年八班 |                5 |
+----------+------------------+
2 rows in set (0.00 sec)

實例2:max,min 和 group by

mysql> select name, max(class_num) as 不一樣年級的最大班級數 from klass group by name;
+----------+----------------------+
| name     | 不一樣年級的最大班級數 |
+----------+----------------------+
| 三年八班 |                   30 |
| 二年八班 |                   62 |
+----------+----------------------+
2 rows in set (0.00 sec)

mysql> select name, min(class_num) as 不一樣年級的最大班級數 from klass group by name;
+----------+----------------------+
| name     | 不一樣年級的最大班級數 |
+----------+----------------------+
| 三年八班 |                   10 |
| 二年八班 |                   10 |
+----------+----------------------+
2 rows in set (0.00 sec)

實例3:avg 和 group by

mysql> select name, avg(class_num) as 不一樣年級的最大班級數 from klass group by name;
+----------+----------------------+
| name     | 不一樣年級的最大班級數 |
+----------+----------------------+
| 三年八班 |              20.5000 |
| 二年八班 |              27.4000 |
+----------+----------------------+
2 rows in set (0.00 sec)

分組聚合之having

having子句可讓咱們篩選成組後的各類數據,where子句在聚合前先篩選記錄,也就是說做用在group by和having子句前。而 having子句在聚合後對組記錄進行篩選。 

例如:

mysql> select name, count(course) as 相同班級的課程數 from klass group by name having 相同班級的課程數>4;
+----------+------------------+
| name     | 相同班級的課程數 |
+----------+------------------+
| 二年八班 |                5 |
+----------+------------------+
1 row in set (0.00 sec)

注意:having 中篩選的字段必須在select中存在,不然查詢會報錯。

where和having的區別:

做用的對象不一樣。WHERE 子句做用於表和視圖,HAVING 子句做用於組。
WHERE 在分組和彙集計算以前選取輸入行(所以,它控制哪些行進入彙集計算), 而 HAVING 在分組和彙集以後選取分組的行。所以,WHERE 子句不能包含彙集函數; 由於試圖用匯集函數判斷那些行輸入給彙集運算是沒有意義的。 相反,HAVING 子句老是包含彙集函數。(嚴格說來,你能夠寫不使用匯集的 HAVING 子句, 但這樣作只是白費勁。一樣的條件能夠更有效地用於 WHERE 階段。)
在上面的例子中,咱們能夠在 WHERE 裏應用數量字段來限制,由於它不須要彙集。 這樣比在 HAVING 裏增長限制更加高效,由於咱們避免了爲那些未經過 WHERE 檢查的行進行分組和彙集計算。
綜上所述:
having通常跟在group by以後,執行記錄組選擇的一部分來工做的。where則是執行全部數據來工做的。
再者having能夠用聚合函數,如having sum(qty)>1000

例子:where + group by + having + 函數 綜合查詢

子查詢

表數數據:

mysql> select * from student;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |
| 903 | 張三   ||  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |
| 905 | 王五   ||  1991 | 英語系     | 福建省廈門市 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
6 rows in set (0.00 sec)

mysql> select * from score;
+----+--------+--------+-------+
| id | stu_id | c_name | grade |
+----+--------+--------+-------+
|  1 |    901 | 計算機 |    98 |
|  2 |    901 | 英語   |    80 |
|  3 |    902 | 計算機 |    65 |
|  4 |    902 | 中文   |    88 |
|  5 |    903 | 中文   |    95 |
|  6 |    904 | 計算機 |    70 |
|  7 |    904 | 英語   |    92 |
|  8 |    905 | 英語   |    94 |
|  9 |    906 | 計算機 |    90 |
| 10 |    906 | 英語   |    85 |
+----+--------+--------+-------+
10 rows in set (0.00 sec)

 條件:查詢出分數大於90分的學生。

mysql> select * from student where id in (select stu_id from score where grade>90);
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |
| 903 | 張三   ||  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |
| 905 | 王五   ||  1991 | 英語系     | 福建省廈門市 |
+-----+--------+------+-------+------------+--------------+
4 rows in set (0.00 sec)

鏈接查詢

內鏈接(inner join)

元數據:

mysql> select * from student;
+-----+--------+------+-------+------------+--------------+
| id  | name   | sex  | birth | department | address      |
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |
| 903 | 張三   ||  1990 | 中文系     | 湖南省永州市 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |
| 905 | 王五   ||  1991 | 英語系     | 福建省廈門市 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 |
| 907 | 大哥   ||  1990 | 數學系     | 江西贛州市   |
+-----+--------+------+-------+------------+--------------+
7 rows in set (0.00 sec)

mysql> select * from score;
+----+--------+--------+-------+
| id | stu_id | c_name | grade |
+----+--------+--------+-------+
|  1 |    901 | 計算機 |    98 |
|  2 |    901 | 英語   |    80 |
|  3 |    902 | 計算機 |    65 |
|  4 |    902 | 中文   |    88 |
|  5 |    903 | 中文   |    95 |
|  6 |    904 | 計算機 |    70 |
|  7 |    904 | 英語   |    92 |
|  8 |    905 | 英語   |    94 |
|  9 |    906 | 計算機 |    90 |
| 10 |    906 | 英語   |    85 |
| 11 |    908 | 數學   |    90 |
+----+--------+--------+-------+
11 rows in set (0.00 sec)

where的方式:

mysql> select * from student,score where student.id = score.stu_id
    -> ;
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
| id  | name   | sex  | birth | department | address      | id | stu_id | c_name | grade |
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |  1 |    901 | 計算機 |    98 |
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |  2 |    901 | 英語   |    80 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |  3 |    902 | 計算機 |    65 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |  4 |    902 | 中文   |    88 |
| 903 | 張三   ||  1990 | 中文系     | 湖南省永州市 |  5 |    903 | 中文   |    95 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |  6 |    904 | 計算機 |    70 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |  7 |    904 | 英語   |    92 |
| 905 | 王五   ||  1991 | 英語系     | 福建省廈門市 |  8 |    905 | 英語   |    94 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 |  9 |    906 | 計算機 |    90 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 | 10 |    906 | 英語   |    85 |
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
10 rows in set (0.00 sec)

join 或 inner join 的方式: 這兩種都是同樣的

mysql> select * from student join score on student.id = score.stu_id;
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
| id  | name   | sex  | birth | department | address      | id | stu_id | c_name | grade |
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |  1 |    901 | 計算機 |    98 |
| 901 | 張老大 ||  1985 | 計算機系   | 北京市海淀區 |  2 |    901 | 英語   |    80 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |  3 |    902 | 計算機 |    65 |
| 902 | 張老二 ||  1986 | 中文系     | 北京市昌平區 |  4 |    902 | 中文   |    88 |
| 903 | 張三   ||  1990 | 中文系     | 湖南省永州市 |  5 |    903 | 中文   |    95 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |  6 |    904 | 計算機 |    70 |
| 904 | 李四   ||  1990 | 英語系     | 遼寧省阜新市 |  7 |    904 | 英語   |    92 |
| 905 | 王五   ||  1991 | 英語系     | 福建省廈門市 |  8 |    905 | 英語   |    94 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 |  9 |    906 | 計算機 |    90 |
| 906 | 王六   ||  1988 | 計算機系   | 湖南省衡陽市 | 10 |    906 | 英語   |    85 |
+-----+--------+------+-------+------------+--------------+----+--------+--------+-------+
10 rows in set (0.00 sec)

外鏈接(outer join)

   left join(左外鏈接)

SELECT 
    stu.id
    NAME,
    sex,
    birth,
    department,
    sco.`score`,
    sco.`c_name`
FROM
tbs_test.`student` AS stu 
LEFT JOIN
tbs_test.`stu_score` AS sco
ON stu.id=sco.`stu_id`;

 結果以下顯示:標紅的這一字段,在分數表中沒有數據,因此用空值顯示。

   right join(右外鏈接):

SELECT 
    stu.id
    NAME,
    sex,
    birth,
    department,
    sco.`score`,
    sco.`c_name`
FROM
tbs_test.`student` AS stu 
RIGHT JOIN
tbs_test.`stu_score` AS sco
ON stu.id=sco.`stu_id`;

同理又外鏈接可的以下數據:分數表中有個數學在學生表中並無,仍然顯示,只不過學生信息用空值顯示。

union all(union all)全鏈接查詢

語句:

語句:
(select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB )
或
(select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB );

union語句注意事項:

         1.經過union鏈接的SQL它們分別單獨取出的列數必須相同;

         2.不要求合併的表列名稱相同時,以第一個sql 表列名爲準;

         3.使用union 時,徹底相等的行,將會被合併,因爲合併比較耗時,通常不直接使用 union 進行合併,而是一般採用union all 進行合併;

         4.被union 鏈接的sql 子句,單個子句中不用寫order by ,由於不會有排序的效果。但能夠對最終的結果集進行排序;

(select id,name from A order by id) union all (select id,name from B order by id); //沒有排序效果

(select id,name from A ) union all (select id,name from B ) order by id; //有排序效果
相關文章
相關標籤/搜索