SELECT語句是最常用的查詢語句,它的使用方式有些複雜,但功能卻相當強大。SELECT語句的基本文法如下:
select selection_list//要查詢的内容,選擇哪些列
from資料表名//指定資料表
where primary_constraint//查詢時需要滿足的條件,行必須滿足的條件
group by grouping_columns//如何對結果進行分組
order by sorting_cloumns//如何對結果進行排序
having secondary_constraint//查詢時滿足的第二條件
limit count//限定輸出的查詢結果
LIKE屬于較常用的比較運算符,通過它可以實作模糊查詢。它有兩種通配符:“%”和下劃線“_”:
“%”可以比對一個或多個字元,可以代表任意長度的字元串,長度可以為0。例如,“明%技”表示以“明”開頭,以“技”結尾的任意長度的字元串。該字元串可以代表明日科技、明日程式設計科技、明日圖書科技等字元串。
“_”隻比對一個字元。例如,m_n表示以m開頭,以n結尾的3個字元。中間的“_”可以代表任意一個字元。
select * from tb_login where user like '%mr%';
使用distinct關鍵字可以去除查詢結果中的重複記錄
select distinct 字段名 from 表名;
通過GROUP BY子句可以将資料劃分到不同的組中,實作對記錄的分組查詢。在查詢時,所查詢的列必須包含在分組的列中,目的是使查詢到的資料沒有沖突。
1.使用GROUP BY關鍵字來分組
單獨使用GROUP BY關鍵字,查詢結果隻顯示每組的一條記錄。
2.GROUP BY關鍵字與GROUP_CONCAT()函數一起使用
使用GROUP BY關鍵字和GROUP_CONCAT()函數查詢,可以将每個組中的所有字段值都顯示出來。
SELECT group_concat(id,district), service_type FROM hotel_supporting_service group by service_type;
ps:後六位是district,前面的是id

