一刁俭、結(jié)構(gòu)化查詢(xún)語(yǔ)言
結(jié)構(gòu)化查詢(xún)語(yǔ)言簡(jiǎn)介
結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language)簡(jiǎn)稱(chēng)SQL, 是操作和檢索關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言远剩,20世紀(jì)70年代由IBM公司開(kāi)發(fā),目前應(yīng)用于各種關(guān)系型數(shù)據(jù)庫(kù)。
結(jié)構(gòu)化查詢(xún)語(yǔ)言分類(lèi)
結(jié)構(gòu)化查詢(xún)語(yǔ)言可分為5類(lèi):
? 數(shù)據(jù)查詢(xún)語(yǔ)言(DQL:Data Query Language):語(yǔ)句主要包括SELECT,用于從表中檢索數(shù)據(jù)。
? 數(shù)據(jù)操作語(yǔ)言(DML:Data Manipulation Language):語(yǔ)句主要包括INSERT讨韭,UPDATE和DELETE,用于添加,修改和刪除表中的行數(shù)據(jù)透硝。
? 事務(wù)處理語(yǔ)言(TPL:Transaction Process Language): 語(yǔ)句主要包括COMMIT和ROLLBACK吉嚣,用于提交和回滾。
? 數(shù)據(jù)控制語(yǔ)言(DCL:Data Control Language):語(yǔ)句主要包括GRANT和REVOKE蹬铺,用于進(jìn)行授權(quán)和收回權(quán)限尝哆。
? 數(shù)據(jù)定義語(yǔ)言(DDL:Data Definition Language):語(yǔ)句主要包括CREATE、DROP甜攀、ALTER秋泄,用于定義、銷(xiāo)毀规阀、修改數(shù)據(jù)庫(kù)對(duì)象恒序。
二、基本SELECT語(yǔ)句
基本SELECT語(yǔ)句語(yǔ)法
SELECT [DISTINCT]{*|column|expression [alias],...}
FROM table;
SELECT 子句 表示所需檢索的數(shù)據(jù)列谁撼。
FROM 子句 表示檢索的數(shù)據(jù)來(lái)自哪個(gè)表歧胁。
三、SQL概念和規(guī)則
SQL語(yǔ)句相關(guān)概念
– 關(guān)鍵字(Keyword):SQL語(yǔ)言保留的字符串厉碟,例如喊巍,SELECT和FROM都是關(guān)鍵字。
– 語(yǔ)句(statement):一條完整的SQL命令箍鼓。例如崭参,SELECT * FROM dept 是一條語(yǔ)句。
– 子句(clause):部分的SQL語(yǔ)句款咖,通常是由關(guān)鍵字加上其它語(yǔ)法元素構(gòu)成何暮,例如,SELECT * 是一個(gè)子句铐殃,F(xiàn)ROM table也是一個(gè)子句海洼。
SQL語(yǔ)句的書(shū)寫(xiě)規(guī)則
– 不區(qū)分大小寫(xiě),也就是說(shuō)SELECT富腊,select坏逢,Select,執(zhí)行時(shí)效果是一樣的蟹肘。
– 可以單行來(lái)書(shū)寫(xiě)词疼,也可以書(shū)寫(xiě)多行俯树,建議分多行書(shū)寫(xiě)帘腹,增強(qiáng)代碼可讀性,通常以子句為單位進(jìn)行分行许饿。
– 關(guān)鍵字不可以縮寫(xiě)阳欲、分開(kāi)以及跨行書(shū)寫(xiě),如SELECT不可以寫(xiě)成SEL或SELE CT等形式。
– 關(guān)鍵字最好使用大寫(xiě)球化,其它語(yǔ)法元素(如列名秽晚、表名等)小寫(xiě)。
– Tab和縮進(jìn)的使用可以提高程序的可讀性筒愚。
四赴蝇、常用查詢(xún)語(yǔ)句
-
選擇列
選擇所有列
select *
from emp;
選擇指定列
select ename,mgr
from emp;
-
列別名
SELECT ename AS name, sal salary
FROM emp;
SELECT ename "Name",
sal*12 "Annual Salary"
FROM emp;
-
消除重復(fù)行
SELECT DISTINCT deptno
FROM emp;
-
WHERE子句
SELECT ename, job, deptno
FROM emp
WHERE deptno=20;
-
特殊比較運(yùn)算符
BETWEEN...AND...:判斷要比較的值是否在某個(gè)范圍內(nèi)。
IN( 集合列表):判斷要比較的值是否和集合列表中的任何一個(gè)值相等巢掺。LIKE:判斷要比較的值是否滿(mǎn)足部分匹配句伶。
IS NULL:判斷要比較的值是否為空值NULL 。
使用LIKE運(yùn)算符判斷要比較的值是否滿(mǎn)足部分匹配陆淀,也叫模糊查詢(xún)考余。
模糊查詢(xún)中兩個(gè)通配符:
"%"代表零或任意更多的字符
"_"代表一個(gè)字符
-
邏輯運(yùn)算符
AND:邏輯與,用來(lái)連接多個(gè)條件表達(dá)式轧苫。如果每個(gè)條件表達(dá)式的結(jié)果都為T(mén)RUE楚堤,整個(gè)表達(dá)式的結(jié)果才為T(mén)RUE。
OR:邏輯或含懊,用來(lái)連接多個(gè)條件表達(dá)式身冬。只要有1個(gè)條件表達(dá)式的結(jié)果為T(mén)RUE,整個(gè)表達(dá)式的結(jié)果就為T(mén)RUE岔乔。
NOT:邏輯非吏恭,用來(lái)對(duì)條件表達(dá)式取反。TRUE取反為FALSE重罪,F(xiàn)ALSE取反為T(mén)RUE樱哼。
-
運(yùn)算符的優(yōu)先級(jí)
運(yùn)算符的優(yōu)先級(jí) -
ORDER BY子句
使用ORDER BY子句能對(duì)查詢(xún)結(jié)果集進(jìn)行排序,語(yǔ)法結(jié)構(gòu)如下:
SELECT [DISTINCT] { * | 列名 |表達(dá)式 [別名][,...]}
FROM 表名
[WHERE 條件]
[ORDER BY {列名|表達(dá)式|列別名|列序號(hào)} [ASC|DESC],…];
其中:
– 可以按照列名、表達(dá)式剿配、列別名搅幅、結(jié)果集的列序號(hào)排序
– ASC: 升序,默認(rèn)值 DESC: 降序
– ORDER BY 子句必須寫(xiě)在SELECT語(yǔ)句的最后
-
限制記錄的行數(shù)
使用select語(yǔ)句時(shí)呼胚,經(jīng)常要返回前幾條或者中間某幾行記錄茄唐,可以使用關(guān)鍵字limit。語(yǔ)法格式如下:
select 字段列表
from 數(shù)據(jù)源
limit [start,]length;
說(shuō)明:
1.limit接受一個(gè)或兩個(gè)整數(shù)參數(shù)蝇更。start表示從第幾行記錄開(kāi)始輸出沪编,length表示輸出的記錄行數(shù)。
2.表中第一行記錄的start值為0(不是 1)年扩。
五蚁廓、課后作業(yè)
練習(xí)11的2、3題
2.查詢(xún)工作在CHICAGO并且入職日期最早的前2名員工姓名厨幻,入職日期相嵌。
3.按照每頁(yè)顯示5條記錄腿时,分別查詢(xún)第1頁(yè),第2頁(yè)饭宾,第3頁(yè)信息批糟,要求顯示員工姓名、入職日期看铆、部門(mén)名稱(chēng)徽鼎。
SELECT ename,hiredate
FROM emp
ORDER BY HIREDATE
LIMIT 0,2;
SELECT ename,hiredate,dname
FROM emp INNER JOIN dept ON dept.DEPTNO = emp.DEPTNO
LIMIT 0,5;
SELECT ename,hiredate,dname
FROM emp INNER JOIN dept ON dept.DEPTNO = emp.DEPTNO
LIMIT 5,5;
SELECT ename,hiredate,dname
FROM emp INNER JOIN dept ON dept.DEPTNO = emp.DEPTNO
LIMIT 10,5;
課后作業(yè)
1.查詢(xún)?nèi)肼殨r(shí)間在1982-7-9之后,并且不從事SALESMAN工作的員工姓名弹惦、入職時(shí)間纬傲、職位。
2.查詢(xún)員工姓名的第三個(gè)字母是a的員工姓名肤频。
3.查詢(xún)除了10叹括、20號(hào)部門(mén)以外的員工姓名、部門(mén)編號(hào)宵荒。
4.查詢(xún)部門(mén)號(hào)為30號(hào)員工的信息汁雷,先按工資降序排序,再按姓名升序排序报咳。
5.查詢(xún)沒(méi)有上級(jí)的員工(經(jīng)理號(hào)為空)的員工姓名侠讯。
6.查詢(xún)工資大于等于4500并且部門(mén)為10或者20的員工的姓名\工資、部門(mén)編號(hào)暑刃。
SELECT ename,hiredate,job
FROM emp
WHERE HIREDATE > '1982-07-09';
SELECT ename
FROM emp
WHERE ENAME LIKE '__a%';
SELECT ename,deptno
FROM emp
WHERE DEPTNO NOT IN (10,20);
SELECT ename,deptno
FROM emp
WHERE DEPTNO = '30'
ORDER BY sal DESC;
SELECT ename,deptno
FROM emp
WHERE DEPTNO = '30'
ORDER BY ename;
SELECT ename
FROM emp
WHERE mgr is NULL;
SELECT ename,sal,deptno
from emp
WHERE DEPTNO IN (10,20) AND SAL >= 4500;