1. 程式人生 > >MySQL資料庫中的查詢技巧

MySQL資料庫中的查詢技巧

1.IN

mysql> select * from pet where name in('lzh','cyb');
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| cyb  | lzh   | Y    | 1996-05-25 |
| lzh  | cyb   | N    | 1996-03-24 |
+------+-------+------+------------+
2 rows in set (0.00 sec)

2.BETWEEN AND

mysql> select * from pet where birth BETWEEN '1996-05-25' and '2017-3-24';
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| lzk  | NULL  | Y    | 1996-10-01 |
| cyb  | lzh   | Y    | 1996-05-25 |
| HEHE | NULL  | Y    | 2017-03-24 |
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
+------+-------+------+------------+
5 rows in set (0.00 sec)

3.帶LIKE的字串匹配查詢
%:匹配一個或者多個字元,長度可以為0.
_:匹配一個字元。

mysql> select * from pet where name like 'l_k';
+------+-------+------+------------+
| name | owner | sex  | birth      |
+------+-------+------+------------+
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
| lzk  | NULL  | Y    | 1996-10-01 |
+------+-------+------+------------+
3 rows in set (0.00 sec) mysql> select * from pet where name like "l%"; +------+-------+------+------------+ | name | owner | sex | birth | +------+-------+------+------------+ | lzk | NULL | Y | 1996-10-01 | | leap | root | N | 1996-03-24 | | lzh | cyb | N | 1996-03-24 | | lzk | NULL | Y | 1996-10-01 | | lzk | NULL | Y | 1996-10-01 | +------+-------+------+------------+ 5 rows in set (0.00 sec)

4.用DISTINCT關鍵字取出結果中的重複行

mysql> select DISTINCT name from pet where name like "l%";
+------+
| name |
+------+
| lzk  |
| leap |
| lzh  |
+------+
3 rows in set (0.00 sec)

5.ORDER by +欄位名 //按什麼欄位進行排序.

6.使用 GROUP BY +欄位名表示以什麼什麼欄位進行分組,這樣分組中只會每組隨機顯示一個條目
另外我們可以使用GROUP_CONCAT(欄位)這樣就會將分組後指定的欄位的所有值都顯示出來

mysql> select * ,GROUP_CONCAT(name) from pet group by sex;
+------+-------+------+------------+----------------------+
| name | owner | sex  | birth      | GROUP_CONCAT(name)   |
+------+-------+------+------------+----------------------+
|      | NULL  | NULL | NULL       |                      |
| leap | root  | N    | 1996-03-24 | leap,lzh             |
| lzk  | NULL  | Y    | 1996-10-01 | lzk,cyb,HEHE,lzk,lzk |
+------+-------+------+------------+----------------------+

7.可以使用LIMIT限制查詢結果的數量。

使用方法:
select xx from table_name limit 2; //在所有的查詢記錄中取前兩條。
select xx from table_name limit n,m; //從編號為n的記錄中查詢三條記錄。

8.使用聚合函式進行查詢——count函式
對於除*以外的函式,返回所選擇集合中非NULL值的數目。
對於*返回所選擇集合中包含NULL值的數目。

9.連線查詢。
連線是指把不同表的記錄連到一起。
內連線查詢:內連線表示相等的連線,即連線後的表中某個欄位與每個表中的都相同。
外連結查詢:外連線是指使用OUTER,JOIN關鍵字將兩個表連線起來,外連線生成的結果集不僅包含符合連線條件的行資料,而且還包括左表、右表或兩邊連線表中所有的資料行。

SELECT 欄位名 from table_name 表1 LEFT|RIGHT JOIN 表2 ON 表1.欄位名=表2.欄位名 ;

mysql> select owner,information.passward,information.create_time from pet left join information on information.user=pet.name;
//左連線的特點是左表中有多少行,那麼最後匹配出來的條目就有多少條
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| NULL  | NULL     | NULL                |
| root  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
| lzh   | 666666   | 2017-03-30 17:36:50 |
| NULL  | NULL     | NULL                |
| cyb   | 999999   | 2017-03-27 17:47:47 |
| NULL  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
| NULL  | NULL     | NULL                |
+-------+----------+---------------------+
9 rows in set (0.02 sec)


//下面事以右連線的方式進行查詢.
mysql> select owner,information.passward,information.create_time from pet right join information on information.user=pet.name;
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| cyb   | 999999   | 2017-03-27 17:47:47 |
| lzh   | 666666   | 2017-03-30 17:36:50 |
+-------+----------+---------------------+
2 rows in set (0.00 sec)


//複合連線查詢
//複合連線查詢又稱為複合條件查詢,在連線查詢時,我們可以增加其他的限制條件,複合查詢的長度取決於最短的表。
mysql> select owner,information.passward,information.create_time from pet,information where information.user=pet.name;
+-------+----------+---------------------+
| owner | passward | create_time         |
+-------+----------+---------------------+
| lzh   | 666666   | 2017-03-30 17:36:50 |
| cyb   | 999999   | 2017-03-27 17:47:47 |
+-------+----------+---------------------+
2 rows in set (0.00 sec)

10.子查詢:所謂的子查詢就是SELECT查詢是另一個查詢的附屬,從MySQL4.1開始就可以巢狀多個查詢,在外一層的查詢中使用的是裡面一層查詢產生的結果集。
當遇到這樣的多層查詢時,MySQL從最內層的查詢開始,然後移動到外層,在這個過程中每個查詢產生的結果集都被賦給包圍它的父查詢

帶IN關鍵字的子查詢:IN關鍵字可以檢測結果中是否存在某個特定的值,如果檢測成功執行外部的查詢。

mysql> select * from information where user in(select name from pet);
               //父查詢                              //子查詢
+----+------+----------+---------------------+-------------+
| id | user | passward | create_time         | email       |
+----+------+----------+---------------------+-------------+
|  1 | lzh  | 999999   | 2017-03-27 17:47:47 | [email protected] |
|  2 | cyb  | 666666   | 2017-03-30 17:36:50 | [email protected] |
+----+------+----------+---------------------+-------------+

帶EXISTS關鍵字的子查詢;使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值(如果內層查詢到滿足條件的記錄,就返回true),當返回為true時,外層語句將進行查詢。

mysql> select * from information where exists(select * from pet where name="lzh");
+----+------+----------+---------------------+-------------+
| id | user | passward | create_time         | email       |
+----+------+----------+---------------------+-------------+
|  1 | lzh  | 999999   | 2017-03-27 17:47:47 | [email protected] |
|  2 | cyb  | 666666   | 2017-03-30 17:36:50 | [email protected] |
+----+------+----------+---------------------+-------------+
2 rows in set (0.00 sec)

使用正則表示式進行查詢
欄位名 REGEXP ‘匹配方式’

^:匹配以特定字串開頭的記錄。
$:匹配以特定字串結尾的記錄。
.:匹配字串的任意一個字元包括回車或者換行。
[字元set]:匹配字元集合中的任意一個字元。
[^字元set]:匹配字元集合以外的任意一個字元。
s1|s2|s3:匹配s1,s2,s3中的任意一個字串。
*:匹配多個該符號之前的字元,包括0個或者1個。
+:匹配多個符號之間前字元,包括0個。