简单DQL:
- 所有的查询,不会影响表中数据的变化。
- 关键词大小写没有硬性要求,规范是大写
- 通过使用(),调整四则运算中的优先级
- Null值在做任何运算时,结果都是Null
- * 代表全部
- 起别名:列名(空格)别名 或者列名 AS 别名 ;别名提高效率
- 特殊字符,可使用“”进行强制显示。
- DISTINCT,在某字段中消除重复,仅显示单一存在的元素。
- 在一个表中,只能出现一次,并且只能出现在SELECT之后。
- 当DISTINCT后有多个字段名时,消除所有字段中内容全部重复的行。
- 分号可以不用写
- 查询某列,也叫投影查询
条件DQL:
- 单条件查询:WHERE 表达式; 表达式:列明 条件运算符 要比较的值
- 字符型和日期型进行条件查询时,必须加上单引号或者双引号
- 常用的特殊比较运算符:BETWEEN..AND...、IN、LIKE、IS NULL
- BETWEEN..AND...关键词,有大小排序要求
- 是否是NULL值 使用IS Null 或者 IS NOT Null判断
- IN查询某列的值是否和给定集合内的任意一个值相等
- 语法:WHERE 列名 IN (值1, 值2, ....值n)
- 逻辑或关系
- LIKE模糊查询,查询出某列的值是否满足关键字匹配
- 语法:列名 LIKE 条件
- %:百分号,代表匹配零个或任意个字符
- _:下划线,代表一个字符
- 当 条件中没有通配符,LIKE等于 =
- 当出现通配符作为查询条件时,通过转义字符进行查询 能将紧跟在后的通配符变为普通字符
- ESCAPE
- 多条件查询,条件之间使用AND OR NOT 逻辑关系进行连接
排序DQL:
- 语法:ORDER BY 列名1 | 列别名1 | 列序号1 [ ASC | DESC ], 列名2 | 列别名2 | 列序号2 [ ASC | DESC ]
- 只能在SELECT 语句的最后
- 默认ASC升序,DESC表示降序
- 空值在升序排列中排在最前面,在降序排列中排在最后
- 多列排序:前列相同,后列排序
- SELECT ename,sal,sal*12 FROM emp order by 1 ASC ; 依据表中第一个列排序。 该题对ename排序。
多表DQL:
- 不是所有表之间都能做多表查询,前提:表之间存在关系
- WHERE子句书写连接条件
- 不同表的相同列,使用表名前缀进行区分
- 对n个表进行查询,至少要有n-1个连接条件
- 多表连接分类
- 连接条件:等值连接、非等值连接
- 连接方式:外连接、内连接
- 笛卡尔积(也称交叉连接)产生的条件:
- 连接条件失效
- 不写连接条件
- 笛卡尔积的特点:
- 数据量是两个表数据数的乘积
- 将A表中每条记录与B表中的每条记录进行连接
- 自链接:自己与自己表连接;
- SQL1999标准语法:
- FROM 表1 JOIN 表2 ON(连接条件) WHERE 过滤条件
- 左外连接:左表中符合连接条件和不符合连接条件的数据(所有数据),右边表只查询符合连接条件的数据。
- 右外连接:右表中符合连接条件和不符合连接条件的数据(所有数据),左边表只查询符合连接条件的数据
查询所有雇员姓名,部门编号,部门名称,包括没有员工的部门也要显示出来
SELECT e.ename,e.deptno,d.loc
FROM emp e
RIGHT OUTER JOIN dept d
ON (e.deptno = d.deptno);
- 集合运算(用在两个SELECT语句之间)
- 并集;UNION又称为联合查询:把多个查询结果合并起来,形成一个新的查询结果集(并集),ALL表示包含两个结果集中重复数据是否消除。执行结果与oracle 全外连接效果相同(oracle支持全外连接)
- 交集:INTERSECT 取两个表的相同数据
- 差集:EXCEPT 取两个表的不同数据
分组DQL
分组函数也叫聚合函数,对表中的一组数据进行操作,每组只返回一个结果。
- 用法: SELECT 分组函数(列名)
- MAX、MIN、SUM、AVG、COUNT、
- 分组函数在使用时,忽略空值
- IFNULL(n1,n2)如果不是NULL,则返回n1。 否则,IFNULL函数返回n2。
- GROUP BY 子句:将表中满足WHERE条件的记录按照指定的列划分成若干个小组,划分的规则是:把满足条件的记录,在该列上相同的值做为一组。可做多列分组。每个部门每个职位分组 位置在WHERE后,ORDER之后。
- 当有GROUP BY子句时,SELECT子句后面只能写:被分组的列、分组函数
- 如果先过滤在分组,过滤条件写在WHERE中,如果先分组在过滤,过滤条件写在HAVING中。(HAVING写法与WHERE相同,但是能使用WHERE不能使用的分组函数)
- SQL语句,最先执行FROM子句,然后 ON、JOIN、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT
- 在MySQL中,起别名会被预先执行。Oracle不允许。
分页DQL
- LIMIT [start,]length limit接受一个或两个整数参数。start表示从第几行记录开始输出(不写默认是0),length表示输出的记录行数。
- 起始索引从0开始,起始索引=(查询页码-1)* 每页显示的记录数
- 如果查询的是第一页数据(10条数据),起始索引可以省略,直接简写为 limit 10
子DQL
1.SELECT select_list FROM table WHERE expr operator
( SELECT select_list FROM table);
括号内的查询叫做子查询,也叫内部查询,先于主查询执行。
子查询的结果被主查询(外部查询)使用
expr operator包括比较运算符:单行运算符:>、=、>=、<、<>、<=
多行运算符: IN、ANY、ALL
- 子查询要参考主查询的需求
- 多行子查询,>ANY相当于,大于子集中的最小值。>ALL相当于大于自己中的最大值,Oracle不支持多行子查询。
- 子查询允许存在空指针
- SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>1000;
SELECT * FROM (SELECT deptno,SUM(sal) sum_sal FROM emp GROUP BY deptno) t WHERE t.sum_sal>1000;
两个语句查询结果相同,FROM可接临时表
- 尽量不使用子查询。
DML数据操作
1. 增加值
-
- 插入单行数据:INSERT INTO 表名 ( 列名1 ,列名2, ......列名n ) VALUES (值1, 值2, ... 值n); 列名1 列名2 列名3 (可以不按表单顺序书写列名,但是必须一一对应)
值1 值2 值3(有数据类型限制)
-
- 可以不写表头行,值默认与表单列名一一对应
- 可以使用逗号分割,使用一个VALUES子句,一次写入多行数据
-
- 如果只书写前部分列数据,其余部分自动设置为默认值
- 获取日期类型数据:
- SELECT SYSDATE();----获取系统时间函数
- SELECT CURRENT_DATE();---获取当前日期
- SELECT CURTIME();---获取当前时间 等等
- 使用子查询进行数据插入
- INSERT INTO 表名 (列名1,列名2,列名3) SELECT empno,ename,sal FROM emp_test;
- 修改值
- 语法:UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,....列名n = 值n;
说明:SET子句用来限定修改哪些列,一次可以修改一个列,也可以同时修改多个列,每个列之间用逗号分割。
-
- 修改指定位置:
- 使用WHERE子句用来过滤修改行
- WHERE 条件表达式
- 修改指定位置:
- 删除值
- DELECT FROM emp_copy WHERE deptno =(SELECT sal FROM emp WHERE ename=’scott’);
- DELETE FROM 表名; 删除表中所有行
- 使用WHERE子句做条件过滤,删除部分行
- 可通过起别名进行伪装
TCL 事务控制
- 事务:英文单词Transaction,是由一个或多个SQL语句所组成的操作集合,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。来保证数据的一致性。
- SQL语句默认每个语句独立。
- 语法:
- 从开启事务到结束事物之间的SQL语句是一个事务
- 事务开启:
- 一旦执行DML操作,就自动开启。
- 通过BEGIN 或 START TRANSACTION 开启事务。
- 事务结束:
- Orcal自动结束事物,SQL使用手动结束(需要提前使用将自动结束改为手动结束:SET autocommit=0;)
- 手动结束:
- COMMIT; 提交(确认)
- ROLLBACK; 回滚(取消)
- 事务一旦结束,就不能够再提交或者回滚
- 事务的特征
- 原子性(不可分割)
- 一致性(数据一致)
- 隔离性(互不干扰)
- 持久性(一旦提交,无法回滚)
DDL数据库管理
- 创建数据库:
- CREATE DATABASE 数据库名;
- CREATE DATABASE 数据库名; 判断数据库是否存在,如果存在则不创建,不存在则创建
- CREATE DATABASE 数据库名 CHARACTER SET 字符集 创建数据库并指定字符集
字符集:规定了字符在数据库中的存储格式,比如占多少空间,能支持哪些字符等等
- 查看数据库方式:
- SHOW DATABASES 查看所有的数据库
- MySQL 8.0并初始化数据库之后,默认会创建4个系统数据库:information_schema、performance_schema、sys、mysql。这几个数据库保存MySQL正常运行的基本信息,不要轻易修改这几个数据库的信息。
- SHOW CREATE DATABASE 数据库名 查看某个数据库的定义信息
- SHOW DATABASES 查看所有的数据库
- 修改数据库:
- ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集; 修改数据库字符集
- 删除数据库
- DROP DATABASE 数据库名 删除后无法恢复
- 切换数据库
- SELECT DATABASE(); 查看正在使用的数据库
- USE 数据库名 使用/切换数据库
DDL数据表的管理
- 数据类型:数值类型、日期和时间类型、字符串类型。
- Varchar和char 的区别
- Varchar:可变长度的字符串 varchar(5) 如果实际输入一个1符 存储占用1个字符
- Char:固定长度的字符串, char(5) 如果实际输入一个1符 存储占用5个字符
- BLOB:二进制大对象,存储数据量大
- TEXE:大文本类型
- 创建表:
- CREATE TABLE 表名(列名1 数据类型 ,列名2 数据类型 ,…)
- DESCRIBE 表名:描述表的信息,包括数据类型,约束条件等。
- 查看表结构:
- SHOW TABLES; 查看某个数据库中的所有表
- DESC 表名; 查看表结构
- SHOW CREATE TABLE 表名 查看创建表的SQL语句
- 复制表
- CREATE TABLE 表名 子查询
- 缺陷:新建表没有子查询表的约束
- CREATE TABLE 新表名 LIKE 旧表名; 仅复制表结构
- CREATE TABLE 新表名 查询语句 同时复制表结构和数据
- CREATE TABLE 表名 子查询
- 删除表
- DROP TABLE 表名 直接删除表
- DROP TABLE IF EXISTS 表名 判断表是否存在并删除表
- 修改表结构
- ALTER TABLE 表名 ADD 列名 类型 为已经存在的表添加新列
- ALTER TABLE 表名 MODIFY 列名 新的类型 修改已经存在的列的数据类型
- ALTER TABLE 表名 CHANGE 旧列名 新列名 类型 修改列名
- ALTER TABLE 表名 DROP 列名; 删除列
- RENAME TABLE 表名 TO 新表名 修改表名
- ALTER TABLE 表名 character set 字符集 修改字符集
- 截断表:截断表的作用是把原来的表摧毁,重新创建一个结构和原来一模一样的新表
- TRUNCATE TABLE table;
- TRUNCATE和DELETE区别:
- TRUNCATE是DDL命令,使用ROLLBACK不可以回滚。而DELETE是DML命令,使用ROLLBACK可以回滚
- DELETE可以通过指定删除条件实现部分删除,TRUNCATE不能指定条件。
DDL约束管理
概念:定义在列上的一种强制规则。用来保证数据库中数据的正确性、有效性和完整性
- 主键约束:
- 概念:主键(PRIMARY KEY):用来唯一标识表中的一条记录,用来限制重复数据
- 规则:
- 每个表都要有主键,且一个表最多只能有一个主键。
- 2、主键所定义的列,不允许插入NULL值。
- 3、主键是给开发人员使用的,不是给最终客户使用的
- 往往是第一列
-
- 创建主键约束
CREATE TABLE 表名(
列名1 数据类型 PRIMARY KEY ,
列名2 数据类型 ,
…
);
-
- 追加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY (column)
-
- 删除主键约束
ALTER TABLE 表名 DROP PRIMARY KEY
- 非空约束:限定某列的所有行数据不能为NULL值
- 创建:
CREATE TABLE 表名(
列名1 数据类型 ,
列名2 数据类型 NOT NULL,
…);
- 修改非空约束:ALTER TABLE 表名 MODIFY 列名 数据类型 NOT NULL/NULL;
- 删除非空约束:ALTER TABLE 表名 MODIFY 列名 数据类型 NULL
- 唯一约束:唯一标识表中的一条记录的,在这张表中这个列的值不能重复
- 与主键约束的不同:
- 一个表可以有多个唯一约束,但主键约束最多只能有一个。
- 主键约束所定义的列,不允许有NULL值,而唯一约束所定义的列,允许有NULL值
- 创建:
- 与主键约束的不同:
CREATE TABLE 表名(
列名1 数据类型 UNIQUE,
列名2 数据类型 ,
…
);
或者ALTER TABLE 表名 ADD UNIQUE(列名);
-
- 删除唯一约束:ALTER TABLE 表名 DROP INDEX 列名
- 外键约束:限制外键所定义的列的值必须来源于引用列的值。
- 创建:(外键约束需要写在所有列的最后)
CREATE TABLE 表名(
列名1 数据类型 ,
列名2 数据类型 ,
… ,
FOREIGN KEY(列名) REFERENCES 引用列所在的表名(列名));
-
- 追加外键约束:ALTER TABLE 表名 ADD CONSTRAINT FOREIGN KEY(列名) REFERENCES 引用表(引用列);
- 注意:
- 严格参考主键列
- 外键列允许空值
- 外键约束的引用列,必须有主键约束或者唯一约束
- 检查性约束:确保某个列的所有行数据都必须满足的一个条件表达式
- 创建:CREATE TABLE 表名(
列名1 数据类型 CHECK (条件表达式),
列名2 数据类型 ,...);
-
- 删除:ALTER TABLE 表名 DROP CONSTRAINT 约束名