基本简介

SQL 是 Structured Query Language(结构化查询语言)的缩写,用于管理关系数据库;包含数据库模式创建和修改、数据的访问控制:插入、查询、更新和删除等操作。

用途

  • 面向数据库执行查询
  • 从数据库取回数据
  • 在数据库中插入新的记录
  • 更新数据库中的数据
  • 从数据库删除记录
  • 创建新数据库
  • 在数据库中创建新表
  • 在数据库中创建存储过程
  • 设置表、存储过程和视图的权限

    特性

  • 标准的计算机语言
  • 对大小写不敏感
  • ;表示结束,可分成多行以便于阅读和调试
  • 自上而下执行

    概念

    | 数据库(database) | 保存有组织的数据的容器 |
    | —- | —- |
    | 表(table) | 某种特定类型数据的结构化清单 |
    | 模式(schema) | 关于数据库和表的布局及特性的信息 |
    | 列(column) | 表中的一个字段,所有表都是由一个或多个列组成 |
    | 数据类型(datatype) | 所容许的数据的类型 |
    | 行(row) | 表中的一个记录 |
    | 主键(primary key) | 一列(或一组列),其值能够唯一区分表中每个行 |
    | 外键(foreign key) | 表中的一列,它包含另一个表的主键值,定义了两个表之间的关系 |
    | 子句(clause) | SQL 语句由子句构成,有些子句是必需的,有些是可选的,比如 select 语句的 from 子句 |

    主键

  • 不更新主键列中的值;
  • 不重用主键列的值;
  • 不在主键列中使用可能会更改的值。

    语法入门

    连接数据库
    1
    2
    3
    4
    mysql -uroot -p
    show full processlist
    explain
    ALTER TABLE employee ADD COLUMN Ethnic_Groups char(6) DEFAULT NULL COMMENT '民族' AFTER Sex;

    数据库表

    | CREATE DATABASE | 创建新数据库 |
    | —- | —- |
    | ALTER DATABASE | 修改数据库 |
    | CREATE TABLE | 创建新表 |
    | ALTER TABLE | 变更(改变)数据库表 |
    | DROP TABLE | 删除表 |

    增删改查

    | INSERT INTO | 向数据库中插入新数据 |
    | —- | —- |
    | DELETE | 从数据库中删除数据 |
    | UPDATE | 更新数据库中的数据 |
    | SELECT | 从数据库中提取数据 |

    增加

    INSERT INTO 语句用于向表中插入新记录,有两种编写形式:
    1
    2
    INSERT INTO 表名
    VALUES (数据1,数据2,数据3,...);
    1
    2
    INSERT INTO 表名 (列1,列2,列3,...)
    VALUES (数据1,数据2,数据3,...);

    删除

    DELETE 语句用于删除表中的行,使用时要慎重,没有撤销操作
    1
    2
    DELETE FROM 表名
    WHERE 列=数据;

    修改

    UPDATE 语句用于更新表中的记录
    1
    2
    3
    4
    5
    UPDATE 表名
    SET 列1=新数据,列2=新数据,...
    WHERE 列=数据;
    #例如:
    UPDATE employee SET Office="青网科技园" WHERE Office="合肥";

    查询

    SELECT 语句用于从数据库中选取数据,结果被存储在一个结果表中,称为结果集
    1
    SELECT * FROM 表名;
    1
    2
    SELECT 列1,列2
    FROM 表名;
    1
    2
    SELECT * FROM employee;
    SELECT Employee_Name,Sex FROM employee WHERE Office="中科大厦";
    SELECT DISTINCT 语句用于返回唯一不同的值,去重
    1
    2
    SELECT DISTINCT 列1,列2
    FROM 表名;

    其他语句

    WHERE

    WHERE 子句用来指定满足条件的记录,省略所有的记录都会受影响
  • 文本需要使用引号包括
  • 可以使用运算符、函数
  • 运算符
    | = | 等于 |
    | —- | —- |
    | <> | 不等于(!=) |
    | > | 大于 |
    | < | 小于 |
    | >= | 大于等于 |
    | <= | 小于等于 |
    | BETWEEN | 在某个范围内 |
    | LIKE | 搜索某种模式 |
    | IN | 指定针对某个列的多个可能值 |
    | AND | 两个条件都得满足 |
    | OR | 满足其中一个就行 |

    IS (NOT) NULL

    是(否)为空值,\= & <>!= 不能用来判断 NULL
    1
    2
    3
    SELECT 列
    FROM 表名
    WHERE 列 IS (NOT) NULL;

    BETWEEN AND

    使用BETWEEN m AND n指定所需范围的开始值和结束值,进行范围限定,m<n
  • IN & OR
    IN 操作符后接 () 里面的每个条件进行匹配,如果只有两个条件可用 OR 代替
    1
    2
    3
    SELECT 列
    FROM 表名
    WHERE 列 IN (a,b,c);

    NOT

    否操作符,跟上述两个操作一起使用,对条件取反
  • LIKE 操作符
  • %表示任意多个字符,包括没有字符(无法匹配NULL的)
  • _表示任意单个字符
  • 可以使用\进行转义
  • 正则表达式

