Java阶段二Day09

news2024/11/25 14:43:49

Java阶段二Day09

文章目录

  • Java阶段二Day09
    • DQL
      • SELECT
      • 基础查询
      • 全部查询
      • `WHERE`子句
      • 连接多个条件
      • `ORDER BY`子句
      • 分页查询
      • 在`SELECT`子句中使用函数
      • 在`WHERE`中使用表达式
      • 别名
      • 聚合函数
  • 教师总结
    • DQL语言-数据查询语言
      • 语法
      • 基础查询
        • 语法
      • WHERE子句
        • 连接多个条件
          • AND的优先级高于OR
        • IN(列表)
          • NOT IN(列表)
        • BETWEEN... AND ...
        • DISTINCT
        • 综合练习
          • 题干
          • 答案
        • LIKE 模糊查询
          • 格式示例
          • 练习
            • 题干
            • 答案
        • NULL值判断
      • ORDER BY子句
      • 分页查询
        • 使用场景
        • 方言
        • 语法
      • 在DQL中使用函数或表达式
        • 在SELECT子句中使用表达式
        • 在SELECT子句中使用函数
          • IFNULL函数
            • 定义
            • 作用
        • 在WHERE中使用表达式
        • 在WHERE中使用函数
      • 别名
        • 语法
        • 综合练习
          • 题干
          • 答案
      • 聚合函数
        • 概念
        • 聚合函数分类
        • 注意事项
        • 练习
          • 题干
          • 答案

DQL

DQL语言用来检索表中数据的语言,涉及到的关键字SELECT

SELECT

执行顺序:

子句执行顺序
SELECT 子句6
FROM 子句1
JOIN… ON…子句2
WHERE 子句3
GROUP BY 子句4
HAVING 子句5
ORDER BY 子句7
LIMIT 子句8

基础查询

  • SELECT 子句用于指定查询表中的字段
  • FROM子句用于指定数据来自那张表
SELECT 字段1,字段2,... FROM 表名

全部查询

SELECT * FROM 表名

注:实际开发中,执行DQL语句,不要用 *
因为当使用SELECT * 时数据库首先要查询数据字典了解待查询表的表结构,了解全字段后才能进行查询。因此会给数据库带来额外的开销,且不划算。因为java代码仅需要编写一次,因此我们应当在SELECT后将所有字段列出。

WHERE子句

在DQL语句中,WHERE同样用于指定过滤条件,此时仅将满足该过滤条件的记录查询出来

