• mysql命令查询语句&MTdata


    1、单表查询

    select * from student;
    采用*效率低,不推荐,多用列名
    一、单表查询的语法:
        SELECT 字段1,字段2... FROM 表名
                      WHERE 条件
                      GROUP BY field
                      HAVING 筛选
                      ORDER BY field
                      LIMIT 限制条数  (索引 步长)
    
    二、关键字的执行优先级: 
        from
        where
        group by
        having
        select
        distinct 去重处理
        order by
        limit

    补充说明:

    #查询使用别名:

    #查询过滤重复

    #连接查询

    2、多表查询

    交叉连接:不适用任何匹配条件。生成笛卡尔积
    内连接:只连接匹配的行
    外链接之左连接:优先显示左表全部记录
    外链接之右连接:优先显示右表全部记录
    全外连接:显示左右两个表全部记录

    # 分页limit

    # 聚合函数

    sum返回一列的总和

    #MySQL教程之concat以及group_concat的用法

    一、concat()函数
    
    1、功能:将多个字符串连接成一个字符串。
    
    2、语法:concat(str1, str2,...)
    
    返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
    select concat (id, name, score) as info from tt2;
    group_concat()
    1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
    2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
    说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
    
    3、举例:
    
    例7:使用group_concat()和group by显示相同名字的人的id号:

     #合并

     #注意 union与union all的区别:union会去掉相同的纪录

     

    # 通配符

    #exists

    EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
    而是返回一个真假值。True或False
    当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
    select * from employee
        ->     where exists
        ->         (select id from department where id=200);

    1、select 字段 from 表名 查询条件
    2、limit
    3、select 字段 from 左表名 inner/left/right join 右表名 on 条件

     mysql练习题

    联合唯一,比如同一个学生不能选重复的课程
    unique(student_id,course_id),

    unique与primary key的区别:

    简单的讲,primary key=unique+not null
    
    具体的区别:
    
    (1) 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。
    
    (2) 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。
    
    (3) 唯一性约束强制在指定的列上创建一个唯一性索引。在默认情况下,创建唯一性的非聚簇索引,但是,也可以指定所创建的索引是聚簇索引。
    
    (4) 建立主键的目的是让外键来引用.
    
    (5) 一个表最多只有一个主键,但可以有很多唯一键

    联合主键和复合主键区别

    create table test(
        id int(10) not null auto_increment,
        name varchar(20) not null,
        sex int(1) not null,
        primary key (id,name,sex)
    );

     二、MTdata

    1、学生表:student(学号,学生姓名,出生年月,性别)

    create table student(
        id int,
        name char(6),
        born_year year,
        birth_date date,
        class_time time,
        reg_time datetime
    );
    
    insert into student values
    (1,'egon',now(),now(),now(),now());
    
    insert into student values
    (2,'alex',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12");
    日期类型
    create table student(学号 int primary key ,学生姓名 char,出生年月 date,性别 enum('男',''))

    2、成绩表:score(学号,课程号,成绩)

    错误写法:
    create table score(学号 int primary key ,课程号 int,成绩 float,unique(学号,课程号))

    这样设置表就没有主键了
    正确写法:
    联合主键:create table score(学号 int,课程号 int,成绩 float,primary key(学号,课程号));

    3、课程表:course(课程号,课程名称,教师号)

    create table course(课程号 int primary key,课程名称 char,教师号 int)

    4、教师表:teacher(教师号,教师姓名)

    create table teacher(教师号 int primary key,教师姓名 char)

     插入数据:在插入数据前用navicat或者sql语句检查一下各字段的字符长度

    desc student;

    (1)向学生表中

    insert into student(学号,学生姓名,出生年月,性别) values(1,'猴子','1989-01-01','男'),
    (2 , '猴子' , '1990-12-21' , '女'),
    (3 , '马云' , '1991-12-21' , '男'),
    (4, '王思聪' , '1990-05-20' , '男');

    (2)成绩表

    insert into score(学号,课程号,成绩) values(1,1,80),
    (1,2,90),
    (1,3,99),
    (2,2,60),
    (2,3,80),
    (3,1,80),
    (3,3,80);

    (3)课程表

    insert into course(课程号,课程名称,教师号) values(1,'语文',2),
    (2,'数学',1),(3,'英语',3);

    (4)教师表

    insert into teacher(教师号,教师姓名) values(1,'孟扎扎'),
    (2,'马化腾'),(3,null),(4,'');

    查询语句

    1、查询姓‘猴’的学生名单
    select 学生姓名 from student where 学生姓名 like '猴%';
    2、查询姓名中最后一个字是‘猴’的学生名单
    select 学生姓名 from student where 学生姓名 like '%猴';
    3、查询姓名中带‘猴’的学生名单
    select 学生姓名 from student where 学生姓名 like '%猴%';

    ‘猴%’匹配以猴字开头的   猴 后面有没有字符无所谓  % 任意多个字符

    ‘猴_’匹配 以猴字开头 两个字符                 _ 任意一个字符


    汇总分析:
    1、查询课程编号为2的总成绩
    select sum(成绩) as 课程编号为2总成绩 from score where 课程编号=2;

    2、查询选了课程的学生人数 
    select count(distinct 学号) as 选课人数 from score;

     分组:

    1、查询各科成绩的最高分和最低分
    select 课程号,max(成绩),min(成绩) from score group by 课程号;
    2、查询每门课程被选修的学生数
    select 课程号,count(学号) from score group by 课程号;
    3、查询男生、女生人数
    sum是求和,count是计数
    select 性别, count(*) from student GROUP BY 性别;

    分组结果的条件

    1、查询平均成绩大于60分学生的学号和平均成绩 
    select 学号 ,avg(成绩) from score group by 学号 having avg(成绩)>60 ;
    2、查询至少选修两门课程的学生学号
    select 学号 from score group by 学号 having count(学号)>=2;
    3、查询同名同性学生名单并统计同名人数
    select 学生姓名 ,count(*) as 人数 from student group by 姓名 having count(*)>1;
    相同
    select 学生姓名,count(学生姓名) from student group by 学生姓名 having count(学生姓名)>1;

    4、查询不及格的课程并按课程号从大到小排列
    select 课程号,成绩 from score where 成绩 <60 order by 课程号 desc;
    5、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
    select 课程号,avg(成绩) as 平均成绩 from score group by 课程号 order by 平均成绩 asc,课程号 desc;
    6、检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
    select 学号 from score where 课程号=4 and 成绩<60 order by 成绩 desc;
    7、统计每门课程的学生选修人数(超过2人的课程才统计) 要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序

    select 课程号 ,count(学号) as 选修人数 from score group by 课程号 having 选修人数 >2 order by 选修人数 desc,课程号 asc;
    8、查询两门以上不及格课程的同学的学号及其平均成绩

    select 学号,avg(成绩) as 平均成绩 from score where 成绩 <60 group by 学号 having count(课程号)>=2;

    复杂查询:

    没有外键考虑子查询
    1、查询所有课程成绩小于60分学生的学号、姓名
    select 学号,学生姓名 from student where 学号 in (select 学号 from score where 成绩<60);

    2、查询没有学全所有课的学生的学号、姓名
    select 学号,学生姓名 from student where 学号 in (select 学号 from score group by 学号 having count(课程号)<3);

    3、查询出只选修了两门课程的全部学生的学号和姓名
    select 学号,学生姓名 from student where 学号 in (select 学号 from scroe group by 学号 having count(课程号)=2);

    4、1990年出生的学生名单
    select 学生姓名 from student where 出生年月 like '1990%';

    5、查询各科成绩前两名的记录
    (select * from score where 课程号 = 1 order by 成绩  desc limit 2)

    union all

    (select * from score where 课程号 = 1 order by 成绩 desc limit 2)

    union all

    (select * from score where 课程号 = 3 order by 成绩 desc limit 2);

    多表查询:

    1、查询所有学生的学号、姓名、选课数、总成绩

    select student.学号,student.学生姓名,count(score.课程号)as 选课数,sum(score.成绩) from 
    student left join score on student.学号=score.学号 GROUP BY student.学号;

    2、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
    select student.学号,student.学生姓名,avg(score.成绩)as 平均成绩 from student left join score on
    student.学号=score.学号 group by score.学号 having avg(score.成绩)>85;

    3、查询学生的选课情况:学号,姓名,课程号,课程名称
    select student.学号,student.学生姓名,score.课程号,course.课程名称 from student,score,course
    where student.学号=score.学号 and score.课程号=course.课程号 ;

    或者
    select student.学号,student.学生姓名,score.课程号,course.课程名称 from student inner join score on 
    student.学号=score.学号 inner join course on score.课程号=course.课程号 ;
     
    4、查询出每门课程的及格人数和不及格人数
    select 课程号 ,count(学号) as 及格人数 from score where 成绩 >=60 group by 课程号

    union all

    select 课程号 ,count(学号) as 不及格人数 from score where 成绩 <60 group by 课程号;

    -- 考察case表达式
    select 课程号,
    sum(case when 成绩>=60 then 1 
         else 0 
        end) as 及格人数,
    sum(case when 成绩 <  60 then 1 
         else 0 
        end) as 不及格人数
    from score
    group by 课程号;
    5、查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名|

    select student.学号,student.学生姓名 from student,score where
    student.学号=score.学号 and score.课程号=3 and score.成绩>=80;

    或者

    select student.学号,student.学生姓名
    from student inner join score on student.学号=score.学号
    where score.课程号=3 and score.成绩>=80;

    多表查询 where 在 on 的后面

     sql面试题:行列如何互换:

    要替换成的结果为:

    使用case表达式,替换常量列为对应的成绩

    select 学号,
    (case when 课程号=1 then 成绩 else 0 end) as 课程号1,
    (case when 课程号=2 then 成绩 else 0 end) as 课程号2,
    (case when 课程号=3 then 成绩 else 0 end) as 课程号3 from score;


    第3关,分组

    分组,并使用最大值函数max取出上图每个方块里的最大值

    select 学号,

    max(case 课程号 when 1 then 成绩 else 0 end) as 课程号1,

    max(case 课程号 when 2 then 成绩 else 0 end) as 课程号2,

    max(case 课程号 when 3 then 成绩 else 0 end) as 课程号3

    from score group by 学号;
    
    
  • 相关阅读:
    蓝桥杯算法训练 区间k大数查询
    【模板】快读
    [ACM] hdu 2544 最短路(dijkstra算法)
    [ACM] hdu 3791 二叉搜索树
    [ACM] hdu 2141 Can you find it? (二分查找)
    [ACM] hdu 2025查找最大元素(水题)
    [ACM] hdu 1232 畅通工程(并查集)
    [ACM] hdu 1022 Train Problem I(栈的使用)
    [ACM] hdu 2857 Mirror and Light (对称点+两条直线的交点)
    [ACM] hdu 爆头(点到直线距离)
  • 原文地址:https://www.cnblogs.com/foremostxl/p/11141018.html
Copyright © 2020-2023  润新知