下面 是 從網絡上整理 出來的 SQL 關鍵字和 經常使用函數的 釋義和簡單用法。sql
SELECT 語句用於從表中選取數據。結果被存儲在一個結果表中(稱爲結果集)。語法:
- SELECT 列名 FROM 表名
- SELECT * FROM 表名
- eg:select * from table_a;
1.1.1 DISTINCT
去除查詢的結果集中去掉相同行的內容,留下不一樣的內容。語法:數據庫
- SELECT DISTINCT(列名) FROM 表名
- select distinct(id) from table_a;
1.1.2 TOP
TOP子句用於規定要返回的記錄數目。但並非全部的數據庫都支持該子句,好比MySql中就是用 LIMIT。SQL Server語法:網絡
- SELECT TOP 數字|percent 列名 FROM 表名
- eg: select top 3 * from table_a --查找表中的前3條數據
- eg:select top 30 percent from table_a --查找表中的前30%數據
MySql 語法:函數
- SELECT 列名 FROM 表名 LIMIT 條數
- eg: select * from table_a LIMIT 40--查詢前40條數據
Oracle語法:spa
- SELECT 列名 FROM 表名 WHERE ROWNUM <=條數
- eg:select * from table_a where rownnum <=5 --讀取表中前5行數據
1.1.3 LIKE
LIKE 操做符用於在 WHERE 子句中搜索列中的指定模式。
- like 語句經常與 SQL通配符一塊兒使用:
- % :替代一個或多個字符
- _:替代一個字符
- [charlist]:字符列表中任何一字符
- [~charlist]:
- 或[!charlist]:不存在字符列表中任意字符
語法:
- SELECT 列名 FROM 表名 WHERE 列名 LIKE 判斷方式
- eg: select * from table_a where value like '%123' --查找 表中 value 值 以123做結尾的項
- eg: select * from table_a where value like '123_' -- 查找表中 值以123開頭的,長度爲4的全部項
- eg: select * from table_a where value like '[ABC]%' --查詢表中值以A,,B,C任意字符開頭的項
- eg: select * from table_a where value like '[!ABC]%' --查詢表中值不以A,,B,C任意字符開頭的項
INSERT INTO 像表格中插入新的行語法:.net
- INSERT INTO 表名 VALUES(值1,值2);
- INSERT INTO 表名(列名1,列名2)values(值1,值2);
update修改表中的數據語法:code
- UPDATE 表名 SET 列名= 新值 WHERE 邏輯判斷
- eg: update table_a set value='123' where id=1;
delete用於刪除表中的行
語法:
- DELETE FROM 表名 WHERE 邏輯判斷
- eg: DELETE table_a WHERE id = 1
對要進行操做的表進行條件的斷定補充(整刪改查)。
語法:
- [SELECT][DELETE][UPDATE] 表 WHERE 運算符斷定
- eg: select * from table_b where id=1
2.1.1 AND 和 OR 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。orm
若是第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。blog
若是第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。排序
語法:
- [SELECT][UPDATE][DELETE] 表 WHERE 邏輯表達 [AND][OR] 邏輯表達上
- eg:select * from table_a where id=1 AND value='wangch';
- eg:select * from table_a where id=1 or value='wangch';
2.1.2 ORDER BY
ORDER BY 語句用於根據指定的列對結果集進行排序。ORDER BY 語句默認按照升序對記錄進行排序。
- DESC:按降序進行排列(默認)。
- ASC:按升序進行排列。
語法:
- SELECT 列名 FROM 表名 ORDER BY 列名 [DESC][ASC]
- eg:select * from table_a order by id desc
2.1.3 IN
IN操做符容許咱們在WHERE 子句中規定多個值
語法:
- SELECT 列名 FROM 表名 WHERE 列名 IN(值1,值2,值3)
- eg: select * from table_a where id in (1,2,3) -- 查詢 表中id 分別爲 1,2,3的結果
2.1.4 BETWEEN ...AND...
BETWEEN AND 會選取介於2個值之間的數據範圍。
- 數值
- 文本
- 日期
在作查詢操做的時候,能夠給查詢的數據庫指定一個別名(Alias),以方便在後邊書寫其餘邏輯判斷
表別名語法:
列別名語法:
- SELECT 列名 FROM 表名 AS 別名
- SELECT 列名 AS 列別名 FROM 表名
不作別名查找:
- SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
- FROM Persons, Product_Orders
- WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
作別名查找:
- SELECT po.OrderID, p.LastName, p.FirstName
- FROM Persons AS p, Product_Orders AS po
- WHERE p.LastName='Adams' AND p.FirstName='John'
能夠看出 使用別名可使語句更簡潔和易於閱讀。
with 經常與as 連用,將查詢到的結果暫時存儲到一張虛表當中,而後再作操做。
語法:
- with 虛表名 as (數據查詢結果);
- eg: with a as (SELECT * FROM table_a);
- select * from a
各個表可能因爲某種約束(外鍵等)而相關,JOIN能夠根據這些關係,實現表的結合查詢。
有時爲了獲得完整的結果,咱們須要從兩個或更多的表中獲取結果。
咱們就須要執行 join。數據庫中的表可經過鍵將彼此聯繫起來。
主鍵(Primary Key)是一個列,在這個列中的每一行的值都是惟一的。
在表中,每一個主鍵的值都是惟一的。這樣作的目的是在不重複每一個表中的全部數據的狀況下,把表間的數據交叉捆綁在一塊兒。
語法:
其中若是不實用JOIN查詢操做SQL語句以下的話:
- SELECT 列名 FROM 表名A JOIN 表名B ON 條件
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
- FROM Persons, Orders
使用JOIN查詢SQL語句以下:
- WHERE Persons.Id_P = Orders.Id_P
- SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
- FROM Persons
- INNER JOIN Orders
- ON Persons.Id_P = Orders.Id_P
其中 具備不一樣的SQL JOIN 方式
- JOIN | INNER JOIN: 若是表中有至少一個匹配,則返回行 內鏈接
- LEFT JOIN: 即便右表中沒有匹配,也從左表返回全部的行 左鏈接
- RIGHT JOIN: 即便左表中沒有匹配,也從右表返回全部的行 右鏈接
- FULL JOIN: 只要其中一個表中存在匹配,就返回行 全鏈接
union 用戶合併多個SELECT 的查詢結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有類似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
語法:
- SELECT column_name(s) FROM table_name1
- UNION
UNION 默認省略相同的值,若是不須要省略,請用UNION ALL。
- SELECT column_name(s) FROM table_name2
SELECT INTO 語句從一個表中選取數據,而後插入到另一個表中。語法:
注意MySql 中不支持 SELECT INTO 字句!
- SELECT 列名 INTO 新表名 FROM 舊錶 WHERE 邏輯判斷
替換用法爲 INSERT INTO
好比 2個相同結構表A,B中B的數據插入A的數據 能夠這樣寫
將制定字段插入新表
- INSERT INTO A SELECT * FROM B WHERE ...
- INSERT INTO A(key,value) select key,value from B WHERE ...
GROUP BY語句用於結合統計函數,根據一個或多個列結果集進行分組。
語法:
- SELECT 列名|function(列名) FROM 表名
- GROUP BY 列名
在 SQL 中增長 HAVING 子句緣由是,WHERE 關鍵字沒法與合計函數一塊兒使用。
語法:
- SELECT column_name, aggregate_function(column_name)
- FROM table_name
- WHERE column_name operator value
- GROUP BY column_name
- HAVING aggregate_function(column_name) operator value
內建SQL函數的用法以下:
其中內建函數分爲:
- SELECT function(列) FROM 表
- Aggregate 函數 (合計函數)
- Scalar 函數
函數 | 描述 |
---|---|
AVG(column) | 返回某列的平均值 |
BINARY_CHECKSUM | |
CHECKSUM | |
CHECKSUM_AGG | |
COUNT(column) | 返回某列的行數(不包括NULL值) |
COUNT(*) | 返回被選行數 |
COUNT(DISTINCT column) | 返回相異結果的數目 |
FIRST(column) | 返回在指定的域中第一個記錄的值(SQLServer2000 不支持) |
LAST(column) | 返回在指定的域中最後一個記錄的值(SQLServer2000 不支持) |
MAX(column) | 返回某列的最高值 |
MIN(column) | 返回某列的最低值 |
STDEV(column) | |
STDEVP(column) | |
SUM(column) | 返回某列的總和 |
VAR(column) | |
VARP(column) |
Scalar 函數的操做面向某個單一的值,並返回基於輸入值的一個單一的值。
函數 | 描述 |
---|---|
UCASE(c) | 將某個域轉換爲大寫 |
LCASE(c) | 將某個域轉換爲小寫 |
MID(c,start[,end]) | 從某個文本域提取字符 |
LEN(c) | 返回某個文本域的長度 |
INSTR(c,char) | 返回在某個文本域中指定字符的數值位置 |
LEFT(c,number_of_char) | 返回某個被請求的文本域的左側部分 |
RIGHT(c,number_of_char) | 返回某個被請求的文本域的右側部分 |
ROUND(c,decimals) | 對某個數值域進行指定小數位數的四捨五入 |
MOD(x,y) | 返回除法操做的餘數 |
NOW() | 返回當前的系統日期 |
FORMAT(c,format) | 改變某個域的顯示方式 |
DATEDIFF(d,date1,date2) | 用於執行日期計算 |
表結構:
emp表:
dept表:
salgrade表:
(1)查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數。
SELECT z.*,d.dname,d.loc FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z WHERE z.deptno=d.deptno;
(2)列出薪金比張三高的全部員工。
SELECT * FROM emp e WHERE e.sal > (SELECT sal FROM emp WHERE ename='張三')
(3)列出全部員工的姓名及其直接上級的姓名。
SELECT e.ename, IFNULL(m.ename, 'BOSS') AS lead FROM emp e LEFT JOIN emp m ON e.mgr=m.empno;
(4)列出受僱日期早於直接上級的全部員工的編號、姓名、部門名稱。
SELECT e.empno, e.ename, d.dname FROM emp e LEFT JOIN emp m ON e.mgr=m.empno LEFT JOIN dept d ON e.deptno=d.deptno WHERE e.hiredate<m.hiredate;
(5)列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。
SELECT e.*, d.dname FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
(6)列出全部工做爲文員的姓名及其部門名稱,部門的人數。
SELECT e.ename, d.dname, z.cnt FROM emp e, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z, dept d WHERE e.deptno=d.deptno AND z.deptno=d.deptno AND e.job='文員';
(7)列出最低薪金大於15000的各類工做及從事此工做的員工人數。
SELECT job, COUNT(*) FROM emp e GROUP BY job HAVING MIN(sal) > 15000;
(8)列出在銷售部工做的員工的姓名,假定不知道銷售部的部門編號。
SELECT e.ename FROM emp e WHERE e.deptno = (SELECT deptno FROM dept WHERE dname='銷售部');
(9)列出薪金高於公司平均薪金的全部員工信息,所在部門名稱,上級領導,工資等級。
SELECT e.*, d.dname, m.ename, s.grade FROM emp e NATURAL LEFT JOIN dept d LEFT JOIN emp m ON m.empno=e.mgr LEFT JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.sal > (SELECT AVG(sal) FROM emp);
(10)列出與龐統從事相同工做的全部員工及部門名稱。
SELECT e.*, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno AND e.job=(SELECT job FROM emp WHERE ename='龐統');
(11)列出薪金高於在部門30工做的全部員工的薪金的員工姓名和薪金、部門名稱。
SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno AND sal > ALL(SELECT sal FROM emp WHERE deptno=30)
(12)列出在每一個部門工做的員工數量、平均工資。
SELECT d.dname, e.cnt, e.avgsal FROM (SELECT deptno, COUNT(*) cnt, AVG(sal) avgsal FROM emp GROUP BY deptno) e, dept d WHERE e.deptno=d.deptno;