连接多个条件

  • AND:“与”,都为真时才为真
  • OR:“或”,都为假时才为假
  • AND的优先级高于OR,为提升OR的优先级可以使用 “()”
  • IN(列表):列表中之一
  • NOT IN(列表):不在列表中
  • BETWEEN…AND…:在一个范围内
  • DISTINCT:将结果集按照指定字段去除重复行,必须紧跟在SELECT之后
  • LIKE:模糊查询,有两个可用通配符,_ 表示确切的一个字符,%表示不确切的0到多个字符(LIKE不能走索引
  • NULL值判断:判断一个字段是否为NULL,使用IS NULL 判断字段值是否为空,IS NOT NULL判断字段值是否不是空,不可以使用 =<>判断NULL

ORDER BY子句

ORDER BY子句用于对查询结果集进行排序,可以按照ORDER BY后指定的字段值进行升序或降序排序

  • 升序:ORDER BY字段 [ASC],将当前结果集按照指定的字段值从小到大排序
  • 降序:ORDER BY字段DESC,将当前结果集按照指定的字段值从大到小排序
  • ORDER BY可以按照多个字段排序,此时排序存在优先级。首先按照ORDER BY后指定的第一个字段的值将结果集按照该字段排序方式(升序或降序)排序。排序后再按照第二个字段指定的值排序,仅会对第一个字段值相同的记录按照第二个字段排序,若有第三个字段以此类推
  • 不指定排序方式时,默认为升序
  • ORDER BY子句时DQL中最后一个子句(MySQLMariaDB 还会在ORDER BY后使用LIMIT子句,但这属于方言)

分页查询

将一个DQL语句的查询结果分段查询出来,

分页查询是方言,并没有在SQL92标准中有语法定义。意味着不同的数据库分页方式的SQL可能完全不同,

在ORACLE中使用伪列ROWNUM完成,而MySQL和MariaDB则使用LIMIT子句完成。

SELECT...
FROM...
...
ORDER BY...
LIMIT M,N
# M:表示跳过结果集M条记录,N:表示从跳过的M条记录后连续检索N条记录
# 在分页查询中有两个常见的参数:
# 页数:当前显示第几页内容   条目数:每页显示的条目数

分页公式M:(页数-1) * 条目数 N:条目数

注意:不添加LIMIT和添加LIMIT,有时获取的记录不太一样,是因为MySQL中,当ORDER BY列中具有相同的值,则服务器可以自由地以任意顺序返回这些行。解决方式就是在ORDER BY排序字段相同情况下,在添加一个排序字段,首选ID

SELECT子句中使用函数

  • IFNULL(arg1,arg2):当arg1的值不为NULL时,函数返回arg1的值,当arg1的值为NULL时,函数返回arg2的值
    • IFNULL函数的作用就是将一个NULL值替换为非NULL

WHERE中使用表达式

别名

别名:通常使用在SELECT子句和FROM子句中,增加可读性。使用 AS(可省略)

  • 当字段为函数或表达式时,通常给字段添加别名,增加可读性
  • SELECT中的子查询取别名
  • 如果别名希望使用关键字或者别名含有空格时,要使用“”将别名括起来
SELECT 字段名 [AS] 别名 FROM 表名

聚合函数

聚合函数:又称为多行函数,分组函数。对记录按照指定字段进行统计,可将多行记录统计出一行记录

  • MIN:统计指定字段的最小值
  • MAX:统计指定字段的最大值
  • SUM:对指定字段求和
  • AVG:对指定字段求平均值
  • COUNT:统计记录数的

注意MINMAXSUMAVG是对值的统计。而COUNT是对记录数的统计。聚合函数忽略NULL值。这个在AVG,COUNT上尤为明显

教师总结

DQL语言-数据查询语言

DQL语言用来检索表中数据的语言,涉及到的关键字SELECT

语法

						执行顺序
SELECT 子句				6	
FROM 子句					1
JOIN... ON...子句			2
WHERE 子句				3
GROUP BY 子句				4
HAVING 子句				5
ORDER BY 子句				7
LIMIT 子句				8

基础查询

语法

SELECT 字段1,字段2,... FROM 表名
  • SELECT 子句用于指定查询表中的字段
  • FROM子句用于指定数据来自那张表

  • 使用SELECT * FROM 表名,可以从指定的表中查询所有字段

    USE tedu
    
    检索teacher表中的所有字段的所有记录
    SELECT * FROM teacher
    
    

    注:

    实际开发中,java代码例若执行DQL语句不要用"*".

    因为当使用SELECT * 时数据库首先要查询数据字典了解待查询表的表结构,了解全字段后才能进行查询。因此会给数据库带来额外的开销,者不划算。因为java代码仅需要编写一次,因此我们应当在SELECT后将所有字段列出。

  • 查看表中指定的某些字段

    查看老师的名字,工资,性别,职位
    SELECT name,salary,gender,title
    FROM teacher
    

**

WHERE子句

在DQL语句中,WHERE同样用于指定过滤条件,此时仅将满足该过滤条件的记录查询出来

  • 查看"一级讲师"的信息,列出:名字,职位,工资,年龄

    1:查看老师的相关信息    			FROM子句,查看teacher表
    2:查看"一级讲师"信息    		 WHERE子句,添加对应的过滤条件
    3:查看名字,职位,工资,年龄		 SELECT子句,查看对应的字段
    
    SELECT name,title,salary,age
    FROM teacher
    WHERE title='一级讲师'
    
  • 查看除了"刘苍松"以外的所有老师的名字,工资,奖金,职位

    SELECT name,salary,comm,title
    FROM teacher
    WHERE name<>'刘苍松'
    
  • 查看职位是"大队长"的学生的名字,年龄,性别?

    SELECT name,age,gender
    FROM student
    WHERE job='大队长'
    
  • 查看年龄在30岁以上(含)的老师的名字,职称,工资,奖金

    SELECT name,title,salary,comm
    FROM teacher
    WHERE age>=30
    

连接多个条件

  • AND:“与”,都为真时才为真
  • OR:“或”,都为假时才为假
  • 查看7岁的"大队长"都有谁?列出这些学生的名字,年龄,性别和职位

    SELECT name,age,gender,job
    FROM student
    WHERE age=7 AND job='大队长'
    
  • 查看班级编号小于6的所有中队长都有谁?列明名字,年龄,性别,班级编号(class_id),职位

    SELECT name,age,gender,class_id,job
    FROM student
    WHERE class_id<6 AND job='中队长'
    
  • 查看所有一级讲师和三级讲师的名字,职称,工资?

    SELECT name,title,salary
    FROM teacher
    WHERE title='一级讲师' OR title='三级讲师'
    
  • 查看所有大队长,中队长和小队长的名字,性别,年龄和职位?

    SELECT name,gender,age,job
    FROM student
    WHERE job='大队长' OR job='中队长' OR job='小队长'
    
AND的优先级高于OR

为了提高OR的优先级,可以使用"()"。

  • 查看班级编号在6(含)以下的所有大队长和中队长的名字,年龄,性别,班级编号和职位

    SELECT name,age,gender,class_id,job
    FROM student
    WHERE class_id<=6 AND job='大队长' OR job='中队长'
          班级编号在6以下的所有大队长    或者  所有班级的中队长
          
          
    SELECT name,age,gender,class_id,job
    FROM student
    WHERE class_id<=6 AND (job='大队长' OR job='中队长')      
    使用()来提高OR的优先级达到查询需求
    

IN(列表)

IN(列表):等于列表其中之一

  • 查看所有大队长,中队长和小队长的名字,性别,年龄和职位?

    SELECT name,gender,age,job
    FROM student
    WHERE job='大队长' OR job='中队长' OR job='小队长'
    等价于
    SELECT name,gender,age,job
    FROM student
    WHERE job IN('大队长','中队长','小队长')
    
  • 查看所有一级讲师,二级讲师,三级讲师的名字,职称,工资和性别

    SELECT name,title,salary,gender
    FROM teacher
    WHERE title IN ('一级讲师','二级讲师','三级讲师')
    
NOT IN(列表)

IN(列表):不在列表中

  • 查看除一级讲师和二级讲师之外的所有老师的名字,职称,工资

    SELECT name,title,salary
    FROM teacher
    WHERE title<>'一级讲师' AND title<>'二级讲师'
    等价于
    SELECT name,title,salary
    FROM teacher
    WHERE title NOT IN('一级讲师','二级讲师')
    
  • 查看除大队长,中队长,小队长的其他学生的名字,职位,性别,年龄

    SELECT name,job,gender,age
    FROM student
    WHERE job NOT IN('大队长','中队长','小队长')
    

BETWEEN… AND …

在一个范围内

  • 查看工资在2000到5000之间的老师的名字,性别,年龄,工资

    SELECT name,gender,age,salary
    FROM teacher
    WHERE salary>=2000 AND salary<=5000
    等价于
    SELECT name,gender,age,salary
    FROM teacher
    WHERE salary BETWEEN 2000 AND 5000 
                         下限      上限
    
  • 查看年龄在7到10岁的学生的名字,性别,年龄

    SELECT name,gender,age
    FROM student
    WHERE age BETWEEN 7 AND 10
    
    查看年龄除了810岁的学生的名字,性别,年龄
    SELECT name,gender,age
    FROM student
    WHERE age NOT BETWEEN 8 AND 10
    
  • 查看年龄在20到35之间的男老师都有谁?列出名字,性别,年龄,职称

    SELECT name,gender,age,title
    FROM teacher
    WHERE age BETWEEN 20 AND 35 
    AND gender='男'
    
  • 查看所有在3-5层的班级都有哪些?列出班级名称和所在楼层

    SELECT name,floor
    FROM class
    WHERE floor BETWEEN 3 AND 5
    

DISTINCT

DISTINCT可以将结果集按照指定的字段去除重复行

DISTINCT必须紧跟在SELECT关键字之后

  • 查看老师的职称都有哪些?

    SELECT title
    FROM teacher
    上述语义时查看teacher表中每个老师的职称
    
    SELECT DISTINCT title
    FROM teacher
    
  • 查看学生都有哪些职位?

    SELECT DISTINCT job
    FROM student
    
  • 查看各年龄段的学生都有哪些职位?

    SELECT DISTINCT age,job		当age与job值相同的记录会被去除。例8岁的大队长可能查出4个,但仅保留
    FROM student                一行
    

综合练习

题干
1.查看负责课程编号(subject_id)1的男老师都有谁?
2.查看工资高于5000的女老师都有谁?
3.查看工资高于5000的男老师或所有女老师的工资?
4.查看所有9岁学生的学习委员和语文课代表都是谁?
5.查看工资在600010000之间的老师以及具体工资?
6.查看工资在40008000以外的老师及具体工资?
7.查看老师负责的课程编号都有什么?
8.查看所有女老师的职称都是什么?
9.查看7-10岁的男同学的职位都有哪些?
10.查看一级讲师和二级讲师的奖金(comm)是多少?
11.查看除老板和总监的其他老师的工资和奖金是多少?
12.查看'3年级2班''5年级3班'在那层楼?
答案
1.查看负责课程编号(subject_id)1的男老师都有谁?
  SELECT name,gender,subject_id
  FROM teacher
  WHERE subject_id=1 AND gender='男'
  
2.查看工资高于5000的女老师都有谁?
  SELECT name,salary,gender
  FROM teacher
  WHERE gender='女' AND salary>5000
  
3.查看工资高于5000的男老师或所有女老师的工资?
  SELECT name,salary,gender
  FROM teacher
  WHERE salary>5000 AND gender='男' OR gender='女'

4.查看所有9岁学生的学习委员和语文课代表都是谁?
  SELECT name,age,job
  FROM student
  WHERE job IN('学习委员','语文课代表') AND age=9

5.查看工资在600010000之间的老师以及具体工资?
  SELECT name,salary
  FROM teacher
  WHERE salary BETWEEN 6000 AND 10000
  
6.查看工资在40008000以外的老师及具体工资?
  SELECT name,salary
  FROM teacher
  WHERE salary NOT BETWEEN 4000 AND 8000

7.查看老师负责的课程编号都有什么?
  SELECT DISTINCT subject_id
  FROM teacher

8.查看所有女老师的职称都是什么?
  SELECT DISTINCT title
  FROM teacher
  WHERE gender='女'

9.查看7-10岁的男同学的职位都有哪些?
  SELECT DISTINCT job
  FROM student
  WHERE age BETWEEN 7 AND 10
  AND gender='男'

10.查看一级讲师和二级讲师的奖金(comm)是多少?
  SELECT name,title,comm
  FROM teacher
  WHERE title IN ('一级讲师','二级讲师')

11.查看除老板和总监的其他老师的工资和奖金是多少?
   SELECT name,salary,comm
   FROM teacher
   WHERE title NOT IN('老板','总监')
   
12.查看'3年级2班''5年级3班'在那层楼?
   SELECT name,floor
   FROM class
   WHERE name IN('3年级2班','5年级3班')

LIKE 模糊查询

LIKE有两个可用的通配符

  • _:表示任意一个字符。确切的数量表示1个字符
  • %:表示任意个字符。不确切的数量表示0-任意个字符
格式示例
LIKE '%X%' 	表示字符串中包含字符X
LIKE '_X%' 	表示字符串中第二个字符是X
LIKE 'X%'  	表示字符串以X开始
LIKE '%X'  	表示字符串以X结束
LIKE '%X_Y'	表示字符串倒数第三个字符数X并且最后一个字符是Y
  • 查看名字中含有’苍’的老师又有谁?

    SELECT name,title,salary
    FROM teacher
    WHERE name LIKE '%苍%'
    
  • 查看姓张的学生都有谁?

    SELECT name,age,gender
    FROM student
    WHERE name LIKE '张%'
    
  • 查看三个字名字中第二个字是’平’的学生都有谁?

    SELECT name,age,gender
    FROM student
    WHERE name LIKE '_平_'
    
  • 查看最后一个字是’晶’的老师都有谁?

    SELECT name,gender,age
    FROM teacher
    WHERE name LIKE '%晶'
    
  • 查看哪些学生是课代表?列出他的名字和职位

    SELECT name,job,age
    FROM student
    WHERE job LIKE '%课代表'
    
  • 查看所有的2班都在哪层?

    SELECT name,floor
    FROM class
    WHERE name LIKE '%2班'
    
练习
题干
1.查询名字姓"李"的学生姓名
2.查询名字中包含"江"的学生姓名
3.查询名字以"郭"结尾的学生姓名
4.查询9-12岁里是"课代表"的学生信息
5.查询名字第二个字是"苗"的学生信息
6.查询姓"邱"的课代表都是谁?
答案
1.查询名字姓"李"的学生姓名
  SELECT name,age,gender
  FROM student
  WHERE name LIKE '李%'
  
2.查询名字中包含"江"的学生姓名
  SELECT name,age,gender
  FROM student
  WHERE name LIKE '%江%'
  
3.查询名字以"郭"结尾的学生姓名
  SELECT name,age,gender
  FROM student
  WHERE name LIKE '%郭'
  
4.查询9-12岁里是"课代表"的学生信息
  SELECT name,age,job
  FROM student
  WHERE job LIKE '%课代表'
  AND age BETWEEN 9 AND 12

5.查询名字第二个字是"苗"的学生信息
  SELECT name,age,gender
  FROM student
  WHERE name LIKE '_苗%'

6.查询姓"邱"的课代表都是谁?
  SELECT name,job,age
  FROM student
  WHERE name LIKE '邱%'
  AND job LIKE '%课代表'
  

NULL值判断

判断一个字段值是否为NULL

  • IS NULL:判断字段的值是否为NULL
  • IS NOT NULL:判断字段的值是否不是NULL
  • 不可以用=和<>判断NULL值
  • 查看哪些老师的奖金为空?

    SELECT name,salary,comm
    FROM teacher
    WHERE comm IS NULL
    
  • 查看有奖金的老师?

    SELECT name,salary,comm
    FROM teacher
    WHERE comm IS NOT NULL
    

ORDER BY子句

ORDER BY子句用于对查询结果集进行排序,可以按照ORDER BY后指定的字段值进行升序或降序排序

  • 升序:ORDER BY 字段 [ASC]。将当前结果集按照指定的字段值从小到大排序。
  • 降序:ORDER BY 字段 DESC。将当前结果集按照指定的字段值从大到小排序。
  • ORDER BY可以按照多个字段排序,此时排序存在优先级。
    • 首先按照ORDER BY后指定的第一个字段的值将结果集按照该字段排序方式(升序或降序)排序
    • 排序后再按照第二个字段指定的值排序,仅会对第一个字段值相同的记录按照第二个字段排序
    • 若有第三个字段以此类推
  • 不指定排序方式时,默认为升序
  • ORDER BY子句是DQL中最后一个子句(像MySQL和MariaDB还会在ORDER BY后使用LIMIT子句,但这属于方言)

  • 查看老师的工资排名,从多到少

    SELECT name,salary
    FROM teacher
    ORDER BY salary DESC		将结果集按照salary的降序进行排序
    
  • 查看老师奖金的排名?

    SELECT name,comm
    FROM teacher
    ORDER BY comm DESC
    
  • 查看学生的生日,按照从远到近

    日期是可以比较大小的,规则"远小近大"
    SELECT name,birth
    FROM student
    ORDER BY birth
    
  • 查看7-10岁的学生信息,学生按照年龄从大到小排序(同年龄的看生日)

    SELECT name,age,birth
    FROM student
    WHERE age BETWEEN 7 AND 10
    ORDER BY birth
    
  • 查看老师的工资和奖金,首先按照奖金的升序,再按照工资的降序

    SELECT name,comm,salary
    FROM teacher
    ORDER BY comm ASC,salary DESC  每个字段都要单独指定排序方式
    等同
    SELECT name,comm,salary
    FROM teacher
    ORDER BY comm ,salary DESC    升序ASC可以忽略
    
    多字段排序时,首先将结果集按照comm的排序方式排序,之后将comm字段值相同的记录再按照salary的方式排序
    当comm字段值不同的记录,则不会再按照salary字段排序
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSBHz48x-1682427549264)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425152509714.png)]

