DQL语言的学习

基础查询

语法:
SELECT 要查询的东西【FROM 表名】;
特点:
* 通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
* 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数

起别名

* SELECT last_name AS 姓 FROM info;
* SELECT last_name 姓 FROM info;
便于理解
查询字段第一名情况,使用别名可以区分开来

字符串连接

SELECT CONCAT(last_name,first_name) AS 姓名 FROM info;
+会把字符串转数字,不成功则为0,然后相加
若其中一方为NULL,则结果为NULL,可以使用IFNULL(name,default),若name为NULL,则返回default

去重

SELECT DISTINCT last_name 姓 FROM info;

条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select 
    要查询的字段|表达式(计算+-*/%等)|常量值|函数(输出函数返回值)
from 
    表
where 
    条件 ;

    关键字名作字段使用``包装

    分类:
    一、条件表达式
        示例:salary>10000
        条件运算符:
        > < >= <= = != <>
        **<=> 安全等于,可以用在NULL,上面的不行**
    二、逻辑表达式
        示例:salary>10000 && salary<20000

        逻辑运算符:
            and(&&):两个条件如果同时成立,结果为true,否则为false
            or(||):两个条件只要有一个成立,结果为true,否则为false
            not(!):如果条件成立,则not后为false,否则为true
    三、模糊查询
        like:
            where last_name like 'a%' ESCAPE '#';  字符形要加引号,%表示任意多个字符,_表示一个,默认是\转义,可以使用ESCAPE指定
        between and:
            where a BETWEEN 20 AND 30; 包含两端,不可交换位置
        in:
            where last_name IN('','',...); 不支持通配符
        is null:
            where lastt_name IS [NOT] NULL;

排序查询

语法:
select
    要查询的东西
from
    表
where 
    条件
order by 排序的字段|表达式|函数|别名 【asc|desc】,...
* 可以用,进行多个条件复合

分组查询

语法:
select 分组函数,查询的字段
from 表
【where】
group by 查询的字段
【order by】
【having】

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

多表连接查询

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

一、传统模式下的连接 :等值连接、非等值连接
1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能,用了原表名就不能用了

二、sql99语法:通过join关键字实现连接
含义:1999年推出的sql语法
支持:
等值连接、非等值连接 (内连接)
外连接
左外
右外
全外
交叉连接

语法:
select 字段,...
from 表1
【inner|left outer|right outer|full outer|cross】
join 表2 别名
on 连接条件
【inner|left outer|right outer|full outer|cross】
join 表3 别名
on  连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】

outer和inner可以省略

1. 内连接,找不到对应的,就不显示
2. 外连接,查询结果为主表中的所有记录。用于一个表有,另外一个表找不到对应的情况。主表中每行都显示出来,若找不到匹配的值用null。等于内连接结果+没匹配到的行和null
3. 左右连接,左连接表示左边是主表,右连接表示右边是主表
4. 全外连接,等于内连结果+主表没匹配到的行和null+从表没匹配到的行和null
5. 交叉连接,等于笛卡尔乘积

三、自连接
同一个表有多个意义,如员工表也可以表示为领导表,但是又不能用一个表就完成,需要自连接自己

案例:查询员工名和直接上级的名称
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`;

子查询

含义:

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

特点:

1、子查询都放在小括号内,一般放在条件的右侧
2、子查询优先于主查询执行,主查询使用了子查询的执行结果
    非法使用子查询的情况:
        a、子查询的结果与对应的操作符不符
        b、子查询的结果为空    
3、子查询可以放在
    select后面 仅标量子查询
    from后面 支持表子查询,需要给查询一个表名
    where、having后面 标量、列、行子查询
    exists后面 表子查询,结果是1或0,表示子查询是否有结果集
4、子查询根据结果集不同分为以下几类:
    * 标量子查询
        结果集只有一行一列
        一般搭配单行操作符使用:> < = <> >= <= 
    * 列子查询
        结果集只有一列多行
        一般搭配多行操作符使用:any、all、in、not in
        in: 属于子查询结果中的任意一个就行
        any和all往往可以用其他查询代替    
    * 行子查询
        结果集有一行多列,或多行多列(较少)
        例 where (name,age) = (
            selece name,age from info;
        )
    * 表子查询
        结果集一般为多行多列

分页查询

应用场景:

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

语法:

select 字段|表达式,...
from 表
【where 条件】
【group by 分组字段】
【having 条件】
【order by 排序的字段】
limit 【offset】size;

特点:

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

联合查询

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