基本概念

  • 数据库(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关键字,这样得到的是含有重复元素的多重集