• DQL语言基础(二)


    DQL语言的学习

    进阶1:基础查询

    语法:

    	SELECT 要查询的东西
    	【FROM 表名】;
    

    特点:

    类似于Java中 :System.out.println(要打印的东西);
    
        ①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
        ②要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
    

    示例
    1、查询单个字段

    select 字段名 from 表名;
    

    2、查询多个字段

    select 字段名,字段名 from 表名;
    

    3、查询所有字段

    select * from 表名
    

    4、查询常量

    select 常量值;
    注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
    

    5、查询函数

    select 函数名(实参列表);
    

    6、查询表达式

    select 100/1234;
    

    7、起别名

    	①as
    	②空格
    

    8、去重

    select distinct 字段名 from 表名;
    

    9、+

    功能:做加法运算
    select 数值+数值; 直接运算
    select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
    select null+值;结果都为null
    

    10、【补充】concat函数

    功能:拼接字符
    select concat(字符1,字符2,字符3,...);
    

    11、【补充】ifnull函数

    功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
    select ifnull(commission_pct,0) from employees;
    

    12、【补充】isnull函数

    功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
    

    进阶2:条件查询

    ​ 条件查询:根据条件过滤原始表的数据,查询到想要的数据
    ​ 语法:

    	select 要查询的字段|表达式|常量值|函数
    	from 表
    	where 条件 ;
    

    ​ 分类:

    一、条件表达式
    	示例:salary>10000
    	条件运算符:
    	> < >= <= = != <>
    
    二、逻辑表达式
    	示例:salary>10000 && salary<20000
    
        逻辑运算符:
    
            and(&&):两个条件如果同时成立,结果为true,否则为false
            or(||):两个条件只要有一个成立,结果为true,否则为false
            not(!):如果条件成立,则not后为false,否则为true
    
    三、模糊查询
    	示例:last_name like 'a%'
    	
    四、区间查询
    	between 值1 and 值2
    	in  
    

    is null,<=>,==的区别

    普通类型的数值 null值 可读性
    is null ×
    <=> ×
    == × ×

    进阶3:排序查询

    语法:

    select
    	要查询的东西
    from
    	表
    where 
    	条件
    
    order by 排序的字段|表达式|函数|别名 【asc|desc】
    

    特点

    1、asc :升序,如果不写默认升序
       desc:降序
    
    2、排序列表 支持 单个字段、多个字段、函数、表达式、别名
    
    3、order by的位置一般放在查询语句的最后(除limit语句之外)
    
    

    进阶4:常见函数

    ​ 一、单行函数

    1、字符函数
        concat拼接
        substr截取子串
        upper转换成大写
        lower转换成小写
        trim去前后指定的空格和字符
        ltrim去左边空格
        rtrim去右边空格
        replace替换
        lpad左填充
        rpad右填充
        instr返回子串第一次出现的索引
        length 获取字节个数
    
    2、数学函数
    	round 四舍五入
    	rand 随机数
    	floor向下取整
    	ceil向上取整
    	mod取余
    	truncate截断
    
    3、日期函数
        now当前系统日期+时间
        curdate当前系统日期
        curtime当前系统时间
        str_to_date 将字符转换成日期
        date_format将日期转换成字符
    
    4、流程控制函数
        if 处理双分支
        case语句 处理多分支
            情况1:处理等值判断
            情况2:处理条件判断
    
    5、其他函数
        version版本
        database当前库
        user当前连接用户
    

    特点

    	
    

    二、分组函数

    	sum 求和
    	max 最大值
    	min 最小值
    	avg 平均值
    	count 计数
    
    	特点:
            ①语法
                select max(字段) from 表名;
    
            ②支持的类型
                sum和avg一般用于处理数值型
                max、min、count可以处理任何数据类型
    
            ③以上分组函数都忽略null
            ④都可以搭配distinct使用,实现去重的统计
                select sum(distinct 字段) from 表;
            ⑤count函数
                count(字段):统计该字段非空值的个数
                count(*):统计结果集的行数
            案例:查询每个部门的员工个数
                1 xx    10
                2 dd    20
                3 mm    20
                4 aa    40
                5 hh    40
    
                count(1):统计结果集的行数
    
            效率上:
                MyISAM存储引擎,count(*)最高
                InnoDB存储引擎,count(*)和count(1)效率>count(字段)
    
            ⑥ 和分组函数一同查询的字段,要求是group by后出现的字段
    

    进阶5:分组查询

    ​ 语法:

    select 查询的字段,分组函数
    from 表
    group by 分组的字段	
    

    特点:

    1、可以按单个字段分组
    2、和分组函数一同查询的字段最好是分组后的字段
    3、分组筛选
    			针对的表		位置					关键字
    分组前筛选:	原始表			 group by的前面		where
    分组后筛选:	分组后的结果集	  group by的后面		 having
    
    4、可以按多个字段分组,字段之间用逗号隔开
    5、可以支持排序
    6、having后可以支持别名
    

    进阶6:多表连接查询

    笛卡尔乘积:如果连接条件省略或无效则会出现
    解决办法:添加上连接条件
    

    分类

    按年代分类:
    	sql92:
    		支持内连接
                等值
                非等值
                自连接
            也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
    		
    	sql99【推荐使用】
    		内连接
    			等值
    			非等值
    			自连接
    		外连接
    			左外
    			右外
    			全外(ysql不支持)
    		交叉连接
    

    一、SQL92语法

    支持:内连接
    特点:
    	① 一般为表起别名
    	②多表的顺序可以调换
    	③n表连接至少需要n-1个连接条件
    	④等值连接的结果是多表的交集部分
    
    1、等值连接
    语法:
    	select 查询列表
    	from 表1 别名,表2 别名
    	where 表1.key=表2.key
    	【and 筛选条件】
    	【group by 分组字段】
    	【having 分组后的筛选】
    	【order by 排序字段】
    
    2、非等值连接
        语法:
            select 查询列表
            from 表1 别名,表2 别名
            where 非等值的连接条件
            【and 筛选条件】
            【group by 分组字段】
            【having 分组后的筛选】
            【order by 排序字段】
    	
    3、自连接
        语法:
            select 查询列表
            from 表 别名1,表 别名2
            where 等值的连接条件
            【and 筛选条件】
            【group by 分组字段】
            【having 分组后的筛选】
            【order by 排序字段】
    

    二、sql99语法:通过join关键字实现连接

    含义:1999年推出的sql语法
    
    支持:
        等值连接、非等值连接 (内连接)
        外连接
        交叉连接
        
    特点:
        ①表的顺序可以调换
        ②内连接的结果=多表的交集
        ③n表连接至少需要n-1个连接条件
        
    1、内连接
        语法:
        select 查询列表
        from 表1 别名
        【inner】 join 表2 别名 on 连接条件
        where 筛选条件
        group by 分组列表
        having 分组后的筛选
        order by 排序列表
        limit 子句;
    
    
    2、外连接
        语法:
            select 查询列表
            from 表1 别名
            left|right|full【outer】 join 表2 别名 on 连接条件
            where 筛选条件
            group by 分组列表
            having 分组后的筛选
            order by 排序列表
            limit 子句;
    	特点:
            ①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
            ②left join 左边的就是主表,right join 右边的就是主表
              full join 两边都是主表
            ③一般用于查询除了交集部分的剩余的不匹配的行
    
    3、交叉连接
    
        语法:
            select 查询列表
            from 表1 别名
            cross join 表2 别名;
    
        特点:
       		类似于笛卡尔乘积
    
    

    三、例子

    自连接

    案例:查询员工名和直接上级的名称

    sql99

    SELECT e.last_name,m.last_name
    FROM employees e
    JOIN employees m ON e.`manager_id`=m.`employee_id`;
    

    sql92

    SELECT e.last_name,m.last_name
    FROM employees e,employees m 
    WHERE e.`manager_id`=m.`employee_id`;
    

    进阶7:子查询

    含义:

    一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询
    在外面的查询 语句,称为主查询或外查询
    

    分类

    1、按出现位置
        select后面:
                仅仅支持标量子查询
        from后面:
                表子查询
        where或having后面:
                标量子查询
                列子查询
                行子查询
        exists后面:
                标量子查询
                列子查询
                行子查询
                表子查询
    
    2、按结果集的行列
        标量子查询(单行子查询):结果集为一行一列
        列子查询(多行子查询):结果集为多行一列
        行子查询:结果集为多行多列
        表子查询:结果集为多行多列
    

    特点:

    1、子查询都放在小括号内
    2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
    3、子查询优先于主查询执行,主查询使用了子查询的执行结果
    4、子查询根据查询结果的行数不同分为以下两类:
    ① 单行子查询
    	结果集只有一行
    	一般搭配单行操作符使用:> < = <> >= <= 
    	非法使用子查询的情况:
            a、子查询的结果为一组值
            b、子查询的结果为空
    	
    ② 多行子查询
    	结果集有多行
    	一般搭配多行操作符使用:any、all、in、not in
            in: 属于子查询结果中的任意一个就行
            any和all往往可以用其他查询代替
    

    示例

    where或having后面
    1、标量子查询
    案例:查询最低工资的员工姓名和工资
    ①最低工资
    	select min(salary) from employees
    
    ②查询员工的姓名和工资,要求工资=①
        select last_name,salary
        from employees
        where salary=(
            select min(salary) from employees
        );
    
    2、列子查询
    案例:查询所有是领导的员工姓名
    ①查询所有员工的 manager_id
        select manager_id
        from employees
    
    ②查询姓名,employee_id属于①列表的一个
        select last_name
        from employees
        where employee_id in(
            select manager_id
            from employees
        );
    

    进阶8:分页查询

    应用场景:

    实际的web项目中需要根据用户的需求提交对应的分页查询的sql语句
    

    语法:

    select 字段|表达式,...
    from 表
    【where 条件】
    【group by 分组字段】
    【having 条件】
    【order by 排序的字段】
    limit 【起始的条目索引,】条目数;
    
    注意:
        offset代表的是起始的条目索引,默认从0卡死
        size代表的是显示的条目数
    

    特点:

    1.起始条目索引从0开始
    
    2.limit子句放在查询语句的最后
    
    3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
    假如:
        每页显示条目数sizePerPage
        要显示的页数 page
    

    进阶9:联合查询

    引入:
    union 联合、合并

    语法:

    select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
    select 字段|常量|表达式|函数 【from 表】 【where 条件】 union 【all】
    select 字段|常量|表达式|函数 【from 表】 【where 条件】 union  【all】
    .....
    select 字段|常量|表达式|函数 【from 表】 【where 条件】
    

    特点:

    1、多条查询语句的查询的列数必须是一致的
    2、多条查询语句的查询的列的类型几乎相同
    3、union代表去重,union all代表不去重
    

  • 相关阅读:
    【LGR-070】洛谷 3 月月赛-官方题解
    洛谷P1034 矩形覆盖
    <C和指针---读书笔记9>
    <C和指针---读书笔记8>
    <C和指针---读书笔记7>
    <C和指针---读书笔记6>
    <C和指针---读书笔记1>
    <C和指针---读书笔记2>
    <C和指针---读书笔记5>
    <C和指针---读书笔记4>
  • 原文地址:https://www.cnblogs.com/akiz/p/11178121.html
Copyright © 2020-2023  润新知