SQL语言的专著与互联网资源已有不少,写这篇博客的主要目的是将SQL基本的语法尽可能简洁地总结出来。因此,本文对SQL的介绍不求详尽,而是尽量做到简洁、可读性强,主要语法便于随时查找。
一、基本概念:
DBMD:Database Management System, 数据库管理系统——用来管理数据库的计算机系统。
字段:表的列。
记录:表的行。
SQL语句分为三类:
DDL:(Data Definition Language,数据库定义语言)
CREATE | 创建数据库和表等对象 |
DROP | 删除数据库和表等对象 |
ALTER | 修改数据库和表等对象 |
DML : (Data Manipulation Language, 数据操作语言)
SELECT | 查询 | UPDATE | 变更 |
INSERT | 插入 | DELETE | 删除 |
DCL(Data Control Language, 数据控制语言)
COMMIT | 确认对数据库中的数据进行的变更 |
ROLLBACK | 取消对数据库中的数据进行的表更 |
GRANT | 赋予用户操作权限 |
REVOKE | 取消用户的操作权限 |
数据库与表的创建
CREATE DATABASE <数据库名称> ; | 创建数据库 |
CREATE TABLE <表名> ( <列名1> <数据类型> <该列所需约束>, <列名2> <数据类型> <该列所需约束>, …… <该表的约束1> , <该表的约束2>,……) ; | 创建表 |
数据类型
INTEGER | 整数型 | CHAR | 定长字符串 |
DATE | 日期型 | VARCHAR | 可变长字符串 |
表的删除和更新
DROP TABLE <表名> ; | 删除表 |
ALTER TABLE <表名> ADD COLUMN <列的定义> ; | 添加列 |
ALTER TABLE <表名> DROP COLUMN <列名> ; | 删除列 |
二、查询
基本查询
SELECT <列名> , …… FROM <表名>; | 从表中查询列 |
SELECT * FROM <表名> ; | 查询全部列 |
SELECT <列名> AS <新列名> , FROM <表名> ; | 为列设定别名 注:使用汉语时需要用双引号 “ ” 括起来 |
SELECT <常数> AS <列名>, FROM <表名> ; | 查询常数; 常数可以为字符串常数、数字常数、日期常数等 |
SELECT DISTINCT <列名> FROM <表名> ; | 查询结果中删除重复的数据 |
SELECT <列名> , …… FROM <表名> WHERE <条件表达式> ; | 指定条件的查询 |
+ | 加 | > | 大于 |
- | 减 | >= | 大于等于 |
* | 乘 | !> | 不大于 |
/ | 除 | BETWEEN AND | 介于指定的两值之间 |
= | 等于 | IS NULL | 为NULL值 |
<> | 不等于 | NOT | 非 |
!= | 不等于 | AND | 与 |
< | 小于 | OR | 或 |
<= | 小于等于 |
SELECT COUNT(*) FROM <表名> ; | 计算全部行数 |
SELECT COUNT(<表名>) FROM <表名> ; | 计算NULL之外的数据行数 |
SELECT SUM(<列名>) FROM <表名> ; | 计算此列的合计值 |
SELECT AVG(<列名>) FROM <表名> ; | 计算此列的平均值 |
SELECT MAX(<列名1>) , MIN(<列名2>) FROM <表名> ; | 计算列1的最大值,列2的最小值 |
SELECT COUNT(DISTINCT <列名>) FROM <表名> ; | 计算去除重复数据后的行数 |
SELECT DISTINCT COUNT( <列名> ) FROM <表名> ; | 先计算数据行数再删除重复数据 |
SELECT <列名1>, <列名2> , …… FROM <表名> GROUP BY <列名1> ; | 按列1进行分组 |
SELECT <列名1> ,<列名2>, …… FROM <表名> GROUP BY <列名1> HAVING <分组结果对应的条件> ; | 取出符合指定条件的组 |
排序
SELECT <列名1> , <列名2> , …… FROM <表名> ORDER BY <排序基准列1> , <排序基准列2> , …… ; | 按指定的排序基准列排序; 有多个基准列时,先按第一个基准列排序, 再按第二个基准列排序,依此类推; 默认按升序排列 |
SELECT <列名1> , <列名2> , …… FROM <表名> ORDER BY <排序基准列> DESC ; | 按降序排列 |
视图
CREATE VIEW 视图名称 (<视图列名1> , <视图列名2> ,……) AS <SELECT语句> ; | 创建视图 注:创建视图时不能使用ORDER BY子句 |
SELECT <视图列名1> , <视图列名2> ,…… FROM 视图名称 ; | 使用视图 |
DROP VIEW 视图名称 (<视图列名1> , <视图列名2>, ……) ; | 删除视图 |
三、修改
插入
INSERT INTO <表名> (列1,列2,……) VALUES(值1,值2,……) ; | 在表中插入列清单和相应的值清单 注:所谓清单就是括在括号内, 用逗号分隔的这种形式 |
INSERT INTO <表名> VALUES(值1,值2,……) ; | 对表进行全列INSERT时, 可以省略表名后面的列清单 |
INSERT INTO <表名> (列1,列2,……) VALUES(值1,NULL,……) ; | 向列2中插入NULL |
INSERT INTO <表名> (列1,列2,……) VALUES(值1,DEFAULT,……) ; | 若在创建表时设定了默认值, 则在INSERT时可自动为列赋值 |
INSERT INTO <表名2> (列1,列2,……) SELECT (列1,列2,……) FROM <表名1> ; | 将表1中的数据复制到表2 注:该INSERT语句中的 SELECT语句也可以使用 WHERE子句或GROUP BY 子句等 |
删除
DROP TABLE <表名> | 完全删除整张表 |
DELETE FROM <表名> ; | 仅删除全部数据行,保留数据表 |
DELETE FROM <表名> WHERE <条件> ; | 删除部分数据行 |
UPDATE <表名> SET <列名> = <表达式> ; | 更新数据 |
UPDATE <表名> SET <列名> = <表达式> WHERE <条件> ; | 更新部分数据行 |
UPDATE <表名> SET <列名> = NULL WHERE <条件> ; | 更新为NULL |
UPDATE <表名> SET <列名1> = <表达式1> <列名2> = <表达式2> WHERE <条件> ; | 多列更新 |
UPDATE <表名> SET ( <列名1> , <列名2> ) = ( <表达式1> , <表达式2> ) WHERE <条件> ; | 多列更新 |
BEGIN TRANSACTION UPDATE <表名> WHERE <条件1> ; UPDATE <表名> WHERE <条件2> ; COMMIT ; | 事务处理 注:MySQL中应将BIGIN换为START |
BEGIN TRANSACTION UPDATE <表名> SET <列名> = <表达式1> WHERE <条件1> ; UPDATE <表名> SET <列名> = <表达式2> WHERE <条件2> ; ROLLBACK ; | 取消事务处理 注:MySQL中应将BIGIN换为START |
四、函数、谓词、CASE表达式
算术函数
ABS(数值) | 绝对值 |
MOD(被除数,除数) | 求余 |
ROUND(对象数值,保留的小数位数) | 四舍五入 |
字符串函数
字符串1 || 字符串2 | 拼接两个字符串 |
LENGTH (字符串) | 字符串长度 |
LOWER (字符串) | 小写转换 |
UPPER (字符串) | 大写转换 |
REPLACE (对象字符串,对象字符串中欲替换的部分字符串,替换后的字符串) | 字符串替换 |
SUBSTRING (对象字符串 FROM 截取的起始位置 FOR 截取的字符数) | 字符串截取 注: 只适用于MySQL和PostgreSQL |
SUBSTRING (对象字符串 截取的起始位置 截取的字符数) | 字符串截取 注:只适用于SQL Server |
SUBSTR (对象字符串 截取的起始位置 截取的字符数) | 字符串截取 注:只适用于Oracle和DB2 |
CURRENT_DATE | 当前日期 注:没有参数,无需使用括号 |
CURRENT_TIME | 当前时间 注:没有参数,无需使用括号 |
CURRENT_TIMESTAMP | 当前日期和时间 注:没有参数,无需使用括号 |
EXTRACT (日期元素 FROM 日期) | 截取日期元素; 日期元素有YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 注:返回值不是日期类型,而是数值类型 |
转换函数
CAST (转换前的值 AS 想要转换的数据类型) | 类型转换 |
COALESCE (数据1, 数据2, ……) | 将NULL转换为其它值, 返回可变参数中左侧开始第一个不是NULL的值 注:所谓“可变参数”是指参数的个数不固定,可自由设定 |
聚合函数
COUNT() | 记录数(行数) |
SUM() | 合计值 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
LIKE谓词——字符串的部分一致查询
LIKE 'abc%' | 选出以abc开头的所有字符串 注1:这里abc为举例,实际上可以为任意字符串,下同 注2:Access中需要使用 * 而不是%,下同 |
LIKE '%abc%' | 选出包含abc的所有字符串 |
LIKE '%abc' | 选出以abc结尾的所有字符串 |
LIKE 'abc_' | 选出包含 “abc+任意一个字符” 的所有字符串 注:Access中需要使用 ? 而不是 _ |
LIKE 'abc_ _' | 选出包含 “abc+任意两个字符” 的所有字符串 |
LIKE [ ] | 匹配方括号中的任意一个字符,且只能匹配单个字符 注:只适用于Access和SQL Server 例:LIKE '[ab%]' 选出所有以a开头或以b开头的字符串 |
LIKE [^ ] | 匹配不在方括号中的字符串 注1:只适用于Access和SQL Server 注2:Access中需要使用 !而不是 ^ 例:LIKE '[^ab%]' 选出所有不以a开头或不以b开头的字符串 |