查詢數據時,若是表名很長,使用起來不方便,此時,就能夠爲表取一個別名,用這個別名來代替表的名稱 。同時爲了更好的顯示所查詢出來的字段,也能夠給字段取別名。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)
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)
一,按照一個字段排序: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;
以下圖:先對第一個字段排序,若是第一個字段相同的,用第二個字段排序。數學
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;
查詢出的數據:
常見的聚合函數
(1)max(列名):求最大值。 (2)min(列名):求最小值。 (2)sum(列名):求和。 (4)avg(列名):求平均值。 (5)count(列名):統計記錄的條數。
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子句可讓咱們篩選成組後的各類數據,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)
元數據:
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)
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)
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`;
結果以下顯示:標紅的這一字段,在分數表中沒有數據,因此用空值顯示。
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`;
同理又外鏈接可的以下數據:分數表中有個數學在學生表中並無,仍然顯示,只不過學生信息用空值顯示。
語句:
語句: (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; //有排序效果