1. 程式人生 > >mysql資料庫(二)——表的查詢

mysql資料庫(二)——表的查詢

1.單表查詢

1.1 查詢語法

SELECT 欄位1,欄位2... FROM 表名

                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數

1.2 關鍵字優先順序

from
where
group by
having
select
distinct
order by
limit

(1)找到表:from(2)拿著where指定的約束條件,去檔案/表中取出一條條記錄(3)將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組

(4)將分組的結果進行having過濾(5)執行select(6)去重(7)將結果按條件排序:order by(8)限制結果的顯示條數

1.3 簡單查詢

(1)select * from table; 查詢表內所有資料

(2)select [欄位名n1,n2...] from table; 查詢指定欄位資料

(3)select distinct 欄位名 from table; 避免重複

(4)concat() 用於連線字串

例如:select concat('姓名:',name) '姓名'  from employee;

(5)concat_ws() 第一個引數作為分隔符

mysql> select concat_ws(':','姓名',name) '姓名' from employee;
+-------------------+
| 姓名 |
+-------------------+
| 姓名:xxx         |

1.4 where約束

where常用約束:

(1)比較運算子:> 、<、>=、 <=、 <>、 !=

(2)between...and...

(3)in(值1,值2...)

(4)like '% or _' ,pattern可以是%或_ ,%表示任意多字元,_表示一個字元

(5)邏輯運算子:在多個條件直接可以使用邏輯運算子 and or not

 1.5 group by

分組是基於where之後得到的記錄而進行的,將所有記錄按照某個相同欄位進行歸類,比如針對員工資訊表的職位分組,或者按照性別進行分組等
單獨使用GROUP BY關鍵字分組
    SELECT post FROM employee GROUP BY post;
    注意:我們按照post欄位分組,那麼select查詢的欄位只能是post,想要獲取組內的其他相關資訊,需要藉助函式

GROUP BY關鍵字和GROUP_CONCAT()函式一起使用
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照崗位分組,並檢視組內成員名
    SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post;

GROUP BY與聚合函式一起使用
    select post,count(id) as count from employee group by post;#按照崗位分組,並檢視每個組有多少人

1.6 having 

執行優先順序從高到低:where > group by > having

Where 發生在分組group by之前,因而Where中可以有任意欄位,但是絕對不能使用聚合函式

Having發生在分組group by之後,因而Having中可以使用分組的欄位,無法直接取到其他欄位,可以使用聚合函式

1.7 order by

按單列排序
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
SELECT * FROM employee ORDER BY salary DESC;

按多列排序:先按照age排序,如果年紀相同,則按照薪資排序
SELECT * from employee
ORDER BY age,
salary DESC;

1.8 limit

示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #預設初始位置為0

SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條

SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條

1.9 正則查詢

SELECT * FROM employee WHERE name REGEXP '^ale';

SELECT * FROM employee WHERE name REGEXP 'on$';

SELECT * FROM employee WHERE name REGEXP 'm{2}';


小結:對字串匹配的方式
WHERE name = 'egon';
WHERE name LIKE 'yua%';
WHERE name REGEXP 'on$';

2 多表查詢

2.1 多表連線查詢

2.1.1 交叉連線:不適用任何匹配條件。生成笛卡爾積 

select 欄位列表 from 表1,表2;

2.1.2 內連線:只連線匹配的行

select 欄位列表 from 表1 inner join 表2 

on 表1.欄位名 = 表2.欄位名

2.1.3 左連線:優先顯示左表

select 欄位列表 from 表1 left join 表2 

on 表1.欄位名 = 表2.欄位名

2.1.4 右連線:優先顯示右表

select 欄位列表 from 表1 right join 表2 

on 表1.欄位名 = 表2.欄位名

2.1.5 全連線:顯示左右兩個表全部記錄 

#!mysql不支援全外連線 full JOIN

select 欄位列表 from 表1 left join 表2 

on 表1.欄位名 = 表2.欄位名

union

select 欄位列表 from 表1 right join 表2 

on 表1.欄位名 = 表2.欄位名

注:union會去掉相同記錄

2.2 條件約束連線查詢

SELECT 欄位列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.欄位 = 表2.欄位
  where condition
  group by
  having
  order by
  limit


2.3 子查詢

(1)子查詢是將一個查詢語句巢狀在另一個查詢語句中。
(2)內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件。
(3)子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字
(4)還可以包含比較運算子:= 、 !=、> 、<等