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代表不去重

原文地址:https://www.cnblogs.com/akiz/p/11178121.html