DQL数据查询语言
作者:互联网
- 普通查询
use 表名; #先打开数据表 select 查询列表 from 表名;
-
- 查询列表可以是:表中字段、常量值、表达式、函数;查询结果是虚拟表格,不能保存
- 查询常量值、表达式、函数,查询后的字段名(列名)就是其本身,字符型和日期型的常量值必须用单引号,数值型不需要
- 别名:区分重名的字段名;如果别名有特殊字符建议加上双引号或单引号
-- 方式1:使用as select 表达式 as 列名, 表达式 as 列名 from 表名; -- 方式2:使用空格 select 表达式 列名, 表达式 列名 from 表名;
- 去重
#查询a不重复或者b不重复的并集 select distinct 查询字段 from 表名 select distinct a,b from table;
- MySQL中的+
- select 100+90; 两个操作数均为数值型,做加法运算
- select '123'+90;有一方为字符型,则试图将字符型数值转换成数值型,若转换成成功则进行加法运算;若失败,则将字符型数值转为0
- select null+90:如果其中一方为空值,则返回null
- 连接查询(连接的字段不能为null值,否则将返回null)
-- 返回字段值为空的行 select ifnull (字段名,为空的返回值) as 别名 -- 可以将属性123 连接成完整的字符串 select concat ('属性1','属性2','属性3') as 别名;
- 条件查询
select 查询列表 from 表名 where 筛选条件;
- 按条件表达式筛选:> < = != >= <= <=>(安全等于,既可以判断null值,也可判断普通数值) <>(不等于的意思)
- 按逻辑表达式筛选,用于连接条件表达式:&& || ! and or not
- 模糊查询
- like: 一般和通配符搭配使用,可以判断字符型或数值型
- %:任意多个字符,包含0个字符
- _:任意单个字符
- \: 转移字符,忽略当前位
- 连接条件
- (not)between and :在什么之间
- in:判断某字段的值是否属于in列表中的某一项,提高语句简洁度,列表值类型必须统一或兼容
- is (not) null :当=,<>不能用于判断值时,用is not null可以判断null值
- 排序查询
-- order by 一般放在查询语句最后,limit语句除外 select 查询列表 from 表 where 筛选条件 order by 排序列表(支持多个排序,放在前面的就先排) asc/desc;(升序或降序,默认升序)
- 常见函数
- 单行函数 concat(连接函数)、length(长度函数)、ifnull(判断函数)等
- 字符函数
-- 获取参数值的字节个数 select length('张haha'); 值为7,一个汉字占三个字节 -- 拼接字符串 select concat(a,'+',b); 值为a+b -- 大小写upper,lower select upper ('a'); 值为A -- 截取字符串,索引从1开始,截取从指定索引字符长度的字符substr=substring select substr('lisihid',2); 值为isihid select substr('lisihid',2,3); 值为isi -- 返回子串第一次出现的索引,如果找不到返回0 select instr("adribaihroqwrino","ri"); 值为3 -- 去掉前后重复的空格或者字符 select trim('');去空格 select trim('a' from 'aaazhanng aa baoyu aaaa');返回zhanng aa baoyu -- 用指定的字符实现左填充指定长度,超出的话就截断,lpad,rpad select lpad('asb',10,'*'); 值为*******asb -- replace替换函数 select replace('adbudf','bu','df'); --值为addfdf
- 数学函数
-- 四舍五入函数,绝对值四舍五入 select round(-1.7880,2) # 值为1.79,保留两位小数 -- 向上取整,返回>=该参数的最小整数 ceil -- 向下取整,返回<=该参数的最大整数 floor -- 截断, truncate -- 取余,mod(a,b) 值为a-a/b*b -- rand(),取随机数,返回0-1之间的值
- 日期函数
- 返回当前系统日期+时间, now()
- 返回当前系统日期,不包含时间, curdate()
- 返回当前系统时间,不包含日期, curtime()
- 获取指定的部分,年月日,小时,分钟 year,month,monthname(以英文形式返回月份),date,hour,minute,second year(now())
- str_to_date('9-19-1990','%m-%d-%Y') 将日期格式的字符解析转换数据库指定的格式,输出为1990-09-19 date_format('2019/2/27','%Y年%m月%d日') 将日期转换成字符,输出为2019年2月27日
- 其他函数
- version() 数据库服务器版本
- database() 数据库
- user() 数据库用户
- password('加密字符');
- MD5('加密字符');流程控制函数
- 字符函数
- 分组函数(组函数、统计函数)
- 功能:用作统计使用,又称为聚合函数或统计函数或组函数
- 分类:求和sum,平均值avg,最大值max,最小值min,计算个数count,datediff(exp1,exp2)求相差天数
- 特点
- 参数支持类型,sum,avg一般支持数值型,其他类型不报错但不建议;
- 其他分组函数类型都支持,count只计算不为null的字段
- 所有分组函数都忽略null值
- 可以和distinct搭配起到去重的效果
- 和分组函数一同查询的字段要求是group by 后的字段
- MYISAM存储引擎下 count( * ) 效率高; INNODB存储引擎下,count(*) 和 count(常量值)效率差不多,比count(字段)要高一些
- 单行函数 concat(连接函数)、length(长度函数)、ifnull(判断函数)等
- 分组查询
-- 查询列表要求是分组函数和group by 后出现的字段 select 分组函数, 列(要求出现在group by的后面) from 表 【where 表里可以执行的筛选条件】 group by 分组的列表 【order by 子句】 having 分组后的筛选条件
- 分组查询中的筛选条件分为两类,能在分组前筛选的就放在前面where;后面放在having中
- 可以按表达式或函数分组
- 支持多个字段分组,多个字段之间用都逗号隔开,没有先后区别
- 可以添加排序,放在整个查询最后多表关系
- 连接查询:左外 left【outer】,左边是主表 右外:right【outer】,右边是主表 全外:full【outer】,查询结果=内连接+表1有表2没有+表2有表1没有
select 查询列表 from 表1 别名【连接类型】 join 表2 别名 on 连接条件 【where 筛选条件】 【group by 排序列表】
- 子查询:出现在其他语句内部的select语句,内查询;内部嵌套其他的select语句的查询,为外查询或主查询
- 分类:
- 按子查询出现的位置:select后面,只支持标量子查询;from后面,一般支持表子查询;where和having后面;exists后面,相关子查询,一般支持表子查询
- 按功能,子查询结果集的分类: 标量子查询,结果集只有一行一列;列子查询,结果集只有一列但多行;行子查询,结果集有一行多列;表子查询,结果集多行多列
- where或having后面:子查询放在小括号内;放在条件右侧;子查询的执行优先于主查询,主查询的条件用到子查询的结果;行子查询要求查询的字段有同样的筛选条件规律
- from后面:将子查询结果充当一张表,要求必须起别名
- exists后面,相关子查询:判断子查询结果有没有值,返回0或1
- 分类:
- 分页查询
- limit语句放在查询语句最后
- 设置页码page和条目数size
select 查询列表 from 表 【join type join表2 on 连接条件 where 筛选条件 group by 分组字段 having 分组后的筛选 order by排序后的字段】 --offset要显示条目的起始索引,从0开始,size表示要显示的条目个数,如果从第一条开始,可省略offset limit offset,size; -- limit (page-1)*size,size
- 联合查询:union 关键字联合查询语句,查询的结果来自多个表,多个表之间没有关联,但查询的信息一致;查询的每一列类型和顺序最好一致;使用union关键字默认去重,使用union all 不去重
- 常见约束:用于限制表中的数据,保证表中的数据准确可靠,可以对一个字段增加多个约束,用空格隔开
- NOT NULL,保证该字段值不能为空
- DEFAULT 默认约束,保证该字段有默认值
- PRIMARY KEY,主键,保证该字段值具有唯一性,并且为非空值
- UNIQUE,唯一,保证该字段值具有唯一性,可以为空
类型 保证唯一性 是否允许为空 一个表中是否允许多个 是否允许组合,多个列组合成一个键 主键 是 不允许 不允许 允许 唯一 是 允许 允许 允许 - CHECK, MySQL不支持,检查约束 check(a='1'or a='2')
- FOREIGN KEY,限制两个表的关系,保证该字段的值必须来自于主表的关联列的值,从表添加外键约束,用于引用主表的关联列值
- 要求在从表设置外键关系
- 表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key (一般是主键或唯一键)
- 插入数据是先插入主表,在插入从表
- 删除数据是先删除从表,再删除主表
-- 级联删除:删除主表的内容对应的从表全部删除 ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY (从表约束列) REFERENCES 主表(约束列) ON DELETE CASCADE; -- 级联置空:删除主表的内容对应的从表内容为空 ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY (从表约束列) REFERENCES 主表(约束列) ON DELETE SET NULL;
- 约束类型
- 列级约束:六大约束语法上都支持,但外键约束没有效果;直接在字段名和类型后面追加约束类型,只支持默认,非空,主键,唯一,其他不生效
- 表级约束:除了not null和default,其他都支持;直接在各个字段的最后加,【constraint 约束名】 约束类型(字段名)
- 创建表时添加约束
-- 列表约束对外键没有效果,只能在表级约束添加外键 create table 表( 字段名1 字段类型 列表约束, 字段名n 字段类型 列表约束, 表级约束 ) -- 另一种方式 create index 索引名 on 表名(列名);
- 修改表添加约束
-- 列级约束【位置:列的后面,支持的约束类型不包括外键,不能起约束名】 alter table 表名 modify column 字段名 字段类型 新约束; -- 表级约束【位置:所有列的下面,默认和非空不支持,其他支持,可以起别名,但主键起别名没有效果】 alter table 表名 add【constraint 约束名】 约束类型(字段名) 【外键的引用】;
- 修改表时删除约束
-- 删除非空 alter table 表名 modify column 字段名 字段类型 null; -- 删除默认 alter table 表名 modify column 字段名 字段类型; -- 删除主键 alter table 表名 drop primary key; -- 删除唯一 alter table 表名 drop index 约束名; -- 删除外键 alter table 表名 drop foreign key 约束的外键名
- 标识列:自增长列,可以不用手动插入值,系统提供默认的序列值
- 标识列必须和一个key搭配,但不一定是主键;
- 一个表只能有一个标识列;
- 标识列的类型只能是数值型;
- 标识列可以通过set auto_increment_increment=增长步;也可以通过手动插入值设置增长起始值;
- 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全不执行
- 存储引擎:在MySQL中的数据用各种不同的技术存储在文件或内存中;通过show engines来查看;在MySQL中用的最多的存储引擎有innodb,myisam,memory等,其中innodb支持事务,而myiasm/memory等不支持事务。
- ACID属性
- 原子性(automicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性(consistency):事务必须使数据库从一个一致性状态到另一个一致性状态
- 隔离性(isolation):一个事务的执行不能被其他事务干扰,一个事务的内部操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
- 持久性(durability):一个事务一旦被提交,他对数据库中数据的改变是永久性的,接下里的其他操作和数据库故障不应对其有任何影响
-
默认为隐式(自动)事务:事务没有明显的开启和结束的标记,需要设置自动提交autocommit功能为禁用set autocommit=0;转为显示事务
-- 开启事务 set autocommit=0; start transaction;-- 可选的 --编写事务中的SQL语句支持的是DML语句(select/delete/insert) 语句1; 语句n; -- 结束事务 commit;-- 提交事务 rollback; /* 回滚该事务,就是相当于如果没提交该事务,他就保存的是开始该事物的原始状态,常常与savepoint搭配,savepoint是设置节点或回滚点,该节点后的事务与rollback搭配相当于未提交的事务 */ rollback to 回滚点名;-- 回到回滚点
- 事务易产生的问题
- 脏读:对于两个事务t1,t2,t2更新了数据但没有提交,t1读取了这个数据,若t2回滚,t1读取的内容就是临时且无效的
- 不可重复读:对于两个事务t1,t2,t1读取了一个字段,然后t2更新了该字段,t1再次读取同一个字段值就不同了
- 幻读:对于两个事务t1,t2,t1从一个表中读取了一个字段,然后t2在该表中插入了一些新的行,之后如果t1再次读取同一个字段就会多几行
- 事务隔离级别
- read uncommitted:允许事务读取违背其他事务提交的变更。脏读、不可重复读和幻读的问题都会出现
- read committed:只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复读和幻读问题仍然会出现
- repeatable read:允许读取已经被其他事务提交的变更,可以避免脏读,不可重复读,但幻读问题依然会出现
- serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但性能十分低下
- Oracle支持2种事务隔离级别:read committed和serializable,默认事务隔离级别:read committed
- MySQL支持4种事务隔离级别,默认事务隔离级别为repeatable read
- 每启动一个MySQL程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation 表示当前的事务隔离级别
- 查看当前数据库事务隔离级别:select @@tx_isolation;
- 设置当前MySQL连接的隔离级别:set transaction isolation level 级别;
- 设置数据库系统的全局隔离级别:set global transaction isolation level 级别
- 视图
- 是一种虚拟表,和普通表一样使用
- 方便重用SQL语句;简化复杂的SQL操作,不必知道它的查询细节;保护数据,提高安全性
#创建视图 create view 视图名【字段列表】 as 查询语句; #修改视图 #方式一 create or replace view 视图名 as 查询语句; #方式二 alter view 视图名 as 查询语句; #删除视图 drop view 视图名,视图名...; #查看视图 desc 视图名; show create view 视图名;
- 不允许更新的视图
- 包含以下关键字的SQL语句: 分组函数、distinct、group by、having、union或者union all
- 常量视图
- select 中包含子查询
- join语句,能修改但不能插入
- from 一个不能更新的视图,即select查询的是一个不能更新的视图
- where子句的子查询引用了from子句中的表
- 存储过程:一组预先编译好的SQL语句的集合,批处理语句,提高代码的重用性,简化操作,减少了编译次数并且减少了与数据库服务器的连接次数,提高效率
-- 1. 创建 create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的SQL语句) end 结束标记 -- 或 delimiter 结束标记 create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的SQL语句) end 结束标记 -- 2.调用 call 存储过程名(实参列表)结束标记 -- 3. 删除存储过程 drop procedure 存储过程名 //一次只能删除一个,不能批量删除 -- 4. 查看存储过程信息 show create procedure 存储过程名
- 不能修改存储过程中的SQL语句,可以有0个返回,也可有多个返回,适合做批量插入,批量更新
- 参数列表包含三部分 参数模式 参数名 参数类型 参数模式:默认参数模式为in
- IN:该参数可以作为输入,该参数需要调用方传入值
- OUT:该参数可以作为输入,该参数可以作为返回值
- INOUT:既可作输入,也可作输出,该参数既需要调用方传入值,也可以作为返回,先要定义输入的用户变量值
- 如果存储过程中仅仅只有一句话,begin end 可以省略
- 存储过程体中的每条SQL语句结尾必须加分号,存储过程体的结尾可以使用delimiter重新设置,使用时加上结束标记即可结束使用 delimiter 结束标记 //在客户命令端使用有效
- 函数:一组预先编译好的SQL语句集合,理解成批处理语句,好处与存储过程一样,有且仅有一个返回,适合做处理数据后返回一个结果
-- 1. 创建 create function 函数名(参数列表)returns 返回类型 begin 函数体 return 值; end -- 2. 调用 select 函数名(参数列表) -- 3. 查看 show create function 函数名; -- 4. 删除 drop function 函数名;
- 参数列表包含两部分:参数名 参数类型
- 函数体:肯定会有return语句,如果没有会报错
- 如果return语句没有放在函数的最后也不会报错,但不建议
- 当函数体只有一句话,可以省略begin end
- 使用delimiter 语句设置结束标记
- 触发器trigger: 通过事件触发与其相关的存储过程
- 监视地点 table
- 监视事件 insert/update/delete
- 时间 before/after
- 事件触发 insert/update/delete
-- 自定义结束符号 delimiter $ -- 创建 create trigger 触发器名 -- 触发时间 before/after -- 监视事件 (insert/update/delete) ... -- 监视地点 on 表名 -- 行触发器 for each row -- 触发事件 begin SQL语句,触发何种事件 end $
标签:语句,事务,函数,--,查询,DQL,查询语言,数据,select 来源: https://www.cnblogs.com/forever-fate/p/14662769.html