mysql之查询

#数据准备
drop table if exists class;
create table class(
    class_no int(2) unsigned zerofill primary key auto_increment comment ‘班级编号‘,
    class_name varchar(30) not null comment ‘班级名称‘
);
insert into class values(1, ‘培优班‘);
insert into class values(2, ‘普通班‘);

drop table if exists student;
create table student(
    stu_no int(2) unsigned zerofill primary key auto_increment comment ‘学员编号‘,
    stu_name varchar(30) not null comment ‘学员姓名‘,
    stu_sex varchar(3) not null comment ‘学员性别‘,
    stu_age tinyint(2) unsigned zerofill comment ‘学员年代‘,
    grade double(5,2) zerofill comment ‘成绩‘,
    class_no int(2) unsigned zerofill comment ‘所在班级编号‘,
    foreign key(class_no) references class(class_no)  
);
insert into student values(01, ‘李白‘, ‘男‘, 18, 60, 01);
insert into student values(02, ‘杜甫‘, ‘男‘, 20, 76, 01);
insert into student values(03, ‘张飞‘, ‘男‘, 32, 80, 02);
insert into student values(04, ‘韩信‘, ‘男‘, 26, 98, 02);
insert into student values(05, ‘了龙‘, ‘男‘, 27, 56, 02);
insert into student values(06, ‘大乔‘, ‘女‘, 17, 88, 01);
insert into student values(07, ‘小乔‘, ‘女‘, 16, 96, 01);
insert into student values(08, ‘小乔‘, ‘女‘, 16, 90, 01);
insert into student values(09, ‘关哥‘, ‘男‘, 32, 80, 02);
insert into student values(10, ‘刘备‘, ‘男‘, 36, 98, null);
alter table student drop foreign key `student_ibfk_1`;
*******************************************************************************************************************************

1: [ group by ] 分组   
    需求: 查询出每一个班级最高成绩是多少
    例: select class_no, max(grade) from student group by class_no;  --先按class_no分组,然后再拿到每一组的最高成绩
    例: select class_no, sum(grade) from student group by class_no;  --查询每一个班级的总成绩
    例: select class_no, min(grade) from student group by class_no;  --查询每一个班级的最低成绩
    例: select class_no, avg(grade) from student group by class_no;  --查询每一个班级的平均成绩
    例: select class_no, count(*) from student group by class_no;    --查询每一个班级的人数
    ps: group by一般要与max,min,avg等这些函数一起使用
    例: select * from student group by class_no;

--可以进多重分组
    需求: 查询出每一个班级男学生和女学生的最高成绩分别是多少
    例: select class_no, stu_sex ,max(grade) from student group by class_no, stu_sex;

例: select class_no, stu_name, max(grade) from student group by class_no;   --不能这样做
    ps: 在要查询的字段集中,这些字段要么是包含在group by语句的后面的字段, 要么就是被包含在聚合函数中, 否则会报错

--还可以对满足条件的记录进行分组
    select class_no, max(grade) from student where class_no is not null group by class_no;
*******************************************************************************************************************************

2: having
    例: select * from student where class_no = 1 and stu_sex = ‘男‘;
    例: select * from student having class_no = 1 and stu_sex = ‘男‘;

例: select class_no, max(grade) from student group by class_no having class_no is not null;   --having
    例: select class_no, max(grade) from student group by class_no where class_no is not null;    --报错
    ps: having需要跟在group by后面,而where不能跟在group by后面
*******************************************************************************************************************************

查询它可以配合5个字句来执行,查询到相应数据(where, order by ,limit, group by, having)
这个子句有一个顺序,需要按照顺序来写
    select * from student [where] [group by] [having] [order by] [limit];
    例: select class_no, stu_sex, avg(grade) from student where(class_no is not null) group by class_no,stu_sex having(stu_sex = ‘男‘) order by class_no desc limit 1;
*******************************************************************************************************************************

3: [ in ](集合运算符)
    需求: 查询出学号是2,3,5的学生
    例: select * from student where stu_no = 2 or stu_no = 3 or stu_no =5;   --使用or运算符
    例: select * from student where stu_no in (2,3,5);                       --使用in集合运算符

例: select * from student where class_no in (2, null);                   --in集合运算符查询不到null值

--还可以有not in
    例: select * from student where stu_no not in (2,3,5);
    例: select * from student where class_no not in (2, null);          --查询结果为空
*******************************************************************************************************************************

4: 子查询
    需求: 获取student表里成绩成绩最高的学员
    例: select * from student order by grade desc limit 1;   --这里不满足需求
    例: select * from student where grade = max(grade);      --报错

例: select * from student where grade = (select max(grade) from student);
    ps: 在查询里边还有其它的查询,那么我们就把里边的查询叫做子查询,子查询需要括号包起来, 子查询可以有多个

ps: 子查询其实也就是一个查询,所以它返回的结果有以下几种情况(单一值),(一列),(一行或者一行多列),(多行多列)
    根据返回值的情况不同,可以把子查询分为四种情况
    1: 单一值(标量子查询)
        需求: 获取student表里成绩成绩最高的学员
        例: select * from student where grade = (select max(grade) from student);

2: 一列(列子查询)
        例: select stu_age from student where grade < 95;

