其他分享
首页 > 其他分享> > 2022-08-16 day29 第一小组 王鸣赫

2022-08-16 day29 第一小组 王鸣赫

作者:互联网

目录

DQL数据库查询语言

该语言用来查询记录,不会修改数据库和表结构。

单表查询

基本查询

基本语法

查询所有列:

select * from 表名;
select * from student;

查询指定的列:

select id,`name`,age,gender from student;
select id,`name`,age from student;

补充:开发中,严禁使用select *

如果表中有完全重复的记录只显示一次,在查询的列之前加上distinct

select DISTINCT `name` from book;

别名

我们可以给列起【别名】,因为我们在查询过程中,列名很可能重复,可能名字不够简洁,或者列的名字不能满足我们的要求。

select id `编号`,`name` `姓名`,age `年龄`,gender `性别` from student;
select id as `编号`,`name` as `姓名`,age as `年龄`,gender as `性别` from student;

条件控制

按条件表达式筛选:

条件运算符:> < = != <> >= <=

按逻辑表达式筛选:
逻辑运算符:

逻辑运算符
  & 	||	!
  and	or	not
            该连接符主要用于连接表达式

作用:
1、&&和and:两个条件都为true,则结果为true,反之为false
2、||和or:只要有一个条件为true,则结果为true,反之为false
3、!和not:如果连接的条件本身为false,则结果为true,否则为false

模糊查询:

该类连接符分类:

like,between and,in,is null,<=>(安全等于)

like: 该连接符的应用场景大多用于查询某个字段中包含某个字符等,一般和通配符搭配使用
通配符
    % 任意多个字符,包含0个字符
    _ 任意单个字符

between and:

  他所查询的就是某个区间的值大多应用场景:也可以用条件表达式去完成

   特点: 1、可以提高语句简洁度
         2、两个区间的值的顺序不可颠倒
         3、包含临界值

in:判断某字段的值是否属于in列表中的某一项

注意特点:
①使用in提高了语句简洁度
②in列表的值必须是同一类型或兼容
③in字段不支持通配符

is null :用于判断字段值是否为null
   注意:  =或<>不能用于判断null值
         is null 或 is not null可以判断null值

安全等于 <=>:

与 isnull进行比较
isnull仅仅可以判断null值,可读性较高,建议使用
安全等于既可以判断null值,又可以判断普通的数值,可读性较低

排序

排序方式:

特点

1.asc代表的是升序,desc代表的是降序
    如果关键字不写,默认是升序
2.order by子句一般是放在查询语句的最后面,limit子句除外
3.order by子句中可以支持单个字段,多个字段,表达式,函数,别名
4.length函数表示返回字符串长度

常见函数

字符函数

concat: 拼接
substr: 截取子串
upper: 转换成大写
lower: 转换成小写
trim: 去前后指定的空格和字符
ltrim: 去左边空格
rtrim: 去右边空格
replace: 替换
lpad: 左填充
rpad: 右填充
instr: 返回子串第一次出现的索引
length: 获取字节个数    

数学函数
rand: 随机数
floor: 向下取整
    返回<=该参数的最大整数
ceil: 向上取整
    返回>=该参数的最小整数
mod: 取余
truncate: 截断
rand:获取随机数,取值范围0-1
日期函数
now: 当前系统日期+时间
curdate: 当前系统日期
curtime: 当前系统时间
str_to_date: 将字符转换成日期
date_format: 将日期转换成字符
datediff:两个日期相差天数
monthname:以英文形式返回月

分组函数

* count:计算个数
    * 一般选择非空的列:主键
    * count(*)
        表示统计表中所有行数,包括null
* max:计算最大值
* min:计算最小值
* sum:计算和
* avg:计算平均值        

分组查询

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

特点:

1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、可以按多个字段分组,字段之间用逗号隔开
4、可以支持排序
5、having后可以支持别名

注意:

  分组函数做筛选不能放在where后面

  能做分组前筛选的,尽量选择分组前筛选,以提高效率

  分组可以按单个字段也可以按多个字段并且可以搭配着排序使用

面试题:where和having的区别?

  1. where是写在group by之前的筛选,在分组前筛选;having是写在group by之后,分组后再筛选。
  2. where只能使用分组的列作为筛选条件;having既可以使用分组的列,也可以使用聚合函数列作为筛选条件。

分页查询

limit字句,用来限定查询结果的起始行,以及总行数。

limit是mysql独有的语法。

select * from student limit 4,3;
select * from student limit 4;

面试题:

  • MySQL:limit
  • Oracle:rownum
  • SqlServer:top

分析:

student表中有10条数据,如果每页显示4条,分几页?3页

3页怎么来的?(int)(Math.ceil(10 / 4));

显示第一页的数据:select * from student limit 0,4;

第二页:select * from student limit 4,4;

第三页:select * from student limit 8,4;

一个问题:我想要判断在student表中有没有叫"小红"的这个人?

1.0版本

select * from student where name = '小红';
select id from student where name = '小红';

2.0版本

select count(id) from student where name = '小红';

3.0版本

select id from student where name = '小红' limit 1;

注意:Limit子句永远是在整个的sql语句的最后。

多表查询

笛卡尔积

发生原因:

  1. 省略连接条件
  2. 连接条件无效
  3. 所有表中所有行互相连接

如何解决:
添加有效的连接条件

注意:开发中,一定要避免出现笛卡尔积。

多表连接的方式有四种:

SQL92语法

它只支持内连接中的等值连接,非等值连接,自连接

语法:

    SELECT 查询列表
    FROM 表名1 别名1 ,表名2 别名2 
    WHERE 连接条件 【等值连接,非等值连接,自连接】
    AND 筛选条件    
    GROUP BY 分组列表        
    HAVING 分组后筛选条件    
    ORDER BY 排序列表     

SQL99语法

1999年的语法。

内连接

在我们刚才的sql当中,使用逗号分隔两张表进行查询,mysql进行优化默认就等效于内连接。

使用【join】关键字,使用【on】来确定连接条件。【where】只做筛选条件。

外连接(常用)

外连接:

应用场景:用于查询一个表中有,另一个表没有的记录

特点:

1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

左外连接:

    select 字段列表 
    from 表名1 
    left[outer] join 表名2 on 条件
    where 筛选条件
    group by 分组条件
    having 分组后的筛选条件
    order by 排序字段

右外连接:

    语法:

    select 字段列表 
    from 表名1 
    right[outer] join 表名2 on 条件
    where 筛选条件
    group by 分组条件
    having 分组后的筛选条件
    order by 排序字段

全外由于MySQL不支持,因此这里只了解其语法:

    select 字段列表 
    from 表名1 
    full[outer] join 表名2 on 条件
    where 筛选条件
    group by 分组条件
    having 分组后的筛选条件
    order by 排序字段

标签:day29,16,08,查询,分组,student,筛选,连接,select
来源: https://www.cnblogs.com/wmh19990109/p/16593132.html