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
补充说明:
#查询使用别名:
#查询过滤重复
#连接查询
交叉连接:不适用任何匹配条件。生成笛卡尔积
内连接:只连接匹配的行
外链接之左连接:优先显示左表全部记录
外链接之右连接:优先显示右表全部记录
全外连接:显示左右两个表全部记录
# 分页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 学号;