3.按多個字段進行分組
使用GROUP BY關鍵字也可以按多個字段進行分組。
聚合函數的最大特點是能夠根據一組資料求出一個值。聚合函數的結果值隻根據標明行中非NULL的值進行計算,NULL值被忽略。
select count (*)from tb_login;
select sum (row) from tb_book;
select avg(row) from tb_book;
select max(row) from tb_book;
select min(row) from tb_book;
内連接配接是最普遍的連接配接類型,而且是最勻稱的,因為它們要求構成連接配接的每一部分的每個表都比對,不比對的行将被排除。
内連接配接的最常見的例子是相等連接配接,也就是連接配接後的表中的某個字段與每個表中的都相同。這種情況下,最後的結果集隻包含參加連接配接的表中與指定字段相符的行。
select name, books from tb_login, tb_book where tb_login.user=tb_book.user;
與内連接配接不同,外連接配接是指使用OUTER JOIN關鍵字将兩個表連接配接起來。外連接配接生成的結果集不僅包含符合連接配接條件的行資料,而且還包括左表(左外連接配接時的表)、右表(右外連接配接時的表)或兩邊連接配接表(全外連接配接時的表)中所有的資料行。文法格式如下:
SELECT 字段名稱 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.字段名1=表名2.屬性名2;
外連接配接分為左外連接配接(LEFT JOIN)、右外連接配接(RIGHT JOIN)和全外連接配接3種類型。
1.左外連接配接
左外連接配接(LEFT JOIN)是指将左表中的所有資料分别與右表中的每條資料進行連接配接組合,傳回的結果除内連接配接的資料外,還包括左表中不符合條件的資料,并在右表的相應列中添加NULL值。
select h.id,h.hotel_id,hp.id,hp.hotel_id
from hotel_supporting_service as h
left join hotel_supporting_service_protocol
as hp on hp.src_id = h.id;
2.右外連接配接
右外連接配接(RIGHT JOIN)是指将右表中的所有資料分别與左表中的每條資料進行連接配接組合,傳回的結果除内連接配接的資料外,還包括右表中不符合條件的資料,并在左表的相應列中添加NULL。
right join hotel_supporting_service_protocol
在連接配接查詢時,也可以增加其他的限制條件。通過多個條件的複合查詢,可以使查詢結果更加準确。
as hp on hp.src_id = h.id where h.id>6;
ps: select h.id,h.hotel_id,hp.id,hp.hotel_id
from hotel_supporting_service as h
left join hotel_supporting_service_protocol
as hp on hp.src_id = h.id查出來後做過濾
子查詢就是SELECT查詢中的另一個查詢的附屬。可以嵌套多個查詢,在外面一層的查詢中使用裡面一層查詢産生的結果集。這樣就不是執行兩個(或者多個)獨立的查詢,而是執行包含一個(或者多個)子查詢的單獨查詢。
當遇到這樣的多層查詢時,MySQL從最内層的查詢開始,然後從它開始向外向上移動到外層(主)查詢,在這個過程中每個查詢産生的結果集都被賦給包圍它的父查詢,接着這個父查詢被執行,它的結果也被指定給它的父查詢。
除了結果集經常由包含一個或多個值的一列組成外,子查詢和正常SELECT查詢的執行方式一樣。子查詢可以用在任何可以使用表達式的地方,它必須由父查詢包圍,而且,如同正常的SELECT查詢,它必須包含一個字段清單(這是一個單列清單)、一個具有一個或者多個表名字的FROM子句以及可選的WHERE、HAVING和GROUP BY子句。
select * from tb_login where user in (select user from tb_book);
select id, books, row from tb_book where row>= (select row from tb_row where id=1);
--查詢如果tb_row表中存在name值為“優秀”的記錄,則查詢tb_book表中row字段大于等于90的記錄。
select id, books, row from tb_book where row>=90 and exists (select*from tb_row where name='優秀'); (ps:使用EXISTS關鍵字時,内層查詢語句不傳回查詢的記錄。而是傳回一個真假值。如果内層查詢語句查詢到滿足條件的記錄,就傳回一個真值(true),否則,将傳回一個假值(false)。當傳回的值為true時,外層查詢語句将進行查詢;當傳回的值為false時,外層查詢語句不進行查詢或者查詢不出任何記錄。)
select books, row from tb_book where row<ANY (select row from tb_row); (ps:ANY關鍵字表示滿足其中任意一個條件。使用ANY關鍵字時,隻要滿足内層查詢語句傳回的結果中的任意一個,就可以通過該條件來執行外層查詢語句。)
select books, row from tb_book where row>=ALL (select row from tb_row);(ps:ALL關鍵字表示滿足所有條件。使用ALL關鍵字時,隻有滿足内層查詢語句傳回的所有結果,才可以執行外層查詢語句。)
合并查詢結果是将多個SELECT語句的查詢結果合并到一起。因為某種情況下,需要将幾個SELECT語句查詢出來的結果合并起來顯示。合并查詢結果使用UNION和UNION ALL關鍵字。UNION關鍵字是将所有的查詢結果合并到一起,然後去除相同記錄;而UNION ALL關鍵字則隻是簡單地将結果合并到一起。
select user from tb_book UNION select user from tb_login;
select user from tb_book UNION ALL select user from tb_login;
正規表達式是用某種模式去比對一類字元串的一個方式。正規表達式的查詢能力比通配字元的查詢能力更強大,而且更加靈活。
在MySQL中,使用REGEXP關鍵字來比對查詢正規表達式。其基本形式如下:
字段名REGEXP'比對方式'
“字段名”參數表示需要查詢的字段名稱;
“比對方式”參數表示以哪種方式來進行比對查詢。
SELECT * FROM info WHERE name REGEXP '[ceo]';
SELECT * FROM info WHERE name REGEXP 'a*c';
SELECT * FROM info WHERE name REGEXP 'a+c';