ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-16 22:00:58  阅读:350  来源: 互联网

标签:day29 16 08 查询 分组 student 筛选 连接 select


目录

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值,又可以判断普通的数值,可读性较低

排序

排序方式:

  • ASC:升序,默认的
  • DESC:降序

特点

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;
  • 如果只有一个参数,说明从起始位置查找4条记录。

  • 如果两个参数,说明从第4行下一行,向后查找3条记录。

面试题:

  • 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有