下面 是 从网络上整理 出来的 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语法:



  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 像表格中插入新的行 

语法:


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



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


1.3 UPDATE

update修改表中的数据 

语法:


  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 子语句中把两个或多个条件结合起来。

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 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  


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表:

sql server 中的或关键字 sql关键字大全_数据

dept表:

sql server 中的或关键字 sql关键字大全_SQL_02

salgrade表:

sql server 中的或关键字 sql关键字大全_SQL_03

(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;