分页查询

将一个DQL语句的查询结果分段查询出来

使用场景

当一条DQL语句可以查询出非常大量的数据时,我们可以分批将数据查询,例如淘宝检索一件商品时,分出现第一页,第二页等信息,每页展示30条记录。一次仅查询30条记录,避免因为数据庞大导致系统过度的资源开销,已经更慢的传输速度。

方言

分页查询是方言,并没有在SQL92标准中有语法定义。意味着不同的数据库分页方式的SQL可能完全不同。

在ORACLE中使用伪列ROWNUM完成,而MySQL和MariaDB则使用LIMIT子句完成。

语法

SELECT...
FROM ...
...
ORDER BY ...
LIMIT M,N
  • M:表示跳过结果集M条记录

  • N:表示从跳过的M条记录后连续检索N条记录

  • 在分页查询中有两个常见的参数

    • 页数:当前显示第几页内容
    • 条目数:每页显示的条目数
  • 分页公式

    • M:(页数-1)*条目数

    • N:条目数

    • 例如:显示第3页,每页显示5条记录
      M:(3-1)*5   ->M:10
      N:5         ->N:5    
      

  • 查看老师工资的前5名?

    SELECT name,salary
    FROM teacher
    ORDER BY salary DESC
    LIMIT 0,5
    
  • 查看老师奖金信息,按照降序排序后,每页显示3条,显示第5页?

    页数:5   条目数:3
    - M:(页数-1)*条目数   (5-1)*3->M:12
    - N:条目数
    
    SELECT name,comm
    FROM teacher
    ORDER BY comm DESC
    LIMIT 12,3
    
    

