2、DQL語言
2、DQL語言
DQL(Data Query Language)資料查詢語言
2.1.基礎查詢
語法:select 查詢列表 from 表名;
注:①起別名:select 查詢列表 as 別名 from 表名;
②去重:select distinct 查詢列表 from 表名;
③著重號" "用來區分關鍵字和欄位
2.2.條件查詢
語法:select 查詢列表 from 表名
where 篩選條件;
篩選條件:①按條件篩選,條件運算子> < != >= <=
②按邏輯表示式篩選,邏輯運算子 and(與) or(或) not(非)
③模糊查詢 like between and in is null is not null
注:①%為萬用字元,表示任意多個字元,包含0個字元,通常與like 搭配使用;_也為萬用字元,表示任意單個字元
②安全等於<=>,用於判斷是否等於,相當於=,可用於判斷null值
例1: 查詢工資大於12000的員工資訊
select * from employees
where salary>12000;
例2:查詢員工姓名包含字元a的員工資訊
select * from employees
where last_name like '%a%';
例3:查詢員工編號在100-120之間的員工資訊
select * from employees
where employee_id between 100 and 120;
例4:查詢員工的工種編號為 IT、AD、SQL中的一個的員工名和工種編號
select last_name, job_id from employees
where job_id in('IT','AD','SQL');
例5:查詢沒有獎金的員工名和獎金率
select last_name,commision_pact from employees
where commision_pact is null;
2.3.排序查詢
語法:select 查詢列表 from 表名
where 篩選條件
order by 排序列表 asc/desc;
注:①asc表示升序,desc表示降序,不寫預設asc升序
②order by 一般放在最後,limit字句除外
③order by 可支援單個欄位、多個欄位、表示式、函式、別名進行排序
④排序除了order by 還有sort by,distribute by,cluster by
例6:查詢員工的姓名、部門號、年薪,按年薪降序,按姓名升序
select last_name,department_id,salary*12*(1+ifnull(commision_pact,0)) 年薪
from employees
order by 年薪 desc,last_name asc;
2.4常見函式
字元函式:length(),表示獲取位元組的個數
concat(),表示拼接字元
upper(),lower(),表示轉換大小寫
substr(),表示擷取字串,索引從1開始
instr(),表示子串第一次出現的索引,如果找不到返回0
trim(),表示去前後空格,中間的不能去
repalce(),表示替換
數學函式:round(),四捨五入
ceil(),向上取整;floor(),向下取整
truncate(數值,小數點後保留位數),截斷
mod(被除數,除數),取餘
日期函式:now(),返回當前系統日期+時間
str_to_date(),將日期格式的字元轉化為指定格式日期
date_format(),將日期轉化為字元
其他函式:versin(),版本號;database(),資料庫
流程控制函式:if(條件表示式,真值,假值)
case函式:語法一 case 要判斷的表示式
when 常量1 then 要顯示的值1
……
else 要顯示的值n
end;
語法二 case
when 條件1 then 要顯示的值1
……
else 要顯示的值n
end case;
分組函式:sum()、avg()、max()、min()、count()
2.5分組查詢
語法1:select 分組函式 from 表名
where 篩選條件
group by 分組列表 #分組前查詢,分組列表可為多個欄位
order by 子句;
語法2:select 分組函式 from 表名
where 篩選條件
order by 子句
having by 分組列表 #分組後查詢;
2.6連線查詢(多表查詢)
SQL99標準的語法:select 查詢列表
from 表1 別名
連線型別 jion 表2 別名
on 連線條件
[where 篩選條件];
分類:內連線、左外連線、右外連線、全外連線
內連線:查詢交集部分 select 查詢列表
from 表1 別名A
inner jion 表2 別名B
on A.key=B.key;
左外連線:查詢左邊主表A select 查詢列表
from 主表1 別名A
left jion 從表2 別名B
on A.key=B.key;
右外連線:查詢右邊主表B select 查詢列表
from 從表1 別名A
right jion 主表2 別名B
on B.key=A.key;
全連線:查詢表A和B select 查詢列表
from 表1 別名A
full jion 表2 別名B
on A.key=B.key;
2.7 子查詢
含義:出現在其他語句的select查詢語句,稱為子查詢或內查詢
分類:select後面僅僅支援標量子查詢
from後面支援表子查詢
where或having後面支援標量子查詢,列子查詢,行子查詢
exists後面支援表子查詢
例1:查詢最低工資大於50號部門最低工資的部門id和最低工資
①查詢50號部門最低工資
select min(salary)
from employees
where department_id=50;
②組合起來
select department_id,min(salary)
from employees
group by department_id
having min(salary)>(
select min(salary)
from employees
where department_id=50;
);
例2:查詢每個部門的員工數
select d.*,(
select count(*)
from employees e
where e.department_id=d.department_id;
) 員工數
from department d;
例3:查詢每個部門的平均工資的等級
①查詢每個部門的平均工資
select avg(salary),department_id
from employees
group by department_id;
②組合起來
select ag_dep.*,g.grade_level
from(
select avg(salary),department_id
from employees
group by department_id;
) ag_dep
inner jion job_grades g
on ag_dep.ag between lowest_sal and highest_sal;
2.8分頁查詢
語法:select 查詢列表
from 表
limit offset,size; #offset為起始索引,從0開始;size為要顯示的條目數,limit子句要放在查詢語句最後
例:查詢有獎金的員工資訊,顯示工資最高的前10名
select *
from employess
where commison_pct is not null
order by salary desc
limit 10;
2.9 聯合查詢
語法:查詢語句1
union
查詢語句2
……
特點:要查詢的結果來自多表;要求查詢語句的列一致,型別和順序一致;union預設去重,union all 可以包含重複項
例:查詢中國使用者男性資訊和外國使用者男性資訊
select c_id,c_name,c_sex
from china
where c_sex="男"
union
select t_id,t_name,t_gender
from tokoyo
where t_gender="male";