Database | DQL&DML

SQL(Structured Query Language,结构化查询语言),面向集合的描述性非过程化语言,用于访问和处理关系数据库的标准语言。
SQL 是一种 ANSI 标准,所以存在多种不同版本的 SQL 语言。但就 SQL 查询和更新而言,Oracle、MySql 等数据库系统的实现大同小异,基本可以互通移植。

  • DQL(Data Query Language,数据查询语言),即 SQL 查询,DQL 语句即 SELECT 查询块。
  • DML(Data Manipulation Language,数据操作语言),即 SQL 更新,DML 语句即 INSERT 插入、UPDATE 更新、DELETE 删除。

1. SQL查询★

SELECT 语句的一般格式:

SELECT [DISTINCT] <目标列表达式> [AS] <别名>
FROM <表/视图> [AS] <别名>
[WHERE <查询条件>]
[GROUP BY <分组列> [HAVING <分组条件>]]
[ORDER BY <排序列> [ASC|DESC]];

1.1 单表查询

1.1.1 简单查询:SELECT

SELECT [DISTINCT] <目标列表达式> [AS] <别名>
FROM <表/视图> [AS] <别名>

1.查询全部列:使用通配符*实现查询全部。

SELECT *
FROM <表/视图>

2.去除重复行:DISTINCT

SELECT DISTINCT <目标列>
FROM <表/视图>

3.指定别名(Alias):

<列名/表名> <别名>
<列名/表名> AS <别名>

1.1.2 查询条件:WHERE

SELECT <目标列表达式> [AS] <别名>
FROM <表/视图> [AS] <别名>
WHERE <查询条件>

查询条件

1.比较运算:><=>=<=!=/<>

2.确定范围:BETWEEN...AND...

<列名> [NOT] BETWEEN <下限> AND <上限>

3.确定集合:IN

<列名> [NOT] IN (值1, 值2...)

4.模式匹配:LIKE

<列名> [NOT] LIKE '<匹配模式>'
通配符 描述
% 替代一个或多个字符
_ 替代一个字符
[charlist] 字符序列中的任何单一字符
[!charlist]
[^charlist]
不在字符序列中的任何单一字符

5.空值:IS NULL

<列名> IS [NOT] NULL

6.多重条件(逻辑运算):ANDORNOT

<条件表达式> AND <条件表达式>
<条件表达式> OR <条件表达式>
NOT <条件表达式>

AND优先级>OR优先级

1.1.3 查询排序:ORDER BY

ORDER BY 子句将查询结果按指定列进行升序 (ASC)降序 (DESC) 排序。

ORDER BY <排序列> [ASC|DESC]

ORDER BY 子句只能对最终查询结果排序。不能对内层查询使用。

1.1.4 聚集函数

聚集函数 描述
COUNT(*) 统计记录行数
COUNT([DISTINCT]<列名>) 统计列中值个数
SUM([DISTINCT]<列名>) 计算列值总和
AVG([DISTINCT]<列名>) 计算列值平均值
MAX([DISTINCT]<列名>) 求列值最大值
MIN([DISTINCT]<列名>) 求列值最小值

注意:
①只有COUNT(*)计算空值,其余聚集函数都跳过空值。
②WHERE 子句中不能用聚集函数,聚集函数只能用于 SELECT 子句和 GROUP BY 中的 HAVING 子句。

1.1.5 分组查询:GROUP BY

GROUP BY 子句将查询结果按某一列或多列的值分组,值相等的为一组。

GROUP BY <分组列> HAVING <分组条件>

分组的目的是为了细化聚集函数的作用对象,分组后聚集函数将作用于每一个组,即每一组都有一个聚集函数值。

WHERE 子句与 HAVING 子句区别
①WHERE 子句作用于基本表/视图,不能使用聚集函数。
②HAVING 子句作用于组。

1.2 连接查询

连接查询:使用连接运算符实现多表查询

1.2.1 交叉连接

交叉连接:笛卡儿积。

①隐式连接:

SELECT <目标列>
FROM <表1>, <表2>

②使用 JOIN 连接:

SELECT <目标列>
FROM <表1> CROSS JOIN <表2>

消除笛卡尔积:使用关联字段。

1.2.2 内连接

内连接:查询与连接条件匹配的所有行,但不去除重复属性列。

①隐式连接:

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性> <比较运算符> <表2>.<关联属性>

②使用 JOIN 连接:

SELECT <目标列>
FROM <表1> [INNER] JOIN <表2> 
ON <表1>.<关联属性> <比较运算符> <表2>.<关联属性> 

1.等值连接

等值连接:当比较运算符为=时的内连接,不去除重复属性列。

①隐式连接:

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性> = <表2>.<关联属性>

②使用 JOIN 连接:

SELECT <目标列>
FROM <表1> [INNER] JOIN <表2> 
ON <表1>.<关联属性> = <表2>.<关联属性>

2.非等值连接

非等值连接:当比较运算符不为=时的内连接,不去除重复属性列。

①隐式连接:

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性> <比较运算符> <表2>.<关联属性>

②使用 JOIN 连接:

