mysql命令查询语句

 

 

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)
);

 

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 学号;
 
   
 

 

转载于:https://www.cnblogs.com/foremostxl/p/11141018.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值