1. 程式人生 > 其它 >Mysql語法入門與進階

Mysql語法入門與進階

1. Mysql語法分類

  1. DDL:資料定義語言(Data Define Language):create(建立),alter(修改),drop(刪除),TRUNCATE(截斷),RENAME(重新命名);

  2. DML:select(查詢),delete(刪除),update(更新),insert(新增);

  3. DCL:grant(新增許可權),revoke(回收許可權);





2. 資料表操作

2.1 修改表名

alter table 舊錶名 rename to 新表名;

2.2 增加一列

alter table 表名 add 新列名 欄位型別 [欄位選項];

2.3 刪除一列

alter table 表名 drop 欄位名;

2.4 修改列型別

alter table 表名 modify 欄位名 新的欄位型別 [新的欄位選項];

2.5 修改列名稱

alter table 表名 change 原欄位名 新欄位名 新的欄位型別 [新的欄位選項];





3. 資料操作

SQL完整語法:select * from user where group by having order by limit

3.1 ifnull

注意:只要有null參與的運算,結果一定為null

select name,(sal+comm)*12 as yearsql from emp;

# 解決辦法:ifnull()空處理函式
select name,(sal+ifnull(comm,0))*12 as yearsql from emp;

3.2 count(id)與count(*)與count(1)

  • count(*):對行的資料進行計算,包含NULL
  • count(1):和上述一樣
  • count(column):對特定列進行計算,不包含NULL

3.3 where後面不能用聚合函式




4. 關於group by,having

分組函式:按照某個欄位或某些欄位進行分組。
having:對分組之後的資料進行再次過濾。

如:找出每個工作崗位的最高薪資

1. select XXXXXX from emp group by job;  # 先分組
2. select max(sql) from emp group by job;  # 查詢出來的只要最高工資,不知道最高工資屬於誰

3. select ename,max(sal),job from emp group by job;  # 雖然查出來了人,但是資料有問題,ename是從該job分組裡面取的一個人的enma,不一定恰好就是最高工資那個人的名字

4. 結論:當一條sql語句有group by的時候。select 後面只能跟分組欄位,或聚合函式(max,avg..)   否則查詢出來的結果毫無意義0

如:找出每個部門的最高薪資,要求只顯示薪資大於3000的資料【能用where代替having的情況

# 效率低
select max(sal),detptno from emp group by deptno having max(sal) > 3000;

# 效率高
select max(sql),deptno from emp where sal > 3000 group by deptno;

如:找出每個部門的平均薪資,要求只顯示薪資大於3000的資料【不能用where代替having的情況

select deptno,avg(sql) from emp group by deptno having avg(sal) > 3000