在DQL中使用函数或表达式

在SELECT子句中使用表达式

  • 查看每个老师的工资和年薪

    SELECT name,salary,salary*12
    FROM teacher
    

在SELECT子句中使用函数

IFNULL函数
定义
IFNULL(arg1,arg2)
作用
  • 当arg1的值不为NULL时,函数返回arg1的值

  • 当arg1的值为NULL时,函数返回arg2的值

  • 内部逻辑

    用java代码理解内部逻辑
    IFNULL(arg1,arg2){
    	if(arg1!=null){
    		return arg1;
    	}else{
    		return arg2;
    	}
    }
    
  • IFNULL函数的作用就是将一个NULL值替换为非NULL值

  • 查看每个老师的工资,奖金,工资+奖金分别是多少?

    在数据库中任何数字与NULL运算结果都是NULL
    SELECT name,salary,comm,salary+comm
    FROM teacher
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKM0Dmho-1682427549265)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425155641688.png)]

    SELECT name,salary,comm,salary+IFNULL(comm,0)	使用IFNULL函数将NULL替换为非NULLFROM teacher
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x9AyS6J7-1682427549266)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425155854465.png)]

  • 查看每个老师的奖金,以及全年奖金?

    SELECT name,comm,IFNULL(comm*12,0)
    FROM teacher
    

