MySQL數據庫筆記2——簡單查詢、條件查詢、模糊查詢及分組函數

1.簡單的查詢語句(DQL)
   語法格式:select 字段名1,字段名2… from 表名;
   注意:
      (1)任何一條sql語句以“;”結尾。
      (2)sql語句不區分大小寫。
      (3)字段可以參與數據運算。如:select ename,sal*12 as ‘年薪’ from emp;
      (4)標準sql語句中要求字符串使用單引號括起來,雖然mysql支持雙引號,但儘量別用。
      (5)取別名時,as關鍵字可以省略。如:select ename,sal*12 ‘年薪’ from emp;
      (6)select * from emp; //實際開發中不建議使用*,效率較低。
2.條件查詢
   語法格式:select 字段名1,字段名2… from 表名 where 條件;

支持如下運算符:
在這裏插入圖片描述
注意:
   (1)between…and…是閉區間,且在使用的時候必須左小右大。
   (2)between…and…還可以用在字符串方面,此時它屬於左閉右開區間。如:select ename from emp where ename between ‘A’ and ‘D’;
   (3)在數據庫中,NULL不是一個值,代表什麼也沒有,爲空,其不等於0,不能用等號衡量,必須使用is null或者is not null。
   (4)and的優先級大於or,當運算符的優先級不確定的時候加小括號。
   (5)in等同於or,in後面的值不是區間,是具體的值。如:select ename,job from emp where job=‘SALESMAN’ or job=‘MANAGER’;等同於select ename,job from emp where job in(‘SALESMAN’,‘MANAGER’);
3.模糊查詢like
   在模糊查詢中,必須掌握兩個特殊的符號,一個是‘%’,一個是‘_’。
   ‘%’代表任意多個字符,‘_’代表1個字符。
如:
(1)找出名字中第三個字母是A的?
   select ename from emp where ename like ‘__A%’;
(2)找出名字中帶下劃線的?
   select ename from emp where ename like ‘%\_%’;     //使用了轉義字符
4.排序(升序、降序)
   asc表示升序,desc表示降序。order by默認升序。
(1)按照工資升序,找出員工名和薪資?
   select ename,sal from emp order by sal;    //order by默認升序
(2)按照工資降序,找出員工名和薪資?
   select ename,sal from emp order by sal desc;
(3)按照工資降序排列,當工資相同時再按照名字的升序排列?
   select ename,sal from emp order by sal desc,ename asc;    //越靠前的字段越能起到主導作用,只有當前面的字段無法完成排序的時候(相等的時候),纔會啓用後面的字段。
(4)找出工作崗位是SALESMAN的員工,並且要求按照薪資的降序排列?
   select ename,job,sal from emp where job=‘SALESMAN’ order by sal desc;    //先from,後where,再select,最後order
5.分組函數(多行處理函數)
分組函數一共只有五個:
在這裏插入圖片描述
記住:(1)所有的分組函數都是對“某一組”數據進行操作的。如:
找出工資總和?
   select sum(sal) from emp;
找出工資總和總人數?
   select count() from emp;
   select count(ename) from emp;
(2)分組函數自動忽略NULL。如:count不將值爲NULL的計算在內,count(
)和count(某個字段)得到的結果可能不一樣。
(3)多行處理函數:輸入多行,輸出一行;單行處理函數:輸入一行,輸出一行。
(4)sql語句中有一語法規則,分組函數不可直接使用在where子句當中。如:select ename,sal from emp where sal>avg(sal);這是錯誤的。改正:select ename,sal from emp where sal>(select avg(sal) from emp);
6.單行處理函數
ifnull()函數:可能爲NULL的數據,被當做什麼處理。
如:計算每個員工的年薪?
select ename,(sal+comm)*12 as yearsal from emp; //這是不當的,因爲comm可能爲NULL,所有數據庫都是這樣規定的:只要有NULL參與的運算結果一定是NULL
改正:select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
7.分組查詢group by、having
      group by:按照某個字段或者某些字段進行分組。having:對分組之後的數據進行再次過濾。
(1)分組函數一般都會和group by聯合使用,這也是爲什麼被稱爲分組函數的原因,並且任何一個分組函數都是在group by語句執行結束之後纔會執行的,這也是爲什麼分組函數不能用在where中使用的原因(沒有group by的sql語句中實際上存在一個缺省的group by語句)。當一條sql語句沒有group by的話,整張表的數據會自成一組。如:找出每個工作崗位的最高薪資?
select max(sal) from emp group by job;
sql語句執行順序
上圖表示SQL語句中各子句的執行順序。
(2)select ename,max(sal),job from emp group by job;這條sql語句在MySQL當中查詢結果是有的,但是結果沒有意義,ename結果是亂的,在Oracle數據庫中會報錯;Oracle的語法規則比MySQL語法規則嚴謹。記住:當一條語句中有group by的時候,select後面只能跟分組函數和參與分組的字段
(3) 多個字段可以聯合起來一起分組。如:select max(sal),deptno,job from emp group by deptno,job;
(4)having的使用,having不能單獨使用,必須跟着group by一起使用。建議:能夠使用where過濾的儘量使用where,where的效率比較高。select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;這是不得不用having過濾的例子。
8.關於查詢結果集的去重
(1)select distinct job from emp;
(2)select ename,distinct job from emp;   //錯誤distinct只能出現在所有字段的最前面
(3)select distinct deptno,job from emp;   //deptno與job聯合起來去重
(4)統計崗位的數量?
select count(distinct job) from emp;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章