MySQL DML語句

starive發表於2014-08-29

MySQL  DML語句

《深入淺出MySQL:資料庫開發、優化與管理維護(第二版)》
P34

插入記錄


  1. insert into tablename(field1, field2, ... , fieldn) values(value1, value2, value3, ... , valuen);

  2. mysql> insert into emp(ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
  3. Query OK, 1 row affected (0.03 sec)


不指名欄位:


  1. mysql> insert into emp values('lisa','2003-02-01','3000',2);
  2. Query OK, 1 row affected (0.02 sec)



預設欄位名插入:

  1. insert into emp(ename,sal) values(\'dony\',1000);

  2. mysql> insert into emp(ename,sal) values(\'dony\',1000);
  3. Query OK, 1 row affected (0.07 sec)

  1. mysql> select * from emp;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | lisa | 2003-02-01 | 3000.00 | 2 |
  7. | dony | NULL | 1000.00 | NULL |
  8. +-------+------------+---------+--------+
  9. 3 rows in set (0.01 sec)

一次性插入多條記錄:


  1. insert into tablename (field1, field2, ... , fieldn)
  2. values
  3. (record1_value1, record1_values2, ... , record1_valuesn),
  4. (record2_value1, record2_values2, ... , record2_valuesn),
  5. ...
  6. (recordn_value1, recordn_values2, ... , recordn_valuesn);

  7. insert into emp(ename,hiredate,sal,deptno) values('gao','2000-09-09',800.00,1),('lili','2000-09-09',300.00,1);
  1. insert into dept values(1,'tech'),(2,'sale'),(5,\'fin\'),(5,\'dept5\'),(6,\'dept6\');

更新記錄

  1. update tablename set field1=value1, field2 =value2, ......, fieldn =valuen [where condition]
  1. mysql> update emp set sal=4000.00 where ename='lisa';
  2. Query OK, 1 row affected (0.05 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0
  1. update emp a, dept b set a.sal=a.sal*b.deptno, b.deptname=a.ename where a.deptno=b.deptno;


刪除資料

  1. delete from tablename [where condition]
  1. mysql> delete from emp where ename='dony';
  2. Query OK, 1 row affected (0.04 sec)

一次刪除多個表的資料
  1. delete t1,t2, ... , tn from t1,t2, ... , tn [ where condition]

查詢記錄

查詢所有欄位

  1. select * from tablename [where condition]
  1. select ename, hiredate, sal, deptno from emp;
上面兩種等價。


查詢不重複的記錄: distinct


  1. mysql> select * from emp;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 |
  7. | lili | 2000-09-09 | 300.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. +-------+------------+---------+--------+
  10. 4 rows in set (0.00 sec)

  11. mysql> select distinct deptno from emp;
  12. +--------+
  13. | deptno |
  14. +--------+
  15. | 1 |
  16. | 2 |
  17. +--------+
  18. 2 rows in set (0.00 sec)

條件查詢

  1. mysql> select *from emp where deptno=and sal<3000;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | lili | 2000-09-09 | 300.00 | 1 |
  7. +-------+------------+---------+--------+
  8. 2 rows in set (0.00 sec)

排序和限制

  1. select * from tablename [where condition] [order by field1 [Desc | Asc], field2 [Desc | Asc],... ,fieldn [Desc | Asc]]
預設是Asc

  1. mysql> select * from emp order by sal;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | lili | 2000-09-09 | 300.00 | 1 |
  6. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  7. | gao | 2000-09-09 | 3000.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. +-------+------------+---------+--------+
  10. 4 rows in set (0.01 sec)

  1. mysql> select * from emp order by deptno, sal desc;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | gao | 2000-09-09 | 3000.00 | 1 |
  6. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  7. | lili | 2000-09-09 | 300.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. +-------+------------+---------+--------+
  10. 4 rows in set (0.00 sec)

顯示部分結果

select ...[LIMIT offset_start, row_count]

offset_start表示記錄的起始偏移量(預設為 0 ),row_count表示顯示的行數。


Eg: 按sal排序後顯示前3條記錄

  1. mysql> select * from emp order by sal limit 3;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | lili | 2000-09-09 | 300.00 | 1 |
  6. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  7. | gao | 2000-09-09 | 3000.00 | 1 |
  8. +-------+------------+---------+--------+
  9. 3 rows in set (0.00 sec)



顯示emp表中按照sal排序後從第二條記錄開始的3條記錄:

  1. mysql> select *from emp order by sal limit 1,3;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 |
  7. | lisa | 2003-02-01 | 3000.00 | 2 |
  8. +-------+------------+---------+--------+
  9. 3 rows in set (0.00 sec)



聚合操作


  1. select [field1, field2, ... , fieldn] fun_name
  2. from tablename
  3. [where condition]
  4. [group by field1, field2, ... , fieldn [with rollup ] ]
  5. [Having condition]
fun_name表示聚合操作: sum, count, max, min等等
group by 表示要進行分類聚合的欄位
having 關鍵字表示對分類後的結果再進行條件的過濾。
having 和where的區別是: having是對聚合後的結果進行條件的過濾,而where是在聚合前就對記錄進行過濾。


統計公司的總人數


  1. mysql> select count(1) from emp;
  2. +----------+
  3. | count(1) |
  4. +----------+
  5. | 4 |
  6. +----------+
  7. 1 row in set (0.02 sec)



在上面的基礎上,統計各個部門的人數


  1. mysql> select deptno, count(1) from emp group by deptno;
  2. +--------+----------+
  3. | deptno | count(1) |
  4. +--------+----------+
  5. | 1 | 3 |
  6. | 2 | 1 |
  7. +--------+----------+
  8. 2 rows in set (0.00 sec)


既要統計各部門人數,又要統計總人數:

  1. mysql> select deptno,count(1) from emp group by deptno with rollup;
  2. +--------+----------+
  3. | deptno | count(1) |
  4. +--------+----------+
  5. | 1 | 3 |
  6. | 2 | 1 |
  7. | NULL | 4 |
  8. +--------+----------+
  9. 3 rows in set (0.00 sec)



統計人數大於1人的部門:

  1. mysql> select deptno,count(1) from emp group by deptno having count(1)>1;
  2. +--------+----------+
  3. | deptno | count(1) |
  4. +--------+----------+
  5. | 1 | 3 |
  6. +--------+----------+
  7. 1 row in set (0.00 sec)



最後統計公司所有員工的薪水總額、最高和最低薪水:

  1. mysql> select sum(sal),max(sal),min(sal) from emp;
  2. +----------+----------+----------+
  3. | sum(sal) | max(sal) | min(sal) |
  4. +----------+----------+----------+
  5. | 8300.00 | 3000.00 | 300.00 |
  6. +----------+----------+----------+
  7. 1 row in set (0.00 sec)



表連線

分為內連線和外連線,它們之間最主要的區別是:內連線僅選出兩張表中互相匹配的記錄,而外連線會選出其他不匹配的記錄。我們最常用的的是內連線。

  1. mysql> select *from emp;
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 |
  7. | lili | 2000-09-09 | 300.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. | dony | 2005-09-09 | 2000.00 | 4 |
  10. +-------+------------+---------+--------+
  11. 5 rows in set (0.00 sec)


  12. mysql> select * from dept;
  13. +--------+----------+
  14. | deptno | deptname |
  15. +--------+----------+
  16. | 1 | zzx1 |
  17. | 5 | fin |
  18. | 5 | dept5 |
  19. | 6 | dept6 |
  20. | 2 | sale |
  21. +--------+----------+
  22. 5 rows in set (0.01 sec)


  23. mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
  24. +-------+----------+
  25. | ename | deptname |
  26. +-------+----------+
  27. | zzx1 | zzx1 |
  28. | gao | zzx1 |
  29. | lili | zzx1 |
  30. | lisa | sale |
  31. +-------+----------+
  32. 4 rows in set (0.00 sec)



外連線分為左連線和右連線:

左連線: 包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄。
右連線: 包含所有的右邊表中的記錄甚至是左邊表中沒有和它匹配的記錄。

左連線:


  1. mysql> select ename, deptname from emp left join dept on emp.deptno=dept.deptno;
  2. +-------+----------+
  3. | ename | deptname |
  4. +-------+----------+
  5. | zzx1 | zzx1 |
  6. | gao | zzx1 |
  7. | lili | zzx1 |
  8. | lisa | sale |
  9. | dony | NULL |
  10. +-------+----------+
  11. 5 rows in set (0.00 sec)



右連線:


  1. mysql> select ename, deptname from emp right join dept on dept.deptno=emp.deptno;
  2. +-------+----------+
  3. | ename | deptname |
  4. +-------+----------+
  5. | zzx1 | zzx1 |
  6. | gao | zzx1 |
  7. | lili | zzx1 |
  8. | NULL | fin |
  9. | NULL | dept5 |
  10. | NULL | dept6 |
  11. | lisa | sale |
  12. +-------+----------+
  13. 7 rows in set (0.00 sec)


子查詢

從emp表中查詢所有部門在dept表中的所有記錄:


  1. mysql> select * from emp where deptno in(select deptno from dept);
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 |
  7. | lili | 2000-09-09 | 300.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. +-------+------------+---------+--------+
  10. 4 rows in set (0.01 sec)



如果子查詢記錄數唯一,還可以用 = 代替 in :

  1. mysql> select * from emp where deptno = (select deptno from dept);
  2. ERROR 1242 (21000): Subquery returns more than 1 row
  3. mysql> select * from emp where deptno = (select deptno from dept limit 1);
  4. +-------+------------+---------+--------+
  5. | ename | hiredate | sal | deptno |
  6. +-------+------------+---------+--------+
  7. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  8. | gao | 2000-09-09 | 3000.00 | 1 |
  9. | lili | 2000-09-09 | 300.00 | 1 |
  10. +-------+------------+---------+--------+
  11. 3 rows in set (0.00 sec)




某些情況下,子查詢可以轉化為表連線,例如:

  1. mysql> select *from emp where deptno in(select deptno from dept);
  2. +-------+------------+---------+--------+
  3. | ename | hiredate | sal | deptno |
  4. +-------+------------+---------+--------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 |
  7. | lili | 2000-09-09 | 300.00 | 1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 |
  9. +-------+------------+---------+--------+
  10. 4 rows in set (0.00 sec)



轉為表連線後:

  1. mysql> select *from emp ,dept where emp.deptno=dept.deptno;
  2. +-------+------------+---------+--------+--------+----------+
  3. | ename | hiredate | sal | deptno | deptno | deptname |
  4. +-------+------------+---------+--------+--------+----------+
  5. | zzx1 | 2000-01-01 | 2000.00 | 1 | 1 | zzx1 |
  6. | gao | 2000-09-09 | 3000.00 | 1 | 1 | zzx1 |
  7. | lili | 2000-09-09 | 300.00 | 1 | 1 | zzx1 |
  8. | lisa | 2003-02-01 | 3000.00 | 2 | 2 | sale |
  9. +-------+------------+---------+--------+--------+----------+
  10. 4 rows in set (0.01 sec)




記錄聯合

將兩個表的資料按照一定的查詢條件查詢出來後,將結果合併在一起顯示出來,語法如下:

  1. select * from t1
  2. union | union all
  3. select * from t2
  4. ...
  5. union | union all
  6. select * from tn


union和union all的主要區別是union all是把結果直接合並在一起,而union是將union all後的結果進行一次distinct,去除重複記錄後的結果。


  1. mysql> select deptno from emp
  2.     -> union all
  3.     -> select deptno from dept;
  4. +--------+
  5. | deptno |
  6. +--------+
  7. | 1 |
  8. | 1 |
  9. | 1 |
  10. | 2 |
  11. | 4 |
  12. | 1 |
  13. | 5 |
  14. | 5 |
  15. | 6 |
  16. | 2 |
  17. +--------+
  18. 10 rows in set (0.00 sec)


  19. mysql> select deptno from emp
  20.     -> union
  21.     -> select deptno from dept;
  22. +--------+
  23. | deptno |
  24. +--------+
  25. | 1 |
  26. | 2 |
  27. | 4 |
  28. | 5 |
  29. | 6 |
  30. +--------+
  31. 5 rows in set (0.00 sec)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26435490/viewspace-1259907/,如需轉載,請註明出處,否則將追究法律責任。

相關文章