在WHERE中使用表达式

  • 查看年薪高于60000的老师都有谁?

    SELECT name,salary
    FROM teacher
    WHERE salary*12>60000
    

在WHERE中使用函数

  • 查看哪些老师的奖金少于3000?

    SELECT name,comm
    FROM teacher
    WHERE comm<3000
    查询不出comm为NULL的记录。因为NUL是状态,不具可比性。因此:=,<>,>,>=,<,<=都不可以
    
    
    SELECT name,comm
    FROM teacher
    WHERE IFNULL(comm,0)<3000
    

别名

别名通常使用在SELECT子句和FROM子句中

  • 在SELECT子句中我们可以为字段取别名。
    • 当字段为函数或表达式时,我们通常给字段添加别名,为了增加可读性
    • 为SELECT中的子查询取别名
  • 在FROM 子句中可以为表添加别名

语法

  • 字段名<空格>别名

    SELECT name,salary,salary*12
    FROM teacher
    当SELECT中含有表达式时,结果集该字段使用这个表达式作为字段名
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGWvOXnA-1682427549266)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425163135010.png)]

    SELECT name,salary,salary*12 annusal
    FROM teacher
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iGOKdB5K-1682427549267)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425163200469.png)]

  • 字段名 AS 别名

    SELECT name,salary,salary*12 AS annusal
    FROM teacher
    
  • 字段名 [AS] ‘别名’

    SELECT name,salary,salary*12 AS 'annusal'
    FROM teacher
    
    SELECT name,salary,salary*12 'annusal'
    FROM teacher
    
  • 字段名 [AS] “别名”

    SELECT name,salary,salary*12 AS "annusal"
    FROM teacher
    
    SELECT name,salary,salary*12 "annusal"
    FROM teacher
    
  • 如果别名希望使用关键字或者别名含有空格时,要使用引号将别名括起来

    SELECT name,salary,salary*12 FROM 		希望为salary*12添加别名FROM。此时FROM是关键字
    FROM teacher                            会引发SQL语义错误
    
    SELECT name,salary,salary*12 'FROM'     
    FROM teacher
    
    
    
    SELECT name,salary,salary*12 annu sal  当别名中含有空格时,数据库理解为annu是salary*12FROM teacher					       别名,后面的sal会语法错 误。
    
    
    SELECT name,salary,salary*12 'annu sal'
    FROM teacher
    

