MySQL查询

本文详细介绍了SQL的各种操作,包括逻辑删除、查询、条件查询、排序、聚合函数、分组、子查询等,涉及表结构、数据筛选、连接查询等多个方面。通过实例展示了如何在数据库中进行数据管理和分析,如查询学生信息、统计各类数据、进行数据分页等,对于理解SQL语法和数据库操作具有指导意义。
摘要由CSDN通过智能技术生成

目录

所用表:

逻辑删除:

查询:

 条件查询 (where):

 排序:

 聚合函数:

分组: 

 分组后的数据筛选:

 获取部分行:

 分页:

连接查询(等值连接):

 内连接:

左连接: 

右连接: 

自关联查询:

 标量子查询:

列子查询: 

行级子查询:

 表子查询:

子查询中特定关键字使用: 

round函数:

数据分表:

练习: 


所用表:

students表结构:

+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| studentNo | varchar(10) | NO   | PRI | NULL    |       |
| name      | varchar(10) | YES  |     | NULL    |       |
| sex       | varchar(10) | YES  |     | NULL    |       |
| hometown  | varchar(10) | YES  |     | NULL    |       |
| age       | tinyint(4)  | YES  |     | NULL    |       |
| class     | varchar(10) | YES  |     | NULL    |       |
| card      | varchar(20) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

scores表结构:

逻辑删除:

  1. 设计表,给表添加一个字段isdelete,1代表删除,0代表没有删除;
  2. 把所有的数据isdelete都改为0;
  3. 要删除某一条数据时,更新他的isdelete为1;
  4. 当要查询数据时,只查询isdelete为0的数据。

查询:

select 字段1,字段2... from 表名 where 条件;

  • 查询学生的性别有哪几种:去重

  •  两个字段进行去重查询:

 条件查询 (where):

        where后面支持多种运算符,进行条件的处理

  • 比较运算
  1. 等于: =;
  2. 大于: >;
  3. 大于等于: >=;
  4. 小于: <;
  5. 小于等于: <=;
  6. 不等于: != 或 <>。
  • 只查询小乔的年龄(=):

  • 查询20岁以下的学生(<): 

  •  查询家乡不在北京的学生(!=)或<>(又小于又大于相当于不等于):

  • 逻辑运算
  1. and:且;
  2. or:或;
  3. not:非。
  • 查询年龄小于20且性别为女的学生:

  •  查询女学生或'1班'的学生:

  •  查询非天津的学生:

  •  模糊查询
  1. like;
  2. %表示任意多个任意字符;
  3. _表示一个任意字符。
  •  查询姓孙的学生:

  •  查询姓孙且名字是一个字的学生:

  •  查询叫乔的学生(以乔结尾):

  •  查询姓名含白的学生:

  •  查询姓名为两个字的学生:

  •  范围查询
  1. in表示在一个非连续的范围内;
  2. between ... and ...表示在一个连续的范围内,小值在前面(只能查数字)。
  •  查询家乡是北京或上海或广东的学生:

  •  查询年龄在18-20的学生:

  •  空判断
  1. 注意:null与' '是不同的,null是空,' '是空字符串;
  2. 判空is null;
  3. 判非空is not null。
  • 查询没有填写身份证的学生 :

  •  查询填写了身份证的学生:

 排序:

select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
  1. 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
  2. 默认按照列值从小到大排列
  3. asc从小到大排列,即升序
  4. desc从大到小排序,即降序
  •  查询所有学生信息,按年龄从小到大排序,从小到大排序可以不写asc:

  • 查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序:

  •  对中文数据进行排序:

 聚合函数:

  1. count(*)表示计算总行数,括号中写星与列名,结果是相同的;
  2. 聚合函数不能在 where 中使用;
  3. count(*)代表一行记录任意字段有值,就会统计在内;
  4. count(card)代表只统计card字段的个数,如果有null值不会被统计。
  • 查询学生总数:

  •  查询女生的最大年龄:

  •  查询北京学生的年龄总和:

  •  查询女生的平均年龄:

  •  查询所有学生的最大年龄、最小年龄、平均年龄:

  •  一班共有多少个学生:

  • 查询3班年龄小于18岁的同学有几个 :

分组: 

select 列1,列2,聚合... from 表名 group by 列1,列2...
  1. 按照字段分组,表示此字段相同的数据会被放到一个组中;
  2. 分组后,分组的依据列会显示在结果集中,其他列不会显示在结果集中;
  3. 可以对分组后的数据进行统计,做聚合运算。

  • 查询各种性别的人数 :

  • 查询各种年龄的人数 :

  • 查询各个班级学生的平均年龄、最大年龄、最小年龄: 

 分组后的数据筛选:

