MySQL基礎部分總結

MySQL

1、選擇數據庫

  1. use dbname
  2. show databases;

2、數據表

  1. show tables
  2. mysql> show columns from customers;
  3. mysql> desc customers;

3、show 語句

  1. show status
  2. show create databases
  3. show create table
  4. show grants

4、select 檢索

4.1.1版本後不再區分大小寫,但是爲了容易閱讀和調試,建議還是使用。

mysql> select cust_name from customers;
mysql> select cust_name cust_status from customers;
mysql> select distinct vend_id from products;
mysql> select prod_name from products limit 5;
mysql> select prod_name from products limit 5,5;
//分頁問題
從行0開始計數,limit5,5是從第5行開始(不包括第五行),取5行,結果是:6:10行
因爲這個很容易引起誤解,所以MySQL5開始支持另一個語法:limit 4 offset 3,意思是從行3開始取4行,等同於limit 3,4

4-1、排序數據

//單個字段排序
mysql> select prod_name from products order by  prod_name;
//多個字段排序,如果第一個字段全部唯一則第二個字段就不會生效
mysql> select prod_id,prod_price,prod_name from products order by prod_price ,prod_name;

4-2、指定排序方向

  • desc 降序
  • asc 升序-默認

注意順序,from>ordrr by >limit

mysql> select prod_id,prod_price,prod_name from products order by prod_price desc;
mysql> select prod_id,prod_price,prod_name from products order by prod_price asc;
mysql> select prod_price from products order by prod_price desc limit 1;

5、where 條件

相關操作符:

  1. = 等於
  2. <> 不等於
  3. != 不等於
  4. < 小於
  5. > 大於
  6. >= 大於或者等於
  7. <= 小於或等於
  8. between 兩者之間 and
and 的優先級大於or,需要處理or,則需要括號
mysql> select prod_price,prod_name from  products where prod_price = 2.50;
mysql> select prod_price,prod_name from  products where prod_price  between 5 and 10;
//  IS NULL
mysql> select cust_id from customers where cust_email is null;
重點:空值檢查
空值既是:NULL
MySQL中判斷是否是空值的子句是: IS NULL

example:

 mysql> select cust_id FROM customers  where cust_email IS NULL;    
+---------+
| cust_id |
+---------+
|   10002 |
|   10005 |
+---------+

6、where 數據過濾

(logical operator)邏輯操作符:and - or

mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 and prod_price<= 10;
mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002;

運算符優先級問題:
下列SQL中實際先運行 vend_id = 1002 and prod_price >= 10;,再運行vend_id = 1003.因爲and的優先級大於or,如果要按理想執行,加括號!

mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002 and prod_price >= 10;
mysql> select prod_id,prod_price,prod_name from products where (vend_id = 1003 or vend_id = 1002 )and prod_price >= 10;

6-1、 in操作符 (not in)

mysql> select prod_id,prod_price,prod_name from products where vend_id in (1002,1003) order by prod_name;

6-2、 or操作符

mysql> select prod_id,prod_price,prod_name from products where vend_id not in (1002,1003) order by prod_name;

7、用通配符過濾

like 和 _ 的區別是後者只能匹配一個字符

7-1、like

**注意NULL 雖然似乎 % 通配符可以匹配任何東西,但有一個例
外,即 NULL 。即使是 WHERE prod_name LIKE '%' 也不能匹配
用值 NULL 作爲產品名的行。**

mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE 'jet%';

mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE '%anv%';

7-2、_

mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE '_ ton anvil';

8、正則表達式

like是匹配全部,REGEXP可以匹配全部和部分

mysql> select prod_name  from products where prod_name ='JetPack 1000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

mysql> select prod_name from products where prod_name  REGEXP '1000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

默認不區分大小寫,需要區分大小寫binary

mysql> select prod_name from products where prod_name  REGEXP 'jetpack .000';
mysql> select prod_name from products where prod_name  REGEXP binary 'JetPack .000';

10、計算字段

  1. concat 合併 講兩個字段合併成一個新的字段
mysql> select concat (vend_name , 'C',vend_country,')') from vendors order by vend_name;
+-------------------------------------------+
| concat (vend_name , 'C',vend_country,')') |
+-------------------------------------------+
| ACMECUSA)                                 |
| Anvils R UsCUSA)                          |
| Furball Inc.CUSA)                         |
| Jet SetCEngland)                          |
| Jouets Et OursCFrance)                    |
| LT SuppliesCUSA)                          |
+-------------------------------------------+
6 rows in set (0.00 sec)
  1. rtrim (ltrim ,trim) 去掉空格
mysql> select concat (rtrim(vend_name) , 'C',vend_country,')') from vendors order by vend_name;
  1. as 別名