综合练习

题干
1.查询所有10岁学生的生日,按生日对应的年纪从大到小.
2.查询8岁同学中名字含有"苗"的学生信息
3.查询负责课程编号12号且工资高于6000的老师信息
4.查询10岁以上的语文课代表和数学课代表
5.查询不教课程编号1的老师信息,按照工资降序排序
6.查询没有奖金的老师信息
7.查询所有老师的奖金,并按照奖金降序排序
8.查看工资高于8000的老师负责的课程编号都有那些?
9.查看全校年龄最小学生的第6-10
答案
1.查询所有10岁学生的生日,按生日对应的年纪从大到小.
  SELECT name,age,birth
  FROM student
  WHERE age=10
  ORDER BY birth
  
2.查询8岁同学中名字含有"苗"的学生信息
  SELECT name,age,gender
  FROM student
  WHERE age=8
  AND name LIKE '%苗%'

3.查询负责课程编号12号且工资高于6000的老师信息
  SELECT name,subject_id,salary
  FROM teacher
  WHERE subject_id IN (1,2)
  AND salary>6000
  
4.查询10岁以上的语文课代表和数学课代表
  SELECT name,age,job
  FROM student
  WHERE age>10
  AND job IN ('语文课代表','数学课代表')

5.查询不教课程编号1的老师信息,按照工资降序排序
  SELECT name,subject_id,salary
  FROM teacher
  WHERE subject_id<>1
  ORDER BY salary DESC

6.查询没有奖金的老师信息
  SELECT name,comm,salary
  FROM teacher
  WHERE IFNULL(comm,0)=0
  
7.查询所有老师的奖金,并按照奖金降序排序
  SELECT name,comm
  FROM teacher
  ORDER BY comm DESC

8.查看工资高于8000的老师负责的课程编号都有那些?
  SELECT DISTINCT subject_id
  FROM teacher
  WHERE salary>8000
  
9.查看全校年龄最小学生的第6-10SELECT name,birth,age
  FROM student
  ORDER BY birth DESC
  LIMIT 5,5

注:第9题,不添加LIMIT看到结果集中6-10和添加了LIMIT获取6-10记录不完全一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bbxmP8WW-1682427549268)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230425171804801.png)]

原因:

MySQL官方文档给出了解释

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

One factor that affects the execution plan is LIMIT, so an ORDER BY query with and without LIMIT may return rows in different orders.
  
翻译:  
如果多行在 ORDER BY 列中具有相同的值,则服务器可以自由地以任意顺序返回这些行,并且可能会根据整体执行计划以不同的方式返回这些行。换句话说,这些行的排序顺序对于无序列是不确定的。

影响执行计划的一个因素是 LIMIT,因此带有和不带 LIMITORDER BY 查询可能会返回不同顺序的行。

解决方式

解决办法:排序时指定字段值相同的记录无论是否添加LIMIT子句,要保证这些记录的顺序始终一致即可.我们要额外的追加一个辅助字段进行排序,确保顺序一定一致**.通常辅助字段值不要用重复的,赋值字段首选ID**

  SELECT name,birth,age
  FROM student
  ORDER BY birth DESC,id
  LIMIT 5,5
  查询时当birth字段值相同的记录,在按照id排序,那么birth字段指向相同的记录在结果集中的顺序也一定是一致的

聚合函数

概念

