DQL数据查询语言

1. 普通查询

 

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 别名;
  • 排序查询
    -- order by 一般放在查询语句最后,limit语句除外
    select 查询列表
    fromwhere 筛选条件
    order by 排序列表(支持多个排序,放在前面的就先排) asc/desc;(升序或降序,默认升序) 

2. 条件查询

 

select 查询列表 from 表名 where 筛选条件;

 

  • 按条件表达式筛选:> < = != >= <=  <=>(安全等于,既可以判断null值,也可判断普通数值) <>(不等于的意思)
  • 按逻辑表达式筛选,用于连接条件表达式:&& || ! and or not
  • 模糊查询
    • like: 一般和通配符搭配使用,可以判断字符型或数值型
    • %:任意多个字符,包含0个字符
    •  _:任意单个字符
    • \: 转移字符,忽略当前位
    • 连接条件
      • (not)between and :在什么之间
      • in:判断某字段的值是否属于in列表中的某一项,提高语句简洁度,列表值类型必须统一或兼容 
      • is (not) null :当=,<>不能用于判断值时,用is not null可以判断null值

3.常见函数

  • 单行函数 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.78802) # 值为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(字段)要高一些

4. 分组查询 

 

-- 查询列表要求是分组函数和group by 后出现的字段
select 分组函数, 列(要求出现在group by的后面)
from 表
【where 表里可以执行的筛选条件】
group by 分组的列表
【order by 子句】            
 having 分组后的筛选条件

 

  • 分组查询中的筛选条件分为两类,能在分组前筛选的就放在前面where;后面放在having中
  • 可以按表达式或函数分组
  • 支持多个字段分组,多个字段之间用都逗号隔开,没有先后区别
  • 可以添加排序,放在整个查询最后多表关系

5. 连接查询

  • 左外 left【outer】,左边是主表 右外:right【outer】,右边是主表 全外:full【outer】,查询结果=内连接+表1有表2没有+表2有表1没有
    select 查询列表
      from 表1 别名【连接类型】
      join 表2 别名 
      on 连接条件
     【where 筛选条件】
     【group by 排序列表】

6. 子查询

  • 出现在其他语句内部的select语句,内查询内部嵌套其他的select语句的查询,为外查询或主查询
  • 分类:
    • 按子查询出现的位置:select后面,只支持标量子查询;from后面,一般支持表子查询;where和having后面;exists后面,相关子查询,一般支持表子查询
    • 按功能,子查询结果集的分类: 标量子查询,结果集只有一行一列;列子查询,结果集只有一列但多行;行子查询,结果集有一行多列;表子查询,结果集多行多列
  • where或having后面:子查询放在小括号放在条件右侧子查询的执行优先于主查询,主查询的条件用到子查询的结果行子查询要求查询的字段有同样的筛选条件规律
  • from后面:将子查询结果充当一张表,要求必须起别名
  • exists后面,相关子查询:判断子查询结果有没有值,返回0或1

7. 分页查询

  • 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 不去重

8. 常见约束

  • 用于限制表中的数据,保证表中的数据准确可靠,可以对一个字段增加多个约束,用空格隔开
    • NOT NULL,保证该字段值不能为空
    • DEFAULT 默认约束,保证该字段有默认值    
    • PRIMARY KEY,主键,保证该字段值具有唯一性,并且为非空值    
    • UNIQUE,唯一,保证该字段值具有唯一性,可以为空  
      类型 保证唯一性 是否允许为空 一个表中是否允许多个 是否允许组合,多个列组合成一个键
      主键 不允许 不允许 允许
      唯一 允许 允许 允许
    • CHECK, MySQL不支持,检查约束 check(a='1'or a='2')
    • FOREIGN KEY,限制两个表的关系,保证该字段的值必须来自于主表的关联列的值,从表添加外键约束,用于引用主表的关联列值
      • 要求在从表设置外键关系
      • 表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
      • 主表的关联列必须是一个key (一般是主键或唯一键)
      • 插入数据是先插入主表,在插入从表
      • 删除数据是先删除从表,再删除主表
        -- 级联删除:删除主表的内容对应的从表全部删除  
        ALTER TABLEADD CONSTRAINT 约束名 FOREIGN KEY (从表约束列) REFERENCES 主表(约束列) ON DELETE CASCADE;  
        -- 级联置空:删除主表的内容对应的从表内容为空  
        ALTER TABLEADD 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 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;
  • 修改表时删除约束
    -- 删除非空  
    alter table 表名 modify column 字段名 字段类型 null-- 删除默认  
    alter table 表名 modify column 字段名 字段类型;
    -- 删除主键  
    alter table 表名 drop primary key-- 删除唯一  
    alter table 表名 drop index 约束名;
    -- 删除外键  
    alter table 表名 drop foreign key 约束的外键名

 

9.标识列

 

  • 标识列:自增长列,可以不用手动插入值,系统提供默认的序列值
    • 标识列必须和一个key搭配,但不一定是主键;
    • 一个表只能有一个标识列;
    • 标识列的类型只能是数值型;
    • 标识列可以通过set auto_increment_increment=增长步也可以通过手动插入值设置增长起始值;

10.事务

  • 一个或一组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 级别

11. 视图

  • 是一种虚拟表,和普通表一样使用
  • 方便重用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子句中的表

12.存储过程

  • 一组预先编译好的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 结束标记 //在客户命令端使用有效

13. 函数

  • 一组预先编译好的SQL语句集合,理解成批处理语句,好处与存储过程一样,有且仅有一个返回,适合做处理数据后返回一个结果
    -- 1. 创建  
        create function 函数名(参数列表)returns 返回类型  
        begin  
            函数体  
        return 值;
        end  
    -- 2. 调用  
        select 函数名(参数列表)  
    -- 3. 查看  
        show create function 函数名;  
    -- 4. 删除  
        drop function 函数名;
  • 参数列表包含两部分:参数名 参数类型
  • 函数体:肯定会有return语句,如果没有会报错
  • 如果return语句没有放在函数的最后也不会报错,但不建议
  • 当函数体只有一句话,可以省略begin end
  • 使用delimiter 语句设置结束标记

14. 触发器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 $

       

posted @ 2021-04-15 15:42  forever_fate  阅读(88)  评论(0)    收藏  举报