1. SQL(基礎(chǔ)查詢)1.1. 基本查詢語句1.1.1. FROM子句SQL查詢語句的語法如下: copytextpop-up
SELECT <*, column [alias], …> FROM table; 其中:SELECT用于指定要查詢的列,F(xiàn)ROM指定要從哪個表中查詢。如果要查詢所有列,可以在SELECT后面使用*號,如果只查詢特定的列,可以直接在SELECT后面指定列名,列名之間用逗號隔開。例句如下,查詢dept表中的所有記錄: copytextpop-up
SELECT * FROM dept; 1.1.2. 使用別名在SQL語句中可以通過使用列的別名改變標(biāo)題的顯示樣式,或者表示計算結(jié)果的含義,使用語法是列的別名跟在列名后,中間可以加或不加一個“AS”關(guān)鍵字。例如: copytextpop-up
SELECT empno AS id ,ename 'Name', sal * 12 'Annual Salary' FROM emp; 別名可以直接寫,不必用雙引號引起來。但是如果希望別名中區(qū)分大小寫字符,或者別名中包含字符或空格,則必須用雙引號引起來。 1.1.3. WHERE子句在SELECT語句中,可以在WHERE子句中使用比較操作符限制查詢結(jié)果,是可選的。 當(dāng)查詢條件中和數(shù)字比較,可以使用單引號引起,也可以不用,當(dāng)和字符及日期類型的數(shù)據(jù)比較,則必須用單引號引起。例如查詢部門10下的員工信息: copytextpop-up
SELECT * FROM empWHERE deptno = 10; 查詢職員表中職位是’SALESMAN’的職員: copytextpop-up
SELECT ename, sal, job FROM emp WHERE job = 'SALESMAN'; 圖-1 用where子句定義查詢條件 1.1.4. SELECT子句如果只查詢表的部分列,需要在SELECT后指定列名,例如: copytextpop-up
SELECT empno, ename, sal, job FROM emp; 圖-2查詢指定的列 1.2. 查詢條件1.2.1. 使用>, <, >=, <=, !=, <>, =在WHERE子句中的查詢條件,可以使用比較運算符來做查詢。比如:查詢職員表中薪水低于2000元的職員信息: copytextpop-up
SELECT ename, sal FROM emp WHERE sal< 2000; 查詢職員表中不屬于部門10的員工信息(!=等價于<>): copytextpop-up
SELECT ename, sal, job FROM emp WHERE deptno != 10; 查詢職員表中在2002年1月1號以后入職的職員信息,比較日期類型數(shù)據(jù): copytextpop-up
SELECT ename, sal, hiredate FROM emp
WHERE hiredate>to_date('2002-1-1','YYYY-MM-DD'); 1.2.2. 使用AND,OR關(guān)鍵字在SQL操作中,如果希望返回的結(jié)果必須滿足多個條件,應(yīng)該使用AND邏輯操作符連接這些條件,如果希望返回的結(jié)果滿足多個條件之一即可,應(yīng)該使用OR邏輯操作符連接這些條件。例如:查詢薪水大于1000并且職位是’CLERK’的職員信息: copytextpop-up
SELECT ename, sal, job FROM emp
WHERE sal> 1000 AND job = 'CLERK'; 查詢薪水大于1000或者職位是’CLERK’的職員信息: copytextpop-up
SELECT ename, sal, job FROM emp
WHERE sal> 1000 OR job = 'CLERK'; 1.2.3. 使用LIKE條件(模糊查詢)當(dāng)用戶在執(zhí)行查詢時,不能完全確定某些信息的查詢條件,或者只知道信息的一部分,可以借助LIKE來實現(xiàn)模糊查詢。LIKE需要借助兩個通配符:
這兩個通配符可以配合使用,構(gòu)造靈活的匹配條件。例如查詢職員姓名中第二個字符是‘A’的員工信息: copytextpop-up
SELECT ename, job FROM emp WHERE ename LIKE '_A%'; 圖-3 模糊查詢的結(jié)果 1.2.4. 使用IN和NOT IN在WHERE子句中可以用比較操作符IN(list)來取出符合列表范圍中的數(shù)據(jù)。其中的參數(shù)list表示值列表,當(dāng)列或表達式匹配于列表中的任何一個值時,條件為TRUE,該條記錄則被顯示出來。 IN頁可以理解為一個范圍比較操作符,只不過這個范圍是一個指定的值列表,NOT IN(list) 取出不符合此列表中的數(shù)據(jù)記錄。例如查詢職位是MANAGER或者CLERK的員工: copytextpop-up
SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK'); 查詢不是部門10或20的員工: copytextpop-up
SELECT ename, job FROM emp WHERE deptno NOT IN (10, 20); 1.2.5. BETWEEN…AND…BETWEEN…AND…操作符用來查詢符合某個值域范圍條件的數(shù)據(jù),最常見的是使用在數(shù)字類型的數(shù)據(jù)范圍上,但對字符類型和日期類型數(shù)據(jù)也同樣適用。例如查詢薪水在1500-3000之間的職員信息: copytextpop-up
SELECT ename, sal FROM emp
WHERE sal BETWEEN 1500 AND 3000; 1.2.6. 使用IS NULL和IS NOT NULL空值NULL是一個特殊的值,比較的時候不能使用”=”號,必須使用IS NULL,否則不能得到正確的結(jié)果。例如查詢哪些職員的獎金數(shù)據(jù)為NULL: copytextpop-up
SELECT ename, sal, comm FROM emp
WHERE comm IS NULL; 1.2.7. 使用ANY和ALL條件在比較運算符中,可以出現(xiàn)ALL和ANY,表示“全部”和“任一”,但是ALL和ANY不能單獨使用,需要配合單行比較操作符>、>=、<、<=一起使用。其中:
例如,查詢薪水比職位是“SALESMAN”的人高的員工信息,比任意一個SALESMAN高都行: copytextpop-up
SELECT empno, ename, job, sal, deptno
FROM emp
WHERE sal> ANY (
SELECT sal FROM emp WHERE job = 'SALESMAN'); 1.2.8. 查詢條件中使用表達式和函數(shù)當(dāng)查詢需要對選出的字段進行進一步計算,可以在數(shù)字列上使用算術(shù)表達式( 、-、*、/)。表達式符合四則運算的默認優(yōu)先級,如果要改變優(yōu)先級可以使用括號。 算術(shù)運算主要是針對數(shù)字類型的數(shù)據(jù),對日期類型的數(shù)據(jù)可以做加減操作,表示在一個日期值上加或減一個天數(shù)。 查詢條件中使用字符串函數(shù)UPPER,將條件中的字符串變大寫后再參與比較: copytextpop-up
SELECT ename, sal, job FROMempWHERE ename = UPPER('rose'); 查詢條件中使用算數(shù)表達式,查詢年薪大于10w元的員工記錄: copytextpop-up
SELECT ename, sal, job FROM empWHERE sal * 12 >100000; 1.2.9. 使用DISTINCT過濾重復(fù)數(shù)據(jù)表中有可能存儲相同數(shù)據(jù)的行,當(dāng)執(zhí)行查詢操作時,默認情況會顯示所有行,不管查詢結(jié)果是否有重復(fù)的數(shù)據(jù)。當(dāng)重復(fù)數(shù)據(jù)沒有實際意義,經(jīng)常會需要去掉重復(fù)值,使用DISTINCT實現(xiàn)。例如查詢員工的部門編碼,包含所有重復(fù)值: copytextpop-up
SELECT deptno FROM emp; 查詢員工的部門編碼,去掉重復(fù)值: copytextpop-up
SELECT DISTINCT deptno FROM emp; DISTINCT后面的列可以組合查詢,下例查詢每個部門的職位,去掉重復(fù)值。注意是deptno和job聯(lián)合起來不重復(fù): copytextpop-up
SELECT DISTINCT deptno, job FROM emp; 圖-4用distinct去掉重復(fù)的列 1.3. 排序1.3.1. 使用ORDER BY字句對查詢出的數(shù)據(jù)按一定規(guī)則進行排序操作,使用ORDER BY子句。語法如下: copytextpop-up
SELECT <*, column [alias], …>
FROM table
[WHERE condition(s)]
[ORDER BY column [ASC | DESC]] ; 注意,ORDER BY必須出現(xiàn)在SELECT中的最后一個子句。下例對職員表按薪水排序: copytextpop-up
SELECT ename, sal
FROM emp
ORDER BY sal; 圖-5用ORDER BY將查詢結(jié)果排序 1.3.2. ASC和DESC排序時默認按升序排列,即由小及大,ASC用來指定升序排序,DESC用來指定降序排序。 因為NULL值視作最大,則升序排列時,排在最后,降序排列時,排在最前。如果不寫ASC或DESC,默認是ASC,升序排列。例如,按員工的經(jīng)理升序排序: copytextpop-up
SELECT empno, ename, mgr FROM emp
WHERE deptno = 10 ORDER BY mgr; 降序排列,必須指明,按員工的薪水倒序排序: copytextpop-up
SELECT ename, sal FROM emp
ORDER BY sal DESC; 1.3.3. 多個列排序當(dāng)以多列作為排序標(biāo)準(zhǔn)時,首先按照第一列進行排序,如果第一列數(shù)據(jù)相同,再以第二列排序,以此類推。多列排序時,不管正序還是倒序,每個列需要單獨設(shè)置排序方式。 下例對職員表中的職員排序,先按照部門編碼正序排列,再按照薪水降序排列: copytextpop-up
SELECT ename, deptno, sal FROM emp
ORDER BY deptno ASC, sal DESC; 1.4. 聚合函數(shù)1.4.1. 什么是聚合函數(shù)查詢時需要做一些數(shù)據(jù)統(tǒng)計,比如:查詢職員表中各部門職員的平均薪水,各部門的員工人數(shù)。當(dāng)需要統(tǒng)計的數(shù)據(jù)并不能在職員表里直觀列出,而是需要根據(jù)現(xiàn)有的數(shù)據(jù)計算得到結(jié)果,這種功能可以使用聚合函數(shù)來實現(xiàn),即:將表的全部數(shù)據(jù)劃分為幾組數(shù)據(jù),每組數(shù)據(jù)統(tǒng)計出一個結(jié)果。 因為是多行數(shù)據(jù)參與運算返回一行結(jié)果,也稱作分組函數(shù)、多行函數(shù)、集合函數(shù)。用到的關(guān)鍵字:
1.4.2. MAX和MIN用來取得列或表達式的最大、最小值,可以用來統(tǒng)計任何數(shù)據(jù)類型,包括數(shù)字、字符和日期。例如獲取機構(gòu)下的最高薪水和最低薪水,參數(shù)是數(shù)字: copytextpop-up
SELECT MAX(sal) max_sal, MIN(sal) min_sal
FROM emp; 計算最早和最晚的入職時間,參數(shù)是日期: copytextpop-up
SELECT MAX(hiredate) max_hire, MIN(hiredate) min_hire
FROM emp; 1.4.3. AVG和SUMAVG和SUM函數(shù)用來統(tǒng)計列或表達式的平均值和和值,這兩個函數(shù)只能操作數(shù)字類型,并忽略NULL值。例如獲得機構(gòu)下全部職員的平均薪水和薪水總和: copytextpop-up
SELECT AVG(sal) avg_sal, SUM(sal) sum_sal FROM emp; 1.4.4. COUNTCOUNT函數(shù)用來計算表中的記錄條數(shù),同樣忽略NULL值。例如獲取職員表中一共有多少名職員記錄: copytextpop-up
SELECT COUNT(*) total_num FROM emp; 獲得職員表中有多少人是有職位的(忽略沒有職位的員工記錄) copytextpop-up
SELECT COUNT(job) total_job FROM emp; 1.4.5. 聚合函數(shù)對空值的處理聚合函數(shù)忽略NULL值。即當(dāng)emp表中的某列有NULL值,比如某新入職員工沒有薪水,比較兩條語句的結(jié)果: copytextpop-up
SELECT AVG(sal) avg_sal FROM emp;
SELECT AVG(NVL(sal,0)) avg_sal FROM emp; 1.5. 分組1.5.1. GROUP BY子句上面的例子都是以整個表作為一組。如果希望得到每個部門的平均薪水,而不是整個機構(gòu)的平均薪水,需要把整個數(shù)據(jù)表按部門劃分成一個個小組,每個小組中包含一行或多行數(shù)據(jù),在每個小組中再使用分組函數(shù)進行計算,每組返回一個結(jié)果。語法如下: copytextpop-up
SELECT <*, column [alias], …>
FROM table [WHERE condition(s)]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column [ASC | DESC]] ; 其中劃分的小組有多少,最終的結(jié)果集行數(shù)就有多少。 1.5.2. 分組查詢圖-6分組查詢 1.5.3. HAVING字句HAVING子句用來對分組后的結(jié)果進一步限制,比如按部門分組后,得到每個部門的最高薪水,可以繼續(xù)限制輸出結(jié)果。必須跟在GROUP BY后面,不能單獨存在。例如查詢每個部門的最高薪水,只有最高薪水大于4000的記錄才被輸出顯示: copytextpop-up
SELECT deptno, MAX(sal) max_sal FROM emp
GROUP BY deptno HAVING MAX(sal) >4000; 1.6. 查詢語句的執(zhí)行順序當(dāng)一條查詢語句中包含所有的子句,執(zhí)行順序依下列子句次序:
2. SQL(關(guān)聯(lián)查詢)2.1. 關(guān)聯(lián)基礎(chǔ)2.1.1. 關(guān)聯(lián)的概念實際應(yīng)用中所需要的數(shù)據(jù),經(jīng)常會需要查詢兩個或兩個以上的表。這種查詢兩個或兩個以上數(shù)據(jù)表或視圖的查詢叫做連接查詢,連接查詢通常建立在存在相互關(guān)系的父子表之間。語法如下: copytextpop-up
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2; 或者: copytextpop-up
SELECT table1.column, table2.column
FROM table1JOIN table2
ON(table1.column1 = table2.column2); 2.1.2. 笛卡爾積笛卡爾積指做關(guān)聯(lián)操作的每個表的每一行都和其它表的每一行做組合,假設(shè)兩個表的記錄條數(shù)分別是X和Y,笛卡爾積將返回X * Y條記錄。當(dāng)兩個表關(guān)聯(lián)查詢時,不寫連接條件,得到的結(jié)果即是笛卡爾積。例如: copytextpop-up
SELECT COUNT(*) FROM emp; --14條記錄
SELECT COUNT(*) FROM dept; --4條記錄
SELECT emp.ename, dept.dnameFROM emp, dept;--56條記錄 2.1.3. 等值連接等值連接是連接查詢中最常見的一種,通常是在有主外鍵關(guān)聯(lián)關(guān)系的表間建立,并將連接條件設(shè)定為有關(guān)系的列,使用等號”=”連接相關(guān)的表。例如查詢職員的姓名、職位以及所在部門的名字和所在城市,使用兩個相關(guān)的列做等值操作: copytextpop-up
SELECT e.ename, e.job, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno; 2.2. 關(guān)聯(lián)查詢2.2.1. 內(nèi)連接內(nèi)連接返回兩個關(guān)聯(lián)表中所有滿足連接條件的記錄。例如查詢員工的名字和所在部門的名字: copytextpop-up
SELECT e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno 上面的語法也可以寫為: copytextpop-up
SELECT e.ename, d.dname
FROM emp e JOIN dept d
ON(e.deptno = d.deptno); 2.2.2. 外連接內(nèi)連接返回兩個表中所有滿足連接條件的數(shù)據(jù)記錄,在有些情況下,需要返回那些不滿足連接條件的記錄,需要使用外連接,即不僅返回滿足連接條件的記錄,還將返回不滿足連接條件的記錄。比如把沒有職員的部門和沒有部門的職員查出來。外連接的語法如下: copytextpop-up
SELECT table1.column, table2.column
FROM table1 [LEFT | RIGHT | FULL] JOIN table2
ON table1.column1 = table2.column2; 了解驅(qū)動表的概念。 圖-7左外連接 圖-8右外連接 外連接查詢的例子,Emp表做驅(qū)動表: copytextpop-up
SELECT e.ename, d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno; Dept表做驅(qū)動表: copytextpop-up
SELECT e.ename, d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno; 2.2.3. 全連接全外連接是指除了返回兩個表中滿足連接條件的記錄,還會返回不滿足連接條件的所有其它行。即是左外連接和右外連接查詢結(jié)果的總和。例如: copytextpop-up
SELECT e.ename, d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno; 圖-9 全外連接 2.2.4. 自連接自連接是一種特殊的連接查詢,數(shù)據(jù)的來源是一個表,即關(guān)聯(lián)關(guān)系來自于單表中的多個列。表中的列參照同一個表中的其它列的情況稱作自參照表。 自連接是通過將表用別名虛擬成兩個表的方式實現(xiàn),可以是等值或不等值連接。例如查出每個職員的經(jīng)理名字,以及他們的職員編碼: copytextpop-up
SELECT worker.empnow_empno, worker.enamew_ename, manager.empnom_empno, manager.enamem_ename
FROM emp worker join emp manager
ON worker.mgr = manager.empno; |
|