select 列1,列2,聚合... from 表名 group by 列1,列2,列3... having 列1,...聚合...

having必须用在group by之后,having后面的条件运算符与where的相同。

  • where和having的区别:
  1. where是对from后面指定的表进行数据筛选,属于对原始数据的筛选;
  2. having是对group by的结果进行筛选。
  • 查询男生总人数:

  •  查询1班除外其他班级学生的平均年龄、最大年龄、最小年龄:

用where查询:

 用having查询:

 获取部分行:

select * from 表名 limit start,count
select * from students limit 7相当于select * from students limit 0,7
  1. 从start开始,获取count条数据;
  2. start索引从0开始。
  • 查询前3行学生信息 :

  • 查询第4到第6行学生信息: 

 分页:

n:页数,m:每一页显示多少数。

select * from students limit (n-1)*m,m
  • 求总页数
  1. 查询总条数p1;
  2. 使用p1除以m得到p2;
  3. 如果整除则p2为总数页;
  4. 如果不整除则p2+1为总页数。

连接查询(等值连接):

        不判断条件,直接连接,最后用where过滤数据,会产生笛卡尔积的临时表。

select * from 表1,表2 where 表1.列=表2.列
  • 查询学生信息及学生的成绩:

产生笛卡尔积,不符合需求:

 用where筛选数据:

  •  查询学生信息及学生的课程对应的成绩:

 内连接:

        先判断条件,再生成结果,不会产生笛卡尔积,也不会产生临时表,性能高。

select * from 表1 inner join 表2 on 表1.列=表2.列;

select 字段 from 表1,表2 where 关联条件;
  • 查询学生信息及学生的成绩 :

  • 查询课程信息及课程的成绩: 

  •  查询学生信息及学生的课程对应的成绩:

  • 查询王昭君的成绩,要求显示姓名、课程号、成绩: 

  • 查询王昭君的数据库成绩,要求显示姓名、课程名、成绩:  

  • 查询男生中最高成绩,要求显示姓名、课程名、成绩: 

左连接: 

        左连接join前面的表称为左表,join后面的表称为右表;join前面生成的结果作为左表,join后面是右表,左连接将左边表所有的信息显示出来。

select * from 表1 left join 表2 on 表1.列=表2.列
  • 查询所有学生的成绩,包括没有成绩的学生: 

  • 查询所有学生的成绩,包括没有成绩的学生,需要显示课程名: 

右连接: 

        左连接join前面的表称为左表,join后面的表称为右表;join前面生成的结果作为左表,join后面是右表,右连接将右边表所有的信息显示出来。

select * from 表1 right join 表2 on 表1.列=表2.列
  •  查询所有课程的成绩,包括没有成绩的课程:

  • 查询所有课程的成绩,包括没有成绩的课程,包括学生信息: 

自关联查询:

  •  查询郑州市的所有区县: 

  • 查询河南省的所有区县 :

 标量子查询:

        子查询返回的结果是一个数据(一行一列),用'='来查询。

  • 查询大于平均年龄的学生:

  • 查询王昭君的数据库成绩: 

列子查询: 

        列子查询的子查询返回的结果是一列多行,用'in'来查询。

  •  查询18岁的学生的成绩,要求显示成绩:

行级子查询:

        行级子查询返回的结果是一行多列。

  • 查询男生中年龄最大的学生信息: 

 表子查询:

        子查询返回的结果是一个表,多行多列,需要临时起一个别名。

  • 查询数据库和系统测试的课程成绩:

子查询中特定关键字使用: 

  • in 范围

格式: 主查询 where 条件 in (列子查询)。

  • any | some 任意一个

格式: 主查询 where 列 = any/some (列子查询)等于in;

>any等于>some:大于子查询返回结果中的任意一个。

  • all

格式: 主查询 where 列 = all(列子查询) : 等于里面所有;
格式: 主查询 where 列 <>all(列子查询) : 不等于其中所有(反向)。

round函数:

        具有四舍五入的功能,round(x,d)->x为要四舍五入的数,d为保留的位数;round(x)->默认d为0。

       保留两位小数:round(x,2)。

数据分表:

        先创建类型表:

create table if not exists goods_cates(
 cate_id int unsigned primary key auto_increment,
 cate_name varchar(40)
);

再把查询出来的数据插入到另一个表中:

insert into goods_cates (cate_name) select cate from goods group by cate;

 查询出来的列必须对应表中的字段名,如果在表中找不到同名字段,会新建一个字段。

练习: 

  • 统计2班男女生各有多少人(遇到每、各时,都需要用group by):

  •  统计每个班级中每种性别的学生人数,并按照班级升序排列:

  • 求所有电脑产品的平均价格,并且保留两位小数,按价格降序排序:

  • 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值