正则表达式中转译使用 \

1
2
3
SELECT 列
FROM 表名
WHERE 列 REGEXP 'regexp';

ORDER BY

1
2
3
SELECT 列1,列2
FROM 表名
ORDER BY 列1,列2 ASC|DESC;

LIMIT

限制运行结果

1
2
3
SELECT DISTINCT 列1,列2
FROM 表名
LIMIT 数字;

复杂查询

所谓复杂查询其实就是子查询,因为查询中嵌套着查询(无限套娃),导致查询复杂度被无限放大。

排序

ORDER BY 子句用来设定按哪个字段哪种方式进行排序,再返回搜索结果

1
2
3
;默认 ASC(A升序)DESC(降序)
SELECT * FROM info ORDER BY balance [ASC];
SELECT * FROM info ORDER BY balance DESC;

多字段排序
1
SELECT * FROM info ORDER BY balance [ASC],ORDER BY age DESC;

分组

  • GROUP BY 语句根据一个或多个列对结果集进行分组
  • WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)

    联查

  • UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中
  • UNION ALL:返回所有结果集,包含重复数据
  • UNION DISTINCT:删除结果集中重复的数据(默认)

    连表

    INNER JOIN(内连接或等值连接):获取两个表中字段匹配关系的记录

    LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录

    RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录

    实例

    分组联查

    需求:列出薪资高于部门号为 30 下的所有员工的姓名、薪资、部门名称
    1
    2
    3
    SELECT e.ename , e.sal , d.dname
    FROM emp e JOIN dept d ON e.deptno = d.depno
    WHERE e.sal > ALL(SELECT sal FROM emp WHERE dempno = 30);
    需求:列出公司各等级雇员的数量和平均工资
    1
    2
    3
    SELECT s.grade , COUNT(e.empno) , AVG(e.sal)
    FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
    GROUP BY s.grade;
    需求:列出与张三(排除)从事相同工作的所有员工及部门名称,部门人数
    列出与张三(排除)从事相同工作的所有员工及部门名称
    1
    2
    3
    4
    SELECT e.* , d.dname
    FROM emp e JOIN dept d ON e.deptno = d.depno
    WHERE e.job = (SELECT job FROM emp WHERE ename = '张三')
    AND e.ename != '张三';
    统计部门人数
    1
    2
    3
    SELECT deptno , COUNT(1) dc
    FROM emp
    GROUP BY deptno
    三表联查,完成
    1
    2
    3
    4
    5
    SELECT e.* , d.dname
    FROM emp e JOIN dept d ON e.deptno = d.depno
    JOIN (SELECT deptno , COUNT(1) dc FROM emp GROUP BY deptno) n ON e.deptno = n.depno
    WHERE e.job = (SELECT job FROM emp WHERE ename = '张三')
    AND e.ename != '张三';