聚合函数又称为多行函数,分组函数。对记录按照指定字段统计的,可以将多行记录统计出一行记录

聚合函数分类

  • MIN:统计指定字段的最小值
  • MAX:统计指定字段的最大值
  • SUM:对指定字段求和
  • AVG:对指定字段求平均值
  • COUNT:统计记录数的

注意事项

  • MIN,MAX,SUM,AVG是对值的统计。而COUNT是对记录数的统计
  • 聚合函数忽略NULL值。这个在AVG,COUNT上尤为明显

  • 查看老师的平均工资是多少?

    1:先将参与统计的数据查询出来,确定DQL语句
    2:再对该DQL添加聚合函数对结果集统计
    
    1:编写DQL查询出参与统计的记录(所有老师的工资)
    SELECT salary
    FROM teacher
    
    2:在上述SQL语句的基础上添加聚合函数
    SELECT AVG(salary)
    FROM teacher
    
    
  • 查看老师的最高工资,最低工资,平均工资和工资总和都是多少?

    1:编写DQL查询出参与统计的记录(所有老师的工资)
    SELECT salary,salary,salary,salary
    FROM teacher
    
    2:在上述SQL语句的基础上添加聚合函数
    SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM teacher
    
  • 查看负责课程编号1的老师的平均工资是多少?

    1:准备数据(课程编号1的老师工资)
    SELECT salary
    FROM teacher
    WHERE subject_id=1
    
    2:添加聚合函数
    SELECT AVG(salary)
    FROM teacher
    WHERE subject_id=1
    
  • 查看总共多少位老师?

    1:查询出所有老师
    SELECT name FROM teacher
    
    2:添加聚合函数
    SELECT COUNT(name) FROM teacher    统计name字段值不为NULL的记录共多少条
    SELECT COUNT(comm) FROM teacher    因为comm字段有NULL值,聚合函数忽略对NULL的统计
    
    SELECT COUNT(1) FROM teacher       可以,不推荐
    
    SELECT COUNT(*) FROM teacher       DBMS基本都对COUNT(*)采取了优化
    
    

练习

题干
1.查看所有老师的平均奖金是多少?
2.查看负责课程编号2的老师共多少人?
3.查看班级编号(class_id)1的学生有多少人?
4.查看全校学生生日最大的是哪天?
5.查看11岁的课代表总共多少人?
6.姓张的学生有多少人?
7.工资高于5000的老师中最低工资是多少?
8.4层有几个班?
9.老师中"总监"的平均工资是多少?
答案
1.查看所有老师的平均奖金是多少?
2.查看负责课程编号2的老师共多少人?
3.查看班级编号(class_id)1的学生有多少人?
4.查看全校学生生日最大的是哪天?
5.查看11岁的课代表总共多少人?
6.姓张的学生有多少人?
7.工资高于5000的老师中最低工资是多少?
8.4层有几个班?
9.老师中"总监"的平均工资是多少?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/461136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue使用原生bootstrap-fileinput无效(未解决)

这篇只记录一下踩到的坑&#xff0c;由于时间关系&#xff0c;此问题未解决 起因&#xff1a;要求替换项目框架&#xff0c;原先jq要替换成vue。之前bootstrap中自带的文件上传插件自带很多功能&#xff0c;上传进度条、上传内容预览等非常方便&#xff08;如图&#xff09;&a…

Netty核心源码分析(四)心跳检测源码分析

文章目录 系列文章目录一、心跳检测案例二、源码分析1、Netty心跳的三个Handler2、IdleStateHandler源码&#xff08;1&#xff09;四个关键属性&#xff08;2&#xff09;handlerAdded方法&#xff08;3&#xff09;四个内部类 3、读事件的run方法——ReaderIdleTimeoutTask4、…

easyrecovery16最新数据恢复软件密钥使用方法教程

easyrecovery是一款专业的数据恢复软件,其最新版本为easyrecovery2023将于2022年底发布。总之,easyrecovery是一款功能齐全、性能稳定的专业数据恢复软件,无论删除文件、格式化分区或磁盘故障,它都可以提供最高的恢复成功率。值得个人用户选用。此版本在功能和性能上有较大提升…

支持中英双语和多种插件的开源对话语言模型,160亿参数

一、开源项目简介 MOSS是一个支持中英双语和多种插件的开源对话语言模型&#xff0c;moss-moon系列模型具有160亿参数&#xff0c;在FP16精度下可在单张A100/A800或两张3090显卡运行&#xff0c;在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码…

HTB靶机-Lame-WP

Lame 简介&#xff1a; Lame is a beginner level machine, requiring only one exploit to obtain root access. It was the first machine published on Hack The Box and was often the first machine for new users prior to its retirement Tags&#xff1a; Injection, C…

Midjourney 注册 12 步流程教学