需求: 查询出成绩小于95的学员年龄
        [ in ](集合运算符)
            例: select * from student where stu_age in (select stu_age from student where grade < 95);     --in在集合中存在的
            例: select * from student where stu_age not in (select stu_age from student where grade < 95); --not in在集合中不存在的
        [ any ]
            例: select * from student where stu_age = any(select stu_age from student where grade < 95);   -- =any等于集合中任意一个就行
            例: select * from student where stu_age != any(select stu_age from student where grade < 95);  -- !=any不满足集合中任意一个就行
        [ all ]
            例: select * from student where stu_age = all(select stu_age from student where grade < 95);   -- =all等于集合中所有元素
            例: select * from student where stu_age != all(select stu_age from student where grade < 95);  -- !=不等于集合中的所有元素(意思就是集合中不存在的)

3: 一行(行子查询)
        需求: 查询出同一班中相同成绩的    学生的姓名,班级,成绩;
        select stu_name, class_no, grade from student where (class_no, grade) = (select class_no,grade from student group by class_no, grade having count(*) > 1);
        ps: (class_no, grade)意思是临时构造成一个行,根据子查询到一行去比较;

4: 多行多列(表子查询)
        需求: 查询出表中的stu_name,stu_sex的字段,要使用子查询
        例: select * from (select stu_name, stu_sex from student) as stu;
        ps:from后面需要跟一个表,如果是跟着是一个子查询得的一个临时表,那么你需要给这个字查询起一个加名;

时间: 2024-10-29 10:55:39

mysql之查询的相关文章

mysql子查询慢的问题

当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的"坑"...下面我们来看一个具体的例子 有这样一条查询语句: SELECT gid,COUNT(id) as count FROM shop_goods g1 WHERE status =0 and gid IN (SELECT gid FROM shop_goods g2 WHERE si

Mysql——子查询

子查询的位置: select 中.from 后.where 中.group by 和order by 中无实用意义. 子查询分为如下几类: 1,标量子查询:返回单一值的标量,最简单的形式. 2,列子查询:返回的结果集是 N 行一列. 3,行子查询:返回的结果集是一行 N 列. 4,表子查询:返回的结果集是 N 行 N 列. 可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS 标量子查询:是指子查询返回的是单一值的标量,如一个数字

mysql 怎么查询出,分组后的总条数。。。也就是有多少组数。。。。怎么写

SELECT COUNT(*) AS 多少组数FROM( SELECT id FROM 表 GROUP BY id) subQuery;Mysql,有一个表含有以下字段,uid 发帖人id,title 发帖标题,tc 发帖内容,time 发帖时间,用一条语句算出昨天发帖书大于10的,一共有多少人? select count(*) from (select distinct startperson_id,count(startperson_id) as num from apphome_finan

Mysql慢查询日志脚本

#!/bin/bash LOG=/diskb/mysql/slowlog/   #定义日志存储路径 DATE=`date +"%Y-%m-%d"`   #定义时间参数 user=root                                 #填写MySQL账户信息 passwd=123456 mysql -u$user -p$passwd -e "set global slow_query_log=0" #停止mysql慢查询日志 mysql -u$us

mysql慢查询日志分析工具mysqlsla

一.介绍    mysqlsla是一个分析mysql慢日志的工具,可以分析出慢查询的原因,包括执行某条sql出现的次数及在slow log数据的百分比.执行时间.等待销的时间等. 公司的数据库有很多慢查询日志,导致的系统的负载很高,而mysql慢查询日志文件内容格式不太好看,经推荐使用mysqlsla:使用方便,操作简单. 二.安装mysqlsla 系统环境 CentOS release 6.6 (Final) 2.6.32-504.el6.x86_64 官网已经不能下载,所需要的文件已在百度云

MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用

列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 该例子在前文<MySQL 子查询subquery语法与用法实例>已有解释及数据实例,在此不再赘述. 列子查询中使用 IN.ANY.SOME 和 ALL 操作符 由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > <

Mysql慢查询日志过程

原创地址 :http://itlab.idcquan.com/linux/MYSQL/922126.html mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出代码实现中耗费资源的sql语句,对我们程序的优化有很高的参考.本篇主要将慢查询日志的开启,日志分析,这也是优化SQL程序的一般步骤中至关重要的一步. 1.mysql慢查询日志 打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是my.ini,linux系统是my.cnf)的[mysqld]下面加

MySQL 慢查询

简述: 分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询 超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”. 它能记录下所有执行超过 long_query_time时间的SQL语句, 帮你找到执行慢的SQL,  方便我们对这些SQL进行优化. 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有 慢查询日志,EXPLAIN 分析查询, profiling分析 以及 show命令查询系统状态及系统变量,通过定位分析性

MySQL慢查询日志相关的配置和使用。

MySQL慢查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要的参考依据,是一个非常实用的功能,MySQL慢查询日志的开启和配置非常简单,可以指定记录的文件(或者表),超过的时间阈值等就可以记录到慢sql了,实话讲,相比较sqlserver的trace或者扩展事件(虽然此二者的作用并非仅仅如此),MySQL的配置总是给人一种非常清爽的感觉. 1,慢查询日志的打开 正常情况下,只需要在配置文件中增加slow_query_log = 1配置,即打开慢查询日志,未指定slow_query_

Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. ? 1 2 3 4 5 try { realName = new String(realNam