【轉】SQL 經常使用關鍵字釋義和用法

 
 

下面 是 從網絡上整理 出來的 SQL 關鍵字和 經常使用函數的 釋義和簡單用法。sql

1.1 SELECT

SELECT 語句用於從表中選取數據。
結果被存儲在一個結果表中(稱爲結果集)。
語法:
  1. SELECT 列名 FROM 表名  
  1. SELECT * FROM 表名  
  1. eg:select * from table_a;  

1.1.1 DISTINCT

去除查詢的結果集中去掉相同行的內容,留下不一樣的內容。

語法:數據庫

  1. SELECT DISTINCT(列名) FROM 表名  
  1. select distinct(id) from table_a;  

1.1.2 TOP

TOP子句用於規定要返回的記錄數目。但並非全部的數據庫都支持該子句,好比MySql中就是用 LIMIT。

SQL Server語法:網絡

  1. SELECT TOP 數字|percent 列名 FROM 表名  
  1. eg: select top 3 * from table_a --查找表中的前3條數據  
  1. eg:select top 30 percent from table_a --查找表中的前30%數據  

MySql 語法:函數

  1. SELECT 列名 FROM 表名 LIMIT 條數  
  1. eg: select * from table_a LIMIT 40--查詢前40條數據  

Oracle語法:spa

  1. SELECT 列名 FROM 表名 WHERE ROWNUM <=條數  
  1. eg:select * from table_a where rownnum <=5 --讀取表中前5行數據  

1.1.3 LIKE

LIKE 操做符用於在 WHERE 子句中搜索列中的指定模式。
  • like 語句經常與 SQL通配符一塊兒使用:
  • % :替代一個或多個字符
  • _:替代一個字符
  • [charlist]:字符列表中任何一字符
  • [~charlist]:
  • 或[!charlist]:不存在字符列表中任意字符
語法:
  1. SELECT 列名 FROM 表名 WHERE 列名 LIKE 判斷方式  
  1. eg: select * from table_a where value like '%123' --查找 表中 value 值 以123做結尾的項  
  1. eg: select * from table_a where value like '123_' -- 查找表中 值以123開頭的,長度爲4的全部項  
  1. eg: select * from table_a where value like '[ABC]%' --查詢表中值以A,,B,C任意字符開頭的項  
  1. eg: select * from table_a where value like '[!ABC]%' --查詢表中值不以A,,B,C任意字符開頭的項  

1.2 INSERT INTO

INSERT INTO 像表格中插入新的行 

語法:.net

  1. INSERT INTO 表名 VALUES(值1,值2);  
  1. INSERT INTO 表名(列名1,列名2)values(值1,值2);  

1.3 UPDATE

update修改表中的數據 

語法:code

  1. UPDATE 表名 SET 列名= 新值 WHERE 邏輯判斷  
  1. eg: update table_a set value='123' where id=1;  

1.3 DELETE

delete用於刪除表中的行 
語法:
  1. DELETE FROM 表名 WHERE 邏輯判斷  
  1. eg: DELETE table_a WHERE id = 1  

2. 1 WHERE

對要進行操做的表進行條件的斷定補充(整刪改查)。 
語法:
  1. [SELECT][DELETE][UPDATE] 表 WHERE 運算符斷定  
  1. eg: select * from table_b where id=1  

2.1.1  AND 和 OR 運算符

AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。orm

若是第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。blog

若是第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。排序

語法:

  1. [SELECT][UPDATE][DELETE] 表 WHERE 邏輯表達 [AND][OR] 邏輯表達上  
  1. eg:select * from table_a where id=1 AND value='wangch';  
  1. eg:select * from table_a where id=1 or value='wangch';  

2.1.2 ORDER BY

ORDER BY 語句用於根據指定的列對結果集進行排序。ORDER BY 語句默認按照升序對記錄進行排序。
  • DESC:按降序進行排列(默認)。
  • ASC:按升序進行排列。
語法:
  1. SELECT 列名 FROM 表名 ORDER BY 列名 [DESC][ASC]  
  1. eg:select * from table_a order by id desc  

2.1.3 IN

IN操做符容許咱們在WHERE 子句中規定多個值

語法:

  1. SELECT 列名 FROM 表名 WHERE 列名 IN(值1,值2,值3)  
  1. eg: select * from table_a where id in (1,2,3) -- 查詢 表中id 分別爲 1,2,3的結果  

2.1.4 BETWEEN ...AND...