SELECT <目标列>
FROM <表1> [INNER] JOIN <表2> 
ON <表1>.<关联属性> <比较运算符> <表2>.<关联属性>

3.自身连接

自身连接:一个表与其自身进行等值连接。

①隐式连接:

SELECT <目标列>
FROM <表> FIR, <表2> SEC
WHERE FIR.<关联属性> = SEC.<关联属性>

②使用 JOIN 连接:

SELECT <目标列>
FROM <表> FIR [INNER] JOIN <表2> SEC
ON FIR.<关联属性> = SEC.<关联属性>

4.自然连接

自然连接:去除重复属性列的等值连接,消除了笛卡儿积。

SELECT *
FROM <表1> NATURAL JOIN <表2>

1.2.3 外连接

外连接:主表内容全部显示。未匹配到,用NULL填充。

1.左外连接

左外连接:以左表为主表,右表为从表。即使右表中没有匹配,也返回左表所有行。

SELECT <目标列>
FROM <表1> LEFT [OUTER] JOIN <表2>
ON <表1>.<关联属性> = <表2>.<关联属性>

Oracle特有写法:从表以 (+) 表示。

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性> = <表2>.<关联属性>(+)

2.右外连接

右外连接:以右表为主表,左表为从表。即使左表中没有匹配,也返回右表所有行。

SELECT <目标列>
FROM <表1> RIGHT [OUTER] JOIN <表2>
ON <表1>.<关联属性> = <表2>.<关联属性>

Oracle特有写法:从表以 (+) 表示。

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性>(+) = <表2>.<关联属性>

3.全外连接

全外连接:返回左表和右表中的所有数据。未匹配字段显示为NULL。

SELECT <目标列>
FROM <表1> FULL [OUTER] JOIN <表2>
ON <表1>.<关联属性> = <表2>.<关联属性>

1.2.4 指定关联字段

①隐式连接-使用WHERE子句指定关联字段:

SELECT <目标列>
FROM <表1>, <表2>
WHERE <表1>.<关联属性> <比较运算符> <表2>.<关联属性>

②JOIN连接-使用ON指定关联字段:

SELECT <目标列>
FROM <表1> JOIN <表2> 
ON <表1>.<关联属性> <比较运算符> <表2>.<关联属性>

③JOIN连接-使用USING指定关联字段:

SELECT <目标列>
FROM <表1> JOIN <表2> 
USING (<关联属性>)

USING等价于ON指定等值同名的关联字段。

1.3 子查询

查询块:临时表

SELECT <目标列>
FROM <表>
WHERE <查询条件>

1.3.1 嵌套查询

嵌套查询:将一个查询块嵌套在另一个查询块的WHERE/HAVING条件子句中。

SELECT <目标列>
FROM <表>
WHERE <列名> <运算符/谓词> 
	(SELECT <目标列>
	 FROM <表>
	 WHERE <查询条件>)

1.带有比较运算符的子查询

当子查询返回单值时,可以使用比较运算符连接。

SELECT <目标列>
FROM <表>
WHERE <列名> <比较运算符>
	(SELECT <目标列>
	 FROM <表>
	 WHERE <查询条件>)

比较运算符:><>=<=!=<>=

2.带有IN的子查询

当子查询返回一个集合时,一般使用IN进行连接。IN在嵌套查询中最为常用。

SELECT <目标列>
FROM <表>
WHERE <列名> IN
	(SELECT <目标列>
	 FROM <表>
	 WHERE <查询条件>)

3.带有ANY或ALL的子查询

SELECT <目标列>
FROM <表>
WHERE <列名> <比较运算符>ANY
	(SELECT <目标列表达式>
	 FROM <表>
	 WHERE <查询条件>)

<比较运算符>ALL:与子查询结果的所有值进行比较运算。
<比较运算符>ANY:与子查询结果的任意某个值进行比较运算。

1.3.2 派生查询

派生查询:将一个查询块嵌套在另一个查询块的FROM子句中,子查询生成的派生表成为了主查询的查询对象。

SELECT <目标列>
FROM <表>, (SELECT <目标列> FROM <表> WHERE <查询条件>) [AS] <别名>
WHERE <查询条件>

注意:必须为子查询生成的派生表指定别名。

1.4 集合查询

集合查询:多个查询结果进行集合运算。

SELECT <目标列> FROM <表> WHERE <查询条件>
	<集合运算谓词>
SELECT <目标列> FROM <表> WHERE <查询条件>

注意:参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。

集合运算 谓词
并集(去重复) UNION
并集(不去重复) UNION ALL
交集 INTERSECT
差集 MINUS

2. SQL更新

2.1 SQL插入:INSERT

INSERT INTO <表> (列名, 列名...) VALUES(值, 值...)

INSERT简写-按表的列顺序插入一行数据:

INSERT INTO <表> VALUES(值, 值...)

2.2 SQL修改:UPDATE

UPDATE <表> SET 列名 = 值, 列名 = 值... 
[WHERE <修改条件>]

2.3 SQL删除:DELETE

DELETE FROM <表> 
[WHERE <删除条件>]
posted @ 2018-07-23 09:39  陈栗  阅读(203)  评论(0编辑  收藏  举报