原文&#xff1a; https://bysocket.com/midjourney-register/ 先推荐一个 PromptHero 中文官网 https://promptheroes.cn/ &#xff1a;Prompt Heroes 官网是提供 AI 绘画相关提示词中文网站&#xff0c;包括 Midjourney&#xff08;MJ&#xff09;、 Stable Diffusion、DALL…

printf,echo,cat指令与输出重定向>,输入重定向<与追加重定向>>等

printf指令的功能&#xff08;输出/追加重定向&#xff09; 语法&#xff1a;printf “格式化数据” (>/>>重定向)功能&#xff1a;格式化输出(默认往显示器文件且不带换行符&#xff09; 实例演示 echo指令的功能&#xff08;输出/追加重定向&#xff09; 语法&am…

使用chatgpt分析 too many open files 问题-未验证

java.io.IOException: Too many open files 怎么能定位到时哪行代码出的问题 &#xff1f; 2023/4/25 19:46:33 当出现类似 "java.io.IOException: Too many open files" 的错误时&#xff0c;通常是因为程序打开了过多的文件句柄&#xff08;File Handles&#xff…

【操作系统】第四章 文件管理

文章目录 知识体系4.1 文件系统基础4.1.1 文件的基本概念4.1.2 文件控制块和索引节点4.1.3 文件的操作4.1.4 文件保护4.1.5 文件的逻辑结构4.1.6 文件的物理结构 4.2 目录4.2.1 目录的基本概念4.2.2 目录结构4.2.3 目录的操作*4.2.4 目录实现4.2.5 文件共享 4.3 文件系统4.3.1 …

快速部署和测试API:使用APIfox的实战经验分享

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 20分钟学ApiFox接口测试工具&#xff0c;结合30个项目实战讲解&#xff01;_哔哩哔哩_bilibili20分…

十、v-model的基本使用

一、v-model的基本使用 表单提交是开发中非常常见的功能&#xff0c;也是和用户交互的重要手段&#xff1a; 比如用户在登录、注册时需要提交账号密码&#xff1b;比如用户在检索、创建、更新信息时&#xff0c;需要提交一些数据&#xff1b; 这些都要求我们可以在代码逻辑中…

LVS+KeepAlived高可用负载均衡集群

1. 高可用群集的相关知识 1. 1 高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度器…

【MCS-51】51单片机结构原理

至今为止&#xff0c;MCS-51系列单片机有许多种型号的产品&#xff1a;其中又分为普通型51&#xff08;8031、8051、89S51&#xff09;和增强型52&#xff08;8032、8052、89S52等&#xff09;。它们最大的区别在于存储器配置各有差异。下面我举例子的都是8051这一系列的单片机…

如何用ChatGPT协助做内容分发?(文本变成直播/音频/视频脚本)

该场景对应的关键词库&#xff08;14个&#xff09;&#xff1a; 直播博主、直播达人、音频主持人、产品特点、品牌故事、品牌活动、品牌logo、视频主角、画外音解说员、编剧身份、品牌内容分发方向、时长、脚本类型、产品 提问模板&#xff1a; 1、你是一名优秀的美妆达人&am…

零拷贝技术详解

文章目录 零拷贝技术前世数据的四次拷贝与四次上下文切换4 次 copy4 次上下文切换弊端 零拷贝诞生准备--DMA技术DMA 参与下的数据四次拷贝 零拷贝诞生零拷贝技术什么是零拷贝技术&#xff1f;零拷贝的实现方式技术总结1、DMA 技术2、使用 page cache 的 zero copy&#xff1a;3…

Redis命令及不同类型数据的应用场景

文章目录 本章要点基本命令心跳命令ping读写键值命令DB切换select查看key数量 dbsize删除当前库数据flushdb删除所有库数据flushall退出客户端命令 Key操作命令String型Value操作命令典型应用场景 Hash型Value操作命令应用场景 List型Value操作命令应用场景 Set型Value操作命令…

麻了,部门新来的00后给我卷崩溃了...

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

前端工程化知识总结

1.webpack 和 gulp 区别 gulp&#xff08;流&#xff09;主要指前端开发的工作流程&#xff0c;通过配置一系列的task&#xff0c;定义task处理的事务(例如文件压缩合并、雪碧图、启动server、版本控制等)&#xff0c;再定义执行顺序&#xff0c;让gulp执行 task&#xff0c;从…

【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

【WCH】CH32F203基于内部RTCI2C SSD1306 OLED时钟和温度显示 &#x1f4cc;相关篇《【WCH】CH32F203基于内部RTC时钟I2C SSD1306 OLED显示》&#x1f4fa;显示效果&#xff1a; ✨主要是在其基础 上增加温度显示&#xff0c;温度数据来源于DS18B20&#xff0c;更换了OLED驱动显…

19.Java文件操作---I/O流

Java文件操作—I/O流 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中&#xff0c;管道是一条不间断的字节流&#xff0c;用来实现程序或进程间的通信&#xff0c;或读写外围设备、外部文件等。一个流&#xff0c;必有源端和目的端&#xff0c;它们可以是计算机内存的某…