BETWEEN AND 會選取介於2個值之間的數據範圍。

  • 數值
  • 文本
  • 日期

3.1 別名

在作查詢操做的時候,能夠給查詢的數據庫指定一個別名(Alias),以方便在後邊書寫其餘邏輯判斷

表別名語法:

  1. SELECT 列名 FROM 表名 AS 別名  
列別名語法:
  1. SELECT 列名 AS 列別名 FROM 表名  

不作別名查找:

  1. SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName  
  1. FROM Persons, Product_Orders  
  1. WHERE Persons.LastName='Adams' AND Persons.FirstName='John'  

作別名查找:

  1. SELECT po.OrderID, p.LastName, p.FirstName  
  1. FROM Persons AS p, Product_Orders AS po  
  1. WHERE p.LastName='Adams' AND p.FirstName='John'  

能夠看出 使用別名可使語句更簡潔和易於閱讀。

3.2 with

with 經常與as 連用,將查詢到的結果暫時存儲到一張虛表當中,而後再作操做。

語法:

  1. with  虛表名 as (數據查詢結果);  
  1. eg: with a as (SELECT * FROM table_a);  
  2. select * from a  

3.2 JOIN

各個表可能因爲某種約束(外鍵等)而相關,JOIN能夠根據這些關係,實現表的結合查詢。

有時爲了獲得完整的結果,咱們須要從兩個或更多的表中獲取結果。

咱們就須要執行 join。數據庫中的表可經過鍵將彼此聯繫起來。

主鍵(Primary Key)是一個列,在這個列中的每一行的值都是惟一的。

在表中,每一個主鍵的值都是惟一的。這樣作的目的是在不重複每一個表中的全部數據的狀況下,把表間的數據交叉捆綁在一塊兒。

語法:

  1. SELECT  列名 FROM 表名A JOIN 表名B ON 條件  
其中若是不實用JOIN查詢操做SQL語句以下的話:
  1. SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo  
  1. FROM Persons, Orders  
  1. WHERE Persons.Id_P = Orders.Id_P   
使用JOIN查詢SQL語句以下:
  1. SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo  
  1. FROM Persons  
  1. INNER JOIN Orders  
  1. ON Persons.Id_P = Orders.Id_P  

其中 具備不一樣的SQL JOIN 方式

  • JOIN | INNER JOIN: 若是表中有至少一個匹配,則返回行      內鏈接
  • LEFT JOIN: 即便右表中沒有匹配,也從左表返回全部的行       左鏈接
  • RIGHT JOIN: 即便左表中沒有匹配,也從右表返回全部的行     右鏈接
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行                全鏈接

3.3 UNION

union 用戶合併多個SELECT 的查詢結果集。

請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有類似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。

語法:

  1. SELECT column_name(s) FROM table_name1  
  1. UNION  
  1. SELECT column_name(s) FROM table_name2  
UNION 默認省略相同的值,若是不須要省略,請用UNION ALL。

3.3 SELECT INTO 

SELECT INTO 語句從一個表中選取數據,而後插入到另一個表中。

語法:

  1. SELECT 列名 INTO 新表名 FROM 舊錶 WHERE 邏輯判斷  
注意MySql 中不支持 SELECT INTO 字句!

替換用法爲 INSERT INTO

好比 2個相同結構表A,B中B的數據插入A的數據 能夠這樣寫

  1. INSERT INTO A SELECT * FROM B WHERE ...  
將制定字段插入新表
  1. INSERT INTO A(key,value) select key,value from B WHERE ...  

4.1 GROUP BY

GROUP BY語句用於結合統計函數,根據一個或多個列結果集進行分組。

語法:

  1. SELECT 列名|function(列名) FROM 表名  
  1. GROUP BY 列名  

4.2 HAVING

在 SQL 中增長 HAVING 子句緣由是,WHERE 關鍵字沒法與合計函數一塊兒使用。

語法:

  1. SELECT column_name, aggregate_function(column_name)  
  1. FROM table_name  
  1. WHERE column_name operator value  
  1. GROUP BY column_name  
  1. HAVING aggregate_function(column_name) operator value  

5. 0  SQL函數

內建SQL函數的用法以下:

  1. SELECT function(列) FROM 表  
其中內建函數分爲:
  • Aggregate 函數 (合計函數)
  • Scalar 函數

Aggregate 函數

函數 描述
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 函數

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) 用於執行日期計算

 

6.0 SQL多表查詢

表結構:

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;
相關文章
相關標籤/搜索