基本SELECT語(yǔ)句語(yǔ)法
SELECT子句 表示所需檢索的數(shù)據(jù)列坛芽。
FROM子句 表示檢索的數(shù)據(jù)來(lái)自哪個(gè)表冠蒋。
語(yǔ)句(statement):一條完整的SQL命令如:
select * from emp;
–子句(clause):部分的SQL語(yǔ)句亡资,通常是由關(guān)鍵字加上其它語(yǔ)法元素構(gòu)成疚俱,例如渴杆,SELECT
* 是一個(gè)子句挠羔,F(xiàn)ROM table也是一個(gè)子句墓陈。
SQL語(yǔ)句的書寫規(guī)則
–不區(qū)分大小寫恶守,也就是說(shuō)SELECT,select贡必,Select兔港,執(zhí)行時(shí)效果是一樣的。
–可以單行來(lái)書寫仔拟,也可以書寫多行衫樊,建議分多行書寫,增強(qiáng)代碼可讀性利花,通常以子句為單位進(jìn)行分行科侈。
–關(guān)鍵字不可以縮寫、分開(kāi)以及跨行書寫炒事,如SELECT不可以寫成SEL或SELE
CT等形式兑徘。
–關(guān)鍵字最好使用大寫,其它語(yǔ)法元素(如列名羡洛、表名等)小寫挂脑。
–Tab和縮進(jìn)的使用可以提高程序的可讀性藕漱。
?選擇所有列的兩種方式
select * from 表名;
select deptno,dname,loc from dept;
練習(xí):
用兩種方式查詢salgrade表數(shù)據(jù)
選擇指定列
select 語(yǔ)句后列出要選擇的列的列表
如:select deptno,dname from dept;
練習(xí)1
?1.使用兩種方式查詢所有員工(EMP)信息
?2.查詢(EMP)員工編號(hào)、員工姓名崭闲、員工職位肋联、員工月薪、工作部門編號(hào)刁俭。
算術(shù)運(yùn)算符(+-*/)
算術(shù)運(yùn)算符優(yōu)先級(jí)
–乘除優(yōu)先于加減
–相同優(yōu)先權(quán)的表達(dá)式按照從左至右的順序依次計(jì)算
–括弧可以提高優(yōu)先權(quán)橄仍,并使表達(dá)式的描述更為清晰
例:SELECT ename, sal, 12*sal+100? FROM?? emp;
SELECT ename, sal, 12*(sal+100);
練習(xí)2
?1.員工轉(zhuǎn)正后,月薪上調(diào)20%牍戚,請(qǐng)查詢出所有員工轉(zhuǎn)正后的月薪侮繁。
?2.員工試用期6個(gè)月,轉(zhuǎn)正后月薪上調(diào)20%如孝,請(qǐng)查詢出所有員工工作第一年的年薪所得(不考慮獎(jiǎng)金部分,年薪的試用期6個(gè)月的月薪+轉(zhuǎn)正后6個(gè)月的月薪)
空值NULL
?空值NULL
–空值是指一種無(wú)效的宪哩、未賦值、未知的或不可用的值第晰。
–空值不同于零或者空格锁孟。
注意:任何包含空值的算術(shù)表達(dá)式運(yùn)算后的結(jié)果都為空值NULL。
1 select ename, 12*sal+comm
? 2? from?? emp
? 3? WHERE? ename='KING';
解決空值的方法
IFNULL函數(shù)
ifnull(expr1,expr2) ifnull函數(shù)如果第一個(gè)參數(shù)為空茁瘦,則返回expr2,否則返回expr1
上面語(yǔ)句改寫:
select ename,12*sal+ifnull(comm,0)
from emp
where ename='KING';
列別名
兩種寫法:
列名 as 列別名
列名 列別名
例:SELECT ename AS 姓名, sal 月薪
? FROM?? emp;
練習(xí)3
?員工試用期6個(gè)月品抽,轉(zhuǎn)正后月薪上調(diào)20%,請(qǐng)查詢出所有員工工作第一年的所有收入(需考慮獎(jiǎng)金部分)甜熔,要求顯示列標(biāo)題為員工姓名圆恤,工資收入,獎(jiǎng)金收入腔稀,總收入盆昙。
消除重復(fù)行
distinct關(guān)鍵字,在select 子句中使用
select distinct job from emp;
練習(xí)4
查詢員工表中一共有哪幾種崗位類型。
顯示表結(jié)構(gòu)兩種方式
desc 表名:
describe 表名:
練習(xí)5
分別查看員工表烧颖、部門表弱左、薪資等級(jí)表的表結(jié)構(gòu)窄陡。
*where子句
作用:指定查詢條件炕淮,限制顯示的數(shù)據(jù)行
語(yǔ)法:
SELECT [DISTINCT] {*| column | expression [alias], ...}
FROM ??table
[WHERE condition(s)];
?WHERE子句緊跟在FROM子句之后
?condition(s)表示條件表達(dá)式,
–通常格式為:列名 比較操作符 要比較的值
?比較操作符(> = <? ? > =? <= != <>)
比較數(shù)字相等
SELECT ename, job, deptno
? ?FROM?? emp
? WHERE? deptno=20;
比較字符或日期相等
字符串值需要加單引號(hào)
SELECT ename, job, deptno
? ?FROM?? emp
?WHERE?job='CLERK';
日期可以加單引也可以不加跳夭,不加單引時(shí)涂圆,合法的日期格式是yyyyMMdd/yyMMdd
-- 查詢1981-05-01之前入職的員工
select *
from emp
where HIREDATE<'1981-05-01'
select *
from emp
where HIREDATE<'19810501'
select *
from emp
where HIREDATE<19810501
特殊比較運(yùn)算符
?BETWEEN..AND..
值介于兩者之章,包括臨界值
如:查詢工資在1000到1500之間的員工信息
SELECT? *
? ?FROM? emp
? WHERE? sal BETWEEN 1000 AND 1500;
查詢1981年入職的員工信息
select *
from emp
where hiredate?BETWEEN? ‘1981-01-01’ AND ‘1981-12-31’
?IN運(yùn)算符
滿足條件的值比較多币叹,圈定一個(gè)范圍润歉,用in
如:查詢經(jīng)理編號(hào)為7902,7566,7788的員工信息
SELECT? empno, ename, sal, mgr
? ? FROM? emp
? ?WHERE? mgr IN (7902, 7566, 7788);
查詢?cè)?0,20,30號(hào)部門工作的員工信息
select *
from emp
where deptno in(10,20,30);
練習(xí)7
-- 1.查詢?nèi)肼毴掌谠?2年至85年的員工姓名,入職日期颈抚。
SELECT ename,hiredate FROM emp WHERE HIREDATE BETWEEN '1982-01-01' AND '1985-12-31'
-- ?2.查詢?cè)滦皆?000到5000的員工姓名踩衩,月薪。
SELECT ename,sal
from emp
where sal BETWEEN 3000 and 5000
-- ?3.查詢部門編號(hào)為10或者20的員工姓名,部門編號(hào)驱富。
SELECT ename,deptno
FROM emp
WHERE DEPTNO IN(10,20)
-- ?4.查詢經(jīng)理編號(hào)為7902, 7566, 7788的員工姓名锚赤,經(jīng)理編號(hào)。
SELECT ENAME,MGR
FROM emp
WHERE MGR in(7902,7566,7788)
特殊比較運(yùn)算符
?LIKE運(yùn)算符*
重要褐鸥,用于模糊查詢
–模糊查詢中兩個(gè)通配符:
–%代表零或任意更多的字符
–_代表一個(gè)字符
%與_可混用
可以使用ESCAPE標(biāo)識(shí)符實(shí)現(xiàn)對(duì)“%”和“_”的查找线脚。
–例:查詢JOB 以“MAN_”開(kāi)頭的雇員信息。
1 )查詢指定字符開(kāi)頭的用‘s%’
2)查詢指定字符結(jié)尾的用'%s'
3)查詢包含指定字符的用'%S%'
SELECT? ename,job
? ?FROM? emp
? WHERE? jobLIKE 'MAN@_%' ESCAPE '@';
查詢姓名倒數(shù)第三個(gè)字母為M的并且正數(shù)第三個(gè)也是M員工信息
SELECT *
FROM emp
WHERE ENAME LIKE '__M__'
OR ENAME LIKE '__M%M__';
SELECT *
FROM emp
WHERE ENAME LIKE '__M%' AND ENAME LIKE '%M__';
?IS NULL 運(yùn)算符
判斷要比較的值是否為空值NULL
如:查詢沒(méi)有經(jīng)理的員工
SELECT? ename, mgr
? ? FROM???emp
? ? WHERE??mgr IS NULL;
練習(xí)8
?1.查詢員工姓名以W開(kāi)頭的員工姓名叫榕。
select ename from emp where ename like 'w%';
?2.查詢員工姓名倒數(shù)第2個(gè)字符為T的員工姓名浑侥。
select ename from emp where ename like '%t_';
?3.查詢獎(jiǎng)金為空的員工姓名,獎(jiǎng)金晰绎。
SELECT ename, comm
FROM emp
WHERE comm is NULL;
邏輯運(yùn)算符
用于連接多個(gè)查詢條件
邏輯運(yùn)算符包括AND寓落、OR、NOT
?and (和,多個(gè)條件需要同時(shí)滿足)? ?
or(或者 多個(gè)條件滿足其中一個(gè))??
not(不是 反選 )
查詢部門編號(hào)為10或者20寒匙,并且姓名以w開(kāi)頭的員工信息
select *
from emp
where deptno in(10,20) and ename like 'w%';
查詢工資大于1000并且工作崗位為CLERK的員工信息
SELECT empno, ename, job, sal
? ? FROM?? emp
? ?WHERE? sal>=1000
? ? AND???job='CLERK';
查詢工資大于1000或者工作崗位為CLERK的員工信息
SELECT empno, ename, job, sal
? ? FROM?? emp
? ?WHERE? sal>=1000
? ? OR job='CLERK';
查詢工資大于1000或者工作崗位不為CLERK,MANAGER的員工信息
SELECT ename, job
? ?FROM?? emp
? ? WHERE?? sal>=1000 or
?job NOT IN ('CLERK','MANAGER','ANALYST');
–NOT運(yùn)算符可以和BETWEEN…AND零如、LIKE、IS NULL一起使用
?...WHERE deptno NOT IN (10, 20)
?...WHERE sal NOT BETWEEN 3000 AND 5000
?...WHERE ename NOT LIKE 'D%’
?...WHERE mgr IS NOT NULL
?運(yùn)算符的優(yōu)先級(jí)*
小括號(hào)優(yōu)先锄弱,實(shí)在記不住考蕾,用小括號(hào)括起
練習(xí)9
?1.查詢工資超過(guò)2000并且職位是MANAGER,或者職位是SALESMAN的員工姓名、職位会宪、工資
SELECT ENAME,JOB,SAL
FROM emp
WHERE SAL>2000 AND JOB='manager' or JOB='salesman'
?2.查詢工資超過(guò)2000并且職位是MANAGER或SALESMAN的員工姓名肖卧、職位、工資掸鹅。
SELECT ENAME,JOB,SAL
FROM emp
WHERE SAL>2000 AND (JOB='manager' or JOB='salesman')
?3.查詢部門在10或者20塞帐,并且工資在3000到5000之間的員工姓名、部門巍沙、工資葵姥。
select ename,deptno,sal
from emp
where? (deptno=10 or deptno=20) and sal BETWEEN 3000 and 5000;
?4.查詢?nèi)肼毴掌谠?1年,并且職位不是SALES開(kāi)頭的員工姓名句携、入職日期榔幸、職位。
select ename,hiredate,job from emp
where hiredate between '1981-01-01' and '1981-12-31'
and job not like 'sales%'
?5.查詢職位為SALESMAN或MANAGER矮嫉,部門編號(hào)為10或者20削咆,姓名包含A的員工姓名、職位蠢笋、部門編號(hào)拨齐。
SELECT ename,job,deptno
FROM emp
where job in('salesman','manager') and deptno in(10,20)
and ename like '%A%';
ORDER BY子句
對(duì)查詢結(jié)果進(jìn)行排序,寫在所有子句后
?其中:
–可以按照列名昨寞、表達(dá)式瞻惋、列別名厦滤、結(jié)果集的列序號(hào)排序
–ASC: 升序,默認(rèn)值 DESC: 降序
–ORDER BY 子句必須寫在SELECT語(yǔ)句的最后
如:
SELECT ename, job, deptno, hiredate,sal
FROM? ? ? emp
ORDER BY sal asc,hiredate DESC;
其結(jié)果先按薪水升序排序歼狼,薪水相同的再按出生日期降序
asc:升序 正序
desc :倒序 逆序
練習(xí)10
1.查詢部門在20或30的員工姓名馁害,部門編號(hào),并按照工資升序排序蹂匹。
SELECT ENAME,DEPTNO
FROM EMP
WHERE DEPTNO=20 OR DEPTNO=30
ORDER BY SAL ASC
2.查詢工資在2000-3000之間碘菜,部門不在10號(hào)的員工姓名,部門編號(hào)限寞,工資忍啸,并按照部門升序,工資降序排序履植。
SELECT ename,deptno,sal
FROM emp
where sal BETWEEN 2000 and 3000
and deptno <>10
ORDER BY deptno,sal DESC
3.查詢?nèi)肼毴掌谠?1年至83年之間计雌,職位以SALES或者M(jìn)AN開(kāi)頭的員工姓名,入職日期玫霎,職位凿滤,
并按照入職日期降序排序。
SELECT ename,hiredate,job
FROM emp
WHERE hiredate BETWEEN '1981-01-01' AND '1983-12-31'
AND (job like 'SALES%'
OR job like 'MAN%')
ORDER BY hiredate DESC
作業(yè):
練習(xí)6:
?1.查詢職位為SALESMAN的員工編號(hào)庶近、職位翁脆、入職日期。
select empno,job,hiredate
from emp
where job='SALESMAN'
?2.查詢1985年12月31日之前入職的員工姓名及入職日期鼻种。
select ename,hiredate
from emp
where hiredate <'1985-12-31'
?3.查詢部門編號(hào)不在10部門的員工姓名反番、部門編號(hào)。
select ename,deptno
from emp
where deptno <>10
課后習(xí)題:
-- 課后作業(yè)
1.查詢?nèi)肼殨r(shí)間在1982-7-9之后叉钥,并且不從事SALESMAN工作的員工姓名罢缸、入職時(shí)間、職位投队。
select ename,hiredate,job
from emp
where hiredate > '1982-07-09'
and job != 'SALESMAN'
2.查詢員工姓名的第三個(gè)字母是a的員工姓名枫疆。\
select ename
from emp
where ename like '__a%'
3.查詢除了10、20號(hào)部門以外的員工姓名敷鸦、部門編號(hào)息楔。
select ename,deptno
from emp
where deptno not in (10,20)
4.查詢部門號(hào)為30號(hào)員工的信息,先按工資降序排序轧膘,再按姓名升序排序钞螟。
select ename,deptno,sal
from emp
where deptno=30
ORDER BY sal DESC,ename ASC
5.查詢沒(méi)有上級(jí)的員工(經(jīng)理號(hào)為空)的員工姓名兔甘。
SELECT ename
FROM emp
WHERE mgr IS NULL
6.查詢工資大于等于4500并且部門為10或者20的員工的姓名\工資谎碍、部門編號(hào)。
SELECT ename,sal,deptno
FROM emp
where sal>=4500
AND (deptno=10
or deptno=20)
分頁(yè):
?使用select語(yǔ)句時(shí)洞焙,經(jīng)常要返回前幾條或者中間某幾行記錄蟆淀,可以使用關(guān)鍵字limit拯啦。語(yǔ)法格式如下:
select 字段列表
from 數(shù)據(jù)源
limit [start,]length;
start=(當(dāng)前頁(yè)碼-1)*每頁(yè)條數(shù)
以每頁(yè)5條為例
--第1頁(yè)? start=(1-1)*5=0
select * from emp limit 0,5;? ??
-- 第2頁(yè)?start=0=(2-1)*5=5
select * from emp limit 5,5;
-- 第3頁(yè)?start=0=(3-1)*5=10
SELECT * from emp limit 10,5;
## ordery by和limit的順序 ##?
limit在order by后面
SELECT * from emp order by empno limit 10,5 ;
作業(yè):
第4章 練習(xí)10,練習(xí)11和課后作業(yè)
練習(xí)10
?1.查詢部門在20或30的員工姓名熔任,部門編號(hào)褒链,并按照工資升序排序。
?2.查詢工資在2000-3000之間疑苔,部門不在10號(hào)的員工姓名甫匹,部門編號(hào),工資惦费,并按照部門升序兵迅,工資降序排序。
?3.查詢?nèi)肼毴掌谠?2年至83年之間薪贫,職位以SALES或者M(jìn)AN開(kāi)頭的員工姓名恍箭,入職日期,職位瞧省,并按照入職日期降序排序扯夭。
練習(xí)11
?1.查詢?nèi)肼毴掌谧钤绲那?名員工姓名,入職日期鞍匾。
SELECT ename,hiredate
from emp
ORDER BY HIREDATE
LIMIT 0,5;
?2.查詢部門編號(hào)為10并且入職日期最早的前2名員工姓名交洗,入職日期。
SELECT ename,hiredate
from emp
WHERE deptno=10
ORDER BY HIREDATE
LIMIT 0,2;
?3.按照每頁(yè)顯示5條記錄橡淑,分別查詢第1頁(yè)藕筋,第2頁(yè),第3頁(yè)信息梳码,要求顯示員工姓名隐圾、入職日期、部門編號(hào)掰茶。
SELECT ename,hiredate,deptno FROM emp
LIMIT 0,5;
SELECT ename,hiredate,deptno FROM emp
LIMIT 5,5;
預(yù)習(xí):第5章 字符串函數(shù)暇藏、日期函數(shù)、數(shù)學(xué)函數(shù)