DDL 数据库定义语言:创建或删除数据库或表对象。
CREATE|DROP 创建|删除数据库
CREATE|DROP DATABASE <数据库名称>;
CREATE TABLE 创建表
CREATE TABLE <表名> (
<列名> <数据类型> <列约束>,
······,
<表约束>,······
);
列约束DEFAULT <默认值>,约束为默认值。
DROP TABLE 删除表
DROP TABLE <表名>;
DML 数据操作语言:增删改查
SELECT:查询表中数据
语法和执行顺序
(8)SELECT
(9)DISTINCT (11)<TOP num> <列名>,······
(1)FROM <表名>
(3)<join_type> JOIN <表名> (2)ON <join_conditon>
(4)WHERE <where_condition>
(5)GROUP BY <列名>,······ (6)WITH <cube|rollup>
(7)HAVING <having_condition>
(10)ORDER BY <列名> ASC|DESC,······;
- SELECT 可以单独查询整列常数(字符串、数字、日期等)和算术运算。
- 在DISTINCT时,NULL也属于一类数据。DISTINCT可以去重多列,多列完全相同的记录合并成一行。
运算符
算术运算符
+ - * /,加减乘除四则运算可以用于任何表达式中,使用+可以拼接字符串。
- 除数不可以为0。
- 包含NULL的算术运算,其结果也是NULL。
- 括号()可以提升运算优先顺序。
比较运算符
>:大于
>=:大于等于
<:小于
<=:小于等于
= :等于
!=|<>:不等于
- 比较运算符可以对计算结果进行比较。
- 字符串类型数据按字典顺序进行排序,比较大小时优先比较前面数据(从左往右)。
- 不能对NULL值使用比较运算符。
逻辑运算符
AND:逻辑与
OR:逻辑或
NOT:逻辑非
- AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。
- AND逻辑运算称为逻辑积,OR逻辑运算称为逻辑和。
逻辑运算和比较运算对返回真值TRUE进行操作。
SQL三值逻辑:除了真(TRUE)、假(FALSE)还有不确定值(UNKNUWN),在逻辑运算中属于中间值:
真AND不确定为不确定,
假AND不确定为假,
真OR不确定为真,
假OR不确定为不确定。
GROUP BY 分组聚合
聚合函数:将多行数据汇总为一行。
COUNT():计算列行数,排除NULL行。用参数*号返回所有行数,包括NULL行。
SUM():计算列数据合计值
AVG():计算列数据平均值
MAX():求出列数据最大值
MIN():求出列数据最小值
- SUM()和AVG()函数计算时自动排除NULL值行数据。只能对数值类型数据使用。
- 使用DISTINCT可以删除重复值行再进行聚合函数计算。
- 只有SELECT、HAVING和ORDER BY字句可以使用聚合函数。
GROUP BY子句指定列称为聚合键。
GROUP BY子句如果使用表达式,SELECT子句也要使用同样的表达式。例:
SELECT CONVERT(VARCHAR(10),日期,20)
FROM T
GROUP BY CONVERT(VARCHAR(10),日期,20)
使用GROUP BY时,SELECT子句和HAVING子句只能存在以下三种元素:
常数
聚合函数
聚合键
- 聚合键包含NULL时,结果会以空行形式表现出来。
- GROUP BY 不能使用别名。
- GROUP BY 子句的结果顺序是随机的。
- HAVING分组聚合条件,写在GROUP BY后面,可以对聚合函数进行条件筛选。
- 聚合键条件可以写在WHERE和HAVING中,更适合写在WHERE子句上。WHERE子句指定行对应条件,HAVING子句指定组对应条件。
ORDER BY 结果排序
- ORDER BY需写在SELECT语句末尾,可以指定多个排序键,多个排序键时从左往右依次排序。
- ASC升序,DESC倒序。
- 排序键中包含NULL时,会集中在开头或者末尾。
- 因为ORDER BY是最后执行的子句,所以可以使用SELECT子句中定义的别名。
- 排序键可以使用并不包含在SELECT子句中的列和聚合函数。
技巧:在查询时分组聚合后可以把列数据转换为行数据。
INSERT:向表插入数据
INSERT INTO <表名>
(列1,······) -- 对表进行全列插入时可以省略列清单
VALUES -- 使用SELECT子句(任何语法)代替VALUES可以插入其他表数据
(值1,······),
······; -- 插入多行值
- 插入字符串和日期类型要加双引号。
- 括号的列为列清单,值为值清单,列清单和值清单列数必须保持一致。
- NULL值也可以插入,但列不能设置NOT NULL约束。
- 显示默认值需制定插入DEFAULT关键字,隐式默认值省略DEFAULT关键字就可以,推荐使用显示默认值。
DELETE:删除表中数据
DELETE FROM <表名> -- 不加条件会删除全部行数据
WHERE <条件>;
- DElETE语句删除对象并不是表或列,而是行。
TRUNCATE TABLE <表名>;
- TRUNCATE属于DDL语句,删除表中的所有行,而不记录单个行删除操作,类似把整表删除然后创建结构相同的新表。 在这个指令之下,表格中的资料会完全消失,可是表格本身会继续存在。truncate 在使用上和 delete 最大的区别是,delete 可以使用条件表达式删除部分数据,而 truncate 不能加条件表达式。
UPDATE:更新表中数据
UPDATE <表名>
SET <列名> = <表达式>, --不加条件会把所有行更新为新值,包括NULL值
······ -- 更新多列
WHERE <条件>;
- 可以使用NULL值更新,称为NULL清空,只限于未设置NOT NULL约束的列。
技巧:把相同键的表T2数据更新到表T1中:
UPDATE T1 SET <T1列名> = T2.<列名> -- T1不使用别名
FROM T1,T2
WHERE <T1列名> = T2.<列名>
视图
创建视图
CREATE VIEW 视图名称 (
<视图列1>,
<视图列2>,
······
) AS
<SELECT语句> -- SELECT语句的排列顺序和视图列排序顺序相同
- 视图创建的是SELECT语句创建的一个临时表,不保存数据。优点:
1、节省存储空间。
2、将频繁使用的SELECT语句保存成视图进行调用。
3、提高安全性。 - 查询视图类似查询表。
- 多重视图:以视图为基础创建视图。多重视图会降低SQL性能,应避免使用多重视图,尽量使用单一视图。
- 定义视图时不要使用ORDER BY子句。
- 不能对视图进行更新操作。(实际满足部分条件可以更新,不建议这样操作)
删除视图
DROP VIEW 视图名称
子查询
普通子查询
子查询就类似访问一个临时表,把子查询嵌套到主查询上,原则上需要使用AS定义一个子查询名称。
- SQL执行过程中优先执行子查询再执行主查询。
- 查询可以嵌套多层子查询,但会使语句越来越难读懂和影响性能,应避免嵌套多层子查询。
标量子查询
返回单一值的子查询。可以用在比较运算符中。
- 标量子查询可以当成常数使用在各种位置上。
- 聚合函数可以统计出标量子查询
关联子查询
SELECT * FROM T1
WHERE T1.column1 > (SELECT <聚合列>
FROM T2
WHERE T1.关联键 = T2.关联键 -- 关联条件一定要放在子查询上
GROUP BY <分组列>)
关联名称(别名)有作用域,子查询内的关联名称只能在内部使用,不可以在主查询使用。
谓词
谓词是需要满足特定条件的函数,该条件返回的是真值,这也是谓词和函数的区别。
LIKE
通配符:
% 代替0个或多个字符
_ 代替一个字符
NOT LIKE 选取不匹配模式
BETWEEN
BETWEEN 小值 AND 大值 -- 筛选小值和大值范围的数据,包含大小值数据
IS NULL
判断是否为空值,IS NOT NULL:判断值是否不为空。
IN
IN (值1,值2,······) -- 判断是否在括号值内,NOT IN为否定,不可以判断NULL值。
谓词IN括号后面可以使用子查询。
IF EXIST
判断是否满足某种条件的记录,常用在触发器上,符合条件执行相应操作。
CASE 表达式
-- 搜索CASE表达式,每个WHEN后都有一个求值
CASE
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> TEHN <表达式>
······
ELSE <表达式> END -- ELSE省略默认为NULL,不建议省略。
-- 简单CASE表达式,单一求值放在CASE后
CASE <表达式>
WHEN <表达式> THEN <表达式>
WHEN <表达式> THEN <表达式>
······
END <表达式> END
- CASE属于表达式,可以放在可以用表达式的所有地方。
CASE表达式用在SELECT和GROUP BY中可以进行多条件判断分组查询。
SELECT CASE <表达式>,聚合函数(列)
FROM T
GROUP BY CASE <表达式>
CASE表达式用在聚合函数里,可以把“行结构”转换“列结构”。
SELECT 左列,聚合函数(CASE表达式)
FROM T
GROUP BY 左列
集合运算
对满足统一规则的记录进行加减乘除等四则运算,进行集合运算的运算符为集合运算符
UNION 行运算
SELECT 语句一 -- SELECT语句一和语句二的列数和类型需相同
UNION|INTERSECT|EXCEPT -- 去除重复的记录,加关键字ALL保留重复记录
SELECT 语句二 -- ORDER BY子句只能在最后SELECT语句使用
- UNION 行并集:合并两张表的记录数据
- INTERSECT 行交集:刷选两张表中相交的记录
- EXCEPT 行差集:去除表1中存在表2的记录
JOIN 列运算
SELECT *
FROM T1
INNER|OUT|LEFT|RIGHT JOIN T2 ON T2.<联结键> = T1.<联结键> -- 指定多条件时可以使用AND、OR。
- ON用来指定联结条件,作用同WHERE,但要区分开。
- INNER JOIN 内联结:相交记录,左右表共同存在的记录。
- OUT JOIN 外联结:全部记录,左右表都存在对方的NULL记录。
- LEFT JOIN 外联结:左主表记录,左边存在右表NULL记录,平时用的最多。
- RIGHT JOIN 外联结:右主表记录,右边存在左表NULL记录。
- CROSS JOIN 交叉联结:笛卡儿积,交叉联结不用使用ON子句,记录为左右表行数乘积。
- 内联结(过时的语法):
SELECT * FROM T1,T2 WHERE T2.<联结键> = T1.<联结键> -- 缺点:不好判定内外联结,ON和WHERE条件混合那区分。
函数
窗口函数
<窗口函数> OVER (PARTITION BY <分组列> ORDER BY <排序列>|DESC)
- PARTITION BY分组的记录集合称为“窗口”,类似GROUP BY分组,但不具备汇总功能,不会减少记录行数,仍然显示所有分组列的值。
- PARTITION BY可以省略,省略后相当于将整个表作为一个大窗口使用,使整表进行排序。
聚合函数可以作为窗口函数使用:
- SUM():按行顺序累计统计总数量
- AVG():按行顺序累计统计平均数
- COUNT()、MAX()、MIN()
- ORDER BY后加ROWS <前行数> PRECEDING:统计前行数到本行的数据
- ORDER BY后加ROWS <后行数> FOLLOWING:统计本行到后行数的数据
- ORDER BY后加ROWS BETWEEN <前行数> PRECEDING AND <后行数> FOLLOWING:统计本行前后行数的数据
专用窗口函数:
RANK():用数字计算分组后记录排序时,则会跳过之后的位次。如:1、1、3
DENSE_RANK()用数字计算分组后记录排序时,不会跳过之后的位次。如:1、1、2
ROW_NUMBER()用数字计算分组后记录排序时,赋值唯一连续位次。如:1、2、3
- 窗口函数只能写在SELECT子句中。
- 专用窗口函数无需参数,括号是空的。
GROUPING运算符
ROULLUP:同时得出合计和小计,用在GROUP BY 后面
CUBE
GROUPING SETS
特殊符号
- (*)代表全部意思
- (AS)为表或列设定别名
- (–)注释一行,(/* */)注释多行。
DCL 数据控制语言:确认或取消对数据进行的变更,管理权限。
COMMIT:确认对数据变更
ROLLBACK:取消对数据变更
GRANT:赋予用户操作权限
REVOKE:取消用户操作权限
事务
事务是需要在同一个处理单元中执行的一系列更新处理的集合。
事务遵循四种特性,也称为ACID特性:
- 原子性(Atomicity):要么全部执行,要么全部不执行。
- 一致性(Consistency):列属性约束无法执行时全部回滚。
- 隔离性(Isolation):保证不同事务之间互不干扰。
- 持久性(Durability):指事物结束后,DBMS能够保证该时间点的数据状态被保存。
事务开始语句:
BEGIN TRANSACTION -- SQL Server、PostgreSQL使用
START TRANSACTION -- MySQL使用
DML语句一:
DML语句二:
······
事务结束语句:
(END或COMMIT或ROLLBACK)
存储过程
--创建|更新存储过程
CREATE|ALTER PROCEDURE procedure_name [; number]
[{@parameter data_type}[VARYING][= default][OUTPUT]]
[,...n]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement [...n]
-- 调用存储过程,存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
EXECUTE Procedure_name ''
-- 删除存储过程,在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
drop procedure procedure_name
参数解释:
procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。
number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
@parameter:存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。
data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。
说明对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
VARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT:表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
RECOMPILE:表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION:表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。
as:指定过程要执行的操作。
sql_statement:过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
触发器
CREATE TRIGGER trigger_name -- 创建触发器名称
ON table_name [WITH ENCRYPTION] -- 表或视图
[AFTER | INSTEAD] OF [DELETE | INSERT | UPDATE]
AS
BEGIN
SQL语句
END
快捷方式
- Ctrl + / 注释
- Tab 缩进,Shift + Tab 反缩进