mysql> select concat (rtrim(vend_name) , '(',rtrim(vend_country),')') as vend_title   from vendors order by vend__name;
  1. 計算

+、-、* 、\

mysql> select quantity*item_price as expand_price from orderitems where order_num =20005;

11、函數

  1. trim、ltrim、rtrim 去掉空值
  2. Upper 轉爲大寫

mysql> select vend_name,upper(vend_name) as ven_name_upcase from vendors order by vend_name;

11-2 時間函數

  1. AddDate() 增加一個日期(天、周等)
  2. AddTime() 增加一個時間(時、分等)
  3. CurDate() 返回當前日期
  4. CurTime() 返回當前時間
  5. ==Date() 返回日期時間的日期部分==
  6. DateDiff() 計算兩個日期之差
  7. Date_Add() 高度靈活的日期運算函數
  8. Date_Format() 返回一個格式化的日期或時間串
  9. Day() 返回一個日期的天數部分
  10. DayOfWeek() 對於一個日期,返回對應的星期幾
  11. Hour() 返回一個時間的小時部分
  12. Minute() 返回一個時間的分鐘部分
  13. Month() 返回一個日期的月份部分
  14. Now() 返回當前日期和時間
  15. Second() 返回一個時間的秒部分
  16. Time() 返回一個日期時間的時間部分
  17. Year() 返回一個日期的年份部分

取9月某一天的數據

mysql> select cust_id,order_num from orders where Date(order_date) = '2005-09-01'; 
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
1 row in set (0.00 sec)

取9月整個月的訂單

mysql> select cust_id,order_num from orders where Date(order_date)  between '2005-09-01' and '2005-09-30'; 
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.00 sec)

mysql> select cust_id,order_num from orders where Year(order_date) and month(order_date) = 9;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.00 sec)

11-4 數值處理函數

  1. Abs() 返回一個數的絕對值
  2. Cos() 返回一個角度的餘弦
  3. Exp() 返回一個數的指數值
  4. Mod() 返回除操作的餘數
  5. Pi() 返回圓周率
  6. Rand() 返回一個隨機數
  7. Sin() 返回一個角度的正弦
  8. Sqrt() 返回一個數的平方根
  9. Tan() 返回一個角度的正切

11-5 聚集函數

  1. AVG() 返回某列的平均值
  2. COUNT() 返回某列的行數
  3. MAX() 返回某列的最大值
  4. MIN() 返回某列的最小值
  5. SUM() 返回某列值之和
  6. DISTINCT
mysql> select avg(prod_price) as avg_price from products;

分組數據

GROUP BY子句和HAVING子句

mysql> select vend_id,count(*) as num_prods from products group by vend_id; 
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.00 sec)

mysql> select vend_id,count(*) as num_prods from products group by vend_id with rollup;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
|    NULL |        14 |
+---------+-----------+
5 rows in set (0.00 sec)

having
唯一的差別是 WHERE過濾行,而HAVING過濾分組。WHERE在數據 分組前進行過濾,HAVING在數據分組後進行過濾
mysql> select vend_id,count(*) as num_prods from products group by vend_id having count(*)>=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.00 sec)


mysql> select vend_id,count(*) as num_prods from products where prod_price>=10  group by vend_id having count(*)>=2; 
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1003 |         4 |
|    1005 |         2 |
+---------+-----------+
2 rows in set (0.00 sec)

mysql> select order_num ,sum(quantity*item_price) as ordertotal from orderitems 
-> group by order_num
-> having sum(quantity*item_price) >= 50
-> order by ordertotal;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20006 |      55.00 |
|     20008 |     125.00 |
|     20005 |     149.87 |
|     20007 |    1000.00 |
+-----------+------------+
4 rows in set (0.00 sec)

順序
  • select
  • from
  • where
  • group by
  • having
  • order by
  • limit

12 子查詢

mysql>  select cust_id from orders where order_num in  (select order_num from orderitems where prod_id ='TNT2');
+---------+
| cust_id |
+---------+
|   10001 |
|   10004 |
+---------+

15 連接表

笛卡兒積(cartesian product)

如果將兩個表同時作爲數據源(from後的表名),不加任何的匹配條件,那麼產生的結果集就是一個迪卡爾積。
迪卡爾積的結果沒有意義,但是迪卡爾積是聯合查詢、連接查詢的基礎。

1. 交叉連接 cross join

使用表A中的1條記錄去表B中連接所有的記錄,就是笛卡爾積

2. 內連接

select 字段列表 from 表A 【inner】 join 表B ,匹配到的成功的記錄

3. 外連接 分爲左連接和右連接,

左連接保留左邊的所有,右邊匹配到的部分

4. using關鍵字

在進行連接時,如果進行連接的兩個字段的名子相同,則可以使用using using('cid')
當前筆記出自 《MySQL必知必會》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章