SQL基础教程
基本概念
- 数据库(Database): 经过组织的数据集合
- 数据库管理系统(Database Management System, DBMS): 用于管理数据库的软件
- 关系数据库(Relational Database): 直观上来说,就是以表格结构管理数据的数据库
- 结构化查询语言(Structured Query Language, SQL): 用于对关系数据库进行操作的计算机语言
关系数据库中表格的结构:行为记录,表示一条完整的具体的数据;每一列分别记录了特定的信息。关系数据库以行为单位进行数据操作。一个单元格只能有一项数据。
使用SQL查询数据时,输入是表格,输出也是表格。根据用途的不同,SQL可以分为:
- Data Definition Language, DDL: 用来定义表格的结构,以及对表中数据的约束,也就是数据应该以什么样的方式存储
- Data Manipulation Language, DML: 用来操作表中的数据
- Data Control Language, DCL: 用来控制对数据的读写权限和数据的变更,也就是控制数据操作的运行(控制的是操作不是数据)
对表格结构的操作
- 创建数据库
CREATE DATABASE <database_name>;
- 创建表格
CREATE TABLE <table_name> (<column_name>, <data type> <constraint_on_column>, ... <constraint_on_table>, ...);
data type是列所对应的数据类型 constraint表示数据应该满足的约束条件
- 删除表格
DROP TABLE <table_name>;
- 更新表格结构
- 添加列
ALTER TABLE <table_name> ADD COLUMN <column_name>, <data type> <constraint_on_column>;
- 删除列
ALTER TABLE <table_name> DROP COLUMN <column_name>;
- 添加列
Note
- 创建表格时可以用DEFAULT关键字设置默认值。当列没有NOT NULL约束时,其默认的默认值是NULL
- 规律:创建用CREATE,删除用DROP
表达式与函数
表达式
简单地说,表达式就是数据值+运算。表达式经过计算,最终会产生一个值。
表示特定运算的符号称为运算符,SQL中常见的运算符有
- 算术运算符:加(+)、减(-)、乘(*)、除(/)、取模(%)等
- 比较运算符:相等(=)、不等(<>)、大于(>)、小于(<)等
- 逻辑运算符:和(AND)、或(OR)、非(NOT)、为空(IS NULL)等
CASE表达式可以用来进行条件判断。 CASE表达式的形式
CASE WHEN <condition> THEN <expression>
WHEN <condition> THEN <expression>
...
ELSE <expression>
END
函数
函数是一种数据的处理过程,它包含输入和输出两部分。函数先是接收作为输入的参数,然后进行各种计算处理,最后返回处理的结果。函数就像加工厂一样,对输入的内容进行加工,并输出加工后的产品。
运算符也可以认为是函数。表达式中经常会用到函数。
SQL中的函数主要有以下几种
- 算术函数
- 字符串函数
- 日期函数
- 转换函数
- 聚合函数
谓词可以认为是返回逻辑值的函数。 常用的谓词有
- LIKE,用来检查字符串的匹配
- BETWEEN
- IN,用来检查数据是否为特定的值
- EXIST,用来检查满足条件的记录是否存在
数据查询
基础查询
基本形式
SELECT <column_name>, ...
FROM <table_name>, ...
WHERE <condition>, ...
怎么理解:从指定表格中(FROM),在所有满足特定条件的行中(WHERE),选出它们的指定列(SELECT)
关于SELECT子句:
- 可以使用SELECT * 选取所有列
- 可以使用AS 关键字为列设置别名,子句的形式为
SELECT <column_name> AS <alias>
- 可以使用DISTINCT关键字去除重复的数据,子句的形式为
SELECT DISTINCT <column_name>, ...
- 可以对列使用算术表达式
分组与排序
使用GROUP BY语句可以对表格进行分组操作,在GROUP BY子句后使用HAVING子句可以筛选出符合条件的分组。使用ORDER BY子句可以对结果进行排序。
基本形式
SELECT <column_name>, ...
FROM <table_name>, ...
WHERE <condition>, ...
GROUP BY <column_name>, ...
HAVING <condition>, ...
ORDER BY <column_name>, ...
GROUP BY子句后的列称为分组列,分组时以分组列上的取值进行划分,分组列上取值相同的记录会被划分到同一组。
ORDER BY子句后的列称为排序列,在排序列后中可以使用ASC或DESC关键字来表示升序排序或降序排序。
语句的执行顺序:FROM → WHERE → GROUP BY → HAVING → ORDER BY → SELECT。
Note
- 在使用GROUP BY子句时,聚合函数的执行会分别在各个分组上进行,因此分组列又称聚合键
- 在使用GROUP BY子句时,SELECT子句只能选取分组列和聚合函数,因为在分组中,分组列与其他列不一定是一一对应的,有可能分组列上的一个取值对应了其他列上的多个取值
数据更新
- 插入数据
INSERT INTO <table_name> (<column_name>, ...) VALUES (<value>, ...)
- 删除数据
DELETE FROM <table_name> WHERE <condition>, ...
- 更新数据
UPDATE <table_name> SET <column_name> = <expression>, ... WHERE <condition>, ...
Note
- 可以把INSERT语句和SELECT语句结合在一起使用,把INSERT语句中的VALUES子句替换成SELECT语句即可
- 默认值的插入分为显式和隐式两种。显式地插入默认值需要使用DEFAULT关键字,而被省略的列将会被隐式地插入默认值
简单集合运算
集合可以认为是记录的总体,而集合中的一条记录称为元素。集合运算就是对一个或多个集合进行计算得到另一个集合。
SELECT语句的运算结果可以看成是一个集合,因此可以对多个SELECT语句的运算结果进行集合运算。
常见的集合运算有:
- 并集UNION ,合并两个集合
- 交集INTERSECT ,选出两个集合中的公共部分
- 差集EXCEPT,在一个集合中除去另一个集合的元素
Note
- 并集、交集、差集操作要求两个集合必须拥有相同的表结构
- 集合是没有重复元素的,因此并集、交集、差集操作不保留重复元素。如果要保留重复元素,则需要使用ALL关键字,这样得到的是含有重复元素的多重集