mysql笔试


**# ddl 操作数据库
#查询所有的库
show databases;

# 查询当前数据库
select DATABASE();

# 创建数据库 
create database if not exists cp1 ;

#删除数据库
drop database if exists cp1;

#使用数据库
use cp;

#ddl 操作表
#查看当前所有的表
show tables;

#查询表结构
desc user;

#查询指定表的建表语句
show create table user;

# 添加字段
alter table user add sex char(1) comment '性别';
alter table user add idcard char(18) comment '身份证';

#修改数据类型
alter table user modify sex varchar(2);
desc user;

#删除字段
alter table user drop sex;

#创建表
create table if not exists emp(
id int(5),
name varchar(10) 
);

#删除表
drop table if exists emp;

#DML 给表中的字段进行 增 删 修改
insert into user (id,name,pwd,sex) values(13,'张三','118','男');

#DML 给表中的字段进行 增 删 修改 可以和表数据不一致 但是要指明哪些字段 name是字段列也是关键字 不需要加引号
insert into user (id,name,pwd) values(9,'张三','118');

# 不指名 按顺序 values
insert into user values(19,'王卡卡ff','18','女','118222Xffxrxx');

#修改
update user set name = "李四11" where id = 2 and pwd =118

#删除   和查看 都有from 新增和修改都没有from
delete from user where id=3;

-- 关键字 颜色都会变的如下面 update
update user set sex ='男' where id=6 or id =5 or id=3;

-- DQL 查看表的记录   select 
select * from user;

-- 设置别名
select name as '姓名' ,pwd as '密码' ,sex as '性别' from user;

-- 去除重复记录 --数据列 pwd和sex 重复的数据
**select distinct pwd,sex from user;**
select * from user;

-- 去除 --除了id不一样其他数据列都与某条数据列有重复的 只展示一遍 
**select  distinct name,pwd,sex from user;**

-- 查出所有姓名 去重
select distinct name as '姓名' from user;
-- 条件查询
select * from user where pwd>=19;

-- 查询sex为null的数据
select * from user where sex is null;
select * from user where pwd != 118;
select * from user where sex='女' and pwd <=9;

--   <=紧挨着不要有空格
select * from user where sex = '女' and pwd >= 19 and pwd <=30;

-- between a and b 结果包含a 和 b a是最小值 b 是最大值
select * from user where sex = '女' and pwd between 19 and 30;

--  查询 pwd =18 或者 58 或者 30的用户
select * from user where pwd in (18,58,30);
select * from user where pwd =18 or pwd=58 or pwd= 30;

-- 查询名字为2个字的用户信息  '__'两个诶着的下划线
select * from user where name like '__';

 -- 查询名字为2个字的用户信息且两字之间有空格  
select * from user where name like '_ _';

-- 查询身份证号 最后一位是x或者X 
select * from user where idcard like '%x'

-- 查询身份证号 带有x ,%是占位符 可以有 可以没有 可以有多个
select * from user where idcard like '%x%' ;

-- DQL聚合函数 最大 最小 求和 统计数量 avg(为null不计入总数计算) 注意 :max等如果存储类型是char或者varchar和编码有关,一定要存int相关的 不然结果可能不对
select max(pwd), min(pwd) ,avg(pwd) ,count(*) from user;
select sum(pwd) from user where name = '张三';

-- 统计男性,女性别的数量 分组select 查询一般只查 聚合函数和分组的列 其他只展示第一个 没啥意义 比如依据性别分组展示 name 结果女的name只有刘艳 不代表只有刘艳一个女的
select sex,count(sex) from user
 GROUP BY sex;
 
 -- 统计 男的 和女的平均pwd
 select sex, avg(pwd) from user 
 group by sex;
 
 
 -- 先执行where 后分组, 再对分组后的结果进行having过滤  having是对分组后的结果进行过滤,select后面并没有pwd 所以wehre查询后的结果并没有pwd 所以不能having pwd 
 select name ,id from user
 where id<19
 group by name
--  having pwd >=1 分组后结果 只有 id 和 name 就不能对其他的字段进行having过滤 只能where过滤

-- 默认升序 可以不写
select * from user order by pwd;
select * from user order by pwd asc;

-- 降序 
select * from user order by pwd desc 

-- pwd升序排序 如果相同则idcard 倒叙排序
select * from user order by pwd asc , idcard desc;

-- 分页 limit 起始索引(0开始,1-1=0),每一页多少个数
select * from user limit 0 ,5 ;

-- 第二页 每页展示5个记录  起始索引=(页码-1)*页记录数=(2-1)*5=5;
select * from user limit 5,5;


创建表结构和数据


create table emp(
id int comment '编号',
workno varchar(10) comment '工号', 
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
)comment '员工表';


INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01');INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)VALUES (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');

sql简单查询


-- 查询年龄为20,21,22,23岁的女员工信息。
select * from emp where age in (20,21,22,23) and gender='女';

 
-- 查询性别为男,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
select * from emp where gender ='男' and age>20 and age <=40 and name like '___';


-- . 统计员工表中, 年龄小于60岁的 , 男性员工和女性员工的人数
select  gender ,count(*) from emp
where age < 60      -- select后面没有只能用where 不能用haven
group by gender;

-- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select name,age
from emp
where age <=35
order by age,entrydate desc;

--  查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select *
from emp
where age>20 and age<=40 and gender ='男'
order by age ,entrydate
limit 0,5;

-- 查询年龄大于15的员工姓名、年龄,并根据年龄进行升序排序。
select name,age from emp
where age >15
order by age ;

sql 联合查询


-- 创建dept表,并插入数据
create table dept(id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment'部门名称'
)comment '部门表';

INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,'销售部'), (5, '总经办'), (6, '人事部');


-- 创建emp表,并插入数据
create table emp(id  int auto_increment comment 'ID' primary key,
 name varchar(50) not null comment '姓名',    
 age  int comment '年龄',   
 job varchar(20) comment '职位',   
 salary int comment '薪资',   
 entrydate date comment '入职时间',   
 managerid int comment '直属领导ID',  
 dept_id int comment '部门ID')comment '员工表';
 
 -- 添加外键
 alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
 
 insert into emp (id, name, age, job,salary, entrydate, managerid, dept_id)VALUES
 (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
 (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
 (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
 (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),           
 (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),           
 (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),           
 (7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),           
 (8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),            
 (9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),            
 (10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),           
 (11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),           
 (12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),            
 (13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),            
 (14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),           
 (15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),            
 (16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),            
 (17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);
 

联合查询语句

-- 查询每一个员工的姓名 , 及关联的部门的名称 显式内连接实现
 select e.name '员工姓名',d.name '部门名称'
 from emp e inner join dept d on e.id=d.id;
 
 -- 查询每一个员工的姓名 , 及关联的部门的名称 (隐士内连接实现) 
 select e.`name` '员工姓名',d.`name`'部门名称'
 from emp e,dept d
 where e.id=d.id;
 
 -- 一旦为表起了别名,就不能再使用表名来指定对应的字段了
 
 -- 查询emp表的所有数据, 和对应的部门信息
 (由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询)
 
 select e.*,d.name
 from emp e left join dept d on e.id=d.id;
 
 -- . 查询dept表的所有数据, 和对应的员工信息(右外连接)
 select d.*,e.*
 from emp e right join dept d 
 on e.id=d.id;
 
 select * from emp;
 
-- 自连接查询自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。一定要取别名
-- 查询员工及其领导名字
select e.name '员工姓名' ,m.name '领导姓名'
from emp e ,emp m where e.managerid=m.id;

-- 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
select e.name'员工',m.name '领导'from
emp e
left join emp m
on e.managerid=m.id;


-- union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重
-- 将薪资低于 5000 的员工 , 和年龄大于 50 岁的员工全部查询出来  17  

select * from emp where emp.age>50
union 
select * from emp where emp.salary<5000;
--  注意 select的数量不一致会报错

-- 等于下面的
select * from emp where age>50 or salary<5000;

-- 子查询
-- 查询 "销售部" 的所有员工信息
select id from dept where dept.`name`='销售部'
select * from emp where dept_id=4
-- 利用子查询
select * from emp where dept_id=(select id from dept where dept.`name`='销售部');

-- 查询在 "方东白" 入职之后的员工信息
select emp.entrydate from emp where name='方东白';
select * from emp where emp.entrydate>(select emp.entrydate
from emp where name='方东白');

-- 查询 "销售部" 和 "市场部" 的所有员工信息
select * from emp where dept_id in(
select id from dept where dept.`name`='销售部' or dept.`name`='市场部'
);

-- 查询比财务部所有人工资都高的员工信息 解析:比最高的还高 说明比所有的都高 用all
select * from emp where salary>all(
select salary from emp where dept_id=
(select id from dept where dept.`name`='财务部')
);

-- 查询比研发部其中任意一人工资高的员工信息 任意一个 用some 或者 any
select * from emp where salary>some

(select emp.salary from emp where dept_id=
(select id from dept where dept.`name`='研发部'));

-- 查询与 "张无忌" 的薪资及直属领导相同的员工信息 ; 
-- 查询与 "张无忌" 的薪资及直属领导
select salary,managerid from emp where name='张无忌';
select * from emp where salary =12500 and managerid=1
 -- 只有一行多列 ,列用,用=  -- 行子查询
select * from emp where (salary,managerid)=(select salary,managerid from emp where name='张无忌');

-- 子查询返回的结果是多行多列,这种子查询称为表子查询 in
-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

-- "鹿杖客" , "宋远桥" 的职位和薪资
select job,salary from emp where name='鹿杖客' or name='宋远桥'

-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息 列用, 用in
select * from emp where (job,salary) in (select job,salary from emp where name='鹿杖客' or name='宋远桥');

-- 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息  临时表 e
 select e.*,d.*  from (select * from emp where emp.entrydate>'2006-01-01')  e left join dept d on e.dept_id=d.id;


--  练习 -------- 
create table salgrade(grade int,
losal int,
hisal int) comment '薪资等级表';

insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

-- 查询员工的姓名、年龄、职位、部门信息
select e.name,e.age,e.job,d.* from emp e ,dept d where e.dept_id=d.id;

-- 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
select e.name,e.age,e.job,d.* from emp e inner join  dept d on e.dept_id=d.id and e.age<30;


-- 查询拥有员工的部门ID、部门名称 分析:有员工没有部门-查部门肯定要有部门 (pass掉)有的部门没有员工(pass掉) 去交集 内连接,有的部门人很多去重
 
select distinct dept.id,dept.`name` from dept inner join emp on emp.dept_id=dept.id;

-- 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来 on 链接条件 where 条件过滤
select e.*,d.name
from emp e left join dept d on e.dept_id=d.id  where age>40;

-- 查询所有员工的工资等级   -- 要梳理链接条件
-- 反例:between.......and 使用错误 BETWEEN .....and 只能是一个列 而不是多个列
-- select salary from emp where salary BETWEEN (select salgrade.losal from salgrade) and (select salgrade.hisal from salgrade)
select e.*,s.grade
from emp e ,salgrade s where e.salary>=s.losal and e.salary<=s.hisal

-- 写法二:
select e.*,s.grade
from emp e ,salgrade s where e.salary BETWEEN s.losal and s.hisal;


-- 查询 "研发部" 所有员工的信息及工资等级
select e.*,s.grade
from emp e ,salgrade s where e.salary>s.losal and e.salary<s.hisal and e.dept_id=(select id from dept d where d.`name`='研发部');

--  查询 "研发部" 员工的平均工资
select avg(salary) from emp where dept_id=(select id from dept where name='研发部')

-- 查询工资比 "灭绝" 高的员工信息。
select * from emp where salary>
(select salary from emp where name='灭绝');

-- 查询比平均薪资高的员工信息
select * from emp where salary>
(select avg(salary) from emp);

-- 查询低于本部门平均工资的员工信息  -- 先分解 不要开始就想着分组查询
select avg(e.salary) from emp e where dept_id=1;
select avg(e.salary) from emp e where dept_id=2;

select * from emp p where p.salary<(select avg(e.salary) from emp e where e.dept_id=p.dept_id) 


-- 查询所有的部门信息, 并统计部门的员工人数 --:错误分析 应该以部门为基准 有部门才可以 那怕人数为0
select d.id,d.`name` ,(select count(*) from emp e where e.dept_id=d.id) '部门人数'from dept d;



sql语句和基础
左右内外连接
注:UNION表示2个表的数据都有且去重
UNION all不去重复

inner join(内连接)—>两个表的交集
left jion (左连接)---->展示左表有的数据,右表没有的话用null填
right jion (右连接)---->展示右表有的数据,左表没有的话用null填

OUTER JOIN(外连接、全连接),mysql不支持外连接就左连接UNION 右连接

1.查询名字重复的人名和重复次数

select  name_s,count(*) as ct
from student
group by name_s
haven ct>1

2.查询 1998 年出生的学生信息

SELECT
    s_id,
    s_name,
    birth,
    phone,
    addr
FROM
    student
where birth between "1998.1.1 and 1998.12.31

3.查询每门课程的平均成绩,按平均成绩降序排列,平均成绩相同时, 按课程编号升序排列

select  c_id,c_name,avg(score ) as avg
from course c inner join score s 
on c.c_id=s.c_id
group by c.c_id
order by avg desc,c_id  //没有条件只是排序,所以没有haven

4.查询平均成绩 80 分以上(包含 80)的所有学生的学号、姓名和平均成绩

select s_id ,s_name ,avg(score ) as av
from student  s inner join score  c
on s.s_id =c.s_id 
group by s.s_id 
haven av>=80;

5.查询【高等数学】课程分数低于 60 分的学生姓名和分数

-- 查询【高等数学】课程分数低于 60 分   查出分数
SELECT * FROM score sc WHERE  sc.c_id = 'C102' and 
 sc.score < 60;
-- 查询【高等数学】课程分数低于 60 分的学生姓名和分数 
--  加了一个姓名
SELECT s.s_name,sc.score FROM student s LEFT JOIN
 score sc on(s.s_id = sc.s_id) WHERE  sc.c_id = 'C102'
  and  sc.score < 60

sql语句

CREATE TABLE `t_dept` 
( `id` INT(11) NOT NULL AUTO_INCREMENT, 
`deptName` VARCHAR(30) DEFAULT NULL, 
`address` VARCHAR(40) DEFAULT NULL,
 PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `t_emp`
 ( `id` INT(11) NOT NULL AUTO_INCREMENT, 
 `name` VARCHAR(20) DEFAULT NULL, 
 `age` INT(3) DEFAULT NULL,
  `deptId` INT(11) DEFAULT NULL,
   empno int not null, PRIMARY KEY (`id`)
 )
 
#插入数据库字段
INSERT INTO t_dept(deptName,address) VALUES('华山','华山'); INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳'); INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山'); INSERT INTO t_dept(deptName,address) VALUES('武当','武当山'); INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶'); INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺'); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);

INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010)

# 1.所有有门派人员的信息(要求显示门派名称)
select e.`name` ,d.`deptName` from t_emp e inner join t_dept d on d.`id`=e.`deptId`;

# 2. 列出所有人员及其门派信息
select e.`name`,d.`deptName`from t_emp e left join t_dept d on d.`id`=e.`deptId`;

# 3. 列出所有门派
select d.`deptName`from t_dept d;

# 4. 所有无门派人士
select e.`name` from t_emp e WHERE deptId is null;

# 5. 所有无人门派
select d.`deptName` from t_dept d left join t_emp e on d.`id`=e.`deptId` where e.deptId is null;

# 6. 所有人员和门派的对应关系
SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.`deptId`=d.`id`
UNION
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.`deptId`=d.`id`;

7. 所有没有入门派的人员和没人入的门派
分析:#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
#left join + union(可去除重复数据)+ right join 


select e.name from t_emp e left join t_dept  d on d.id=e.deptId where deptId is null
union 
select d.deptName from t_emp e right join t_dept  d on d.id=e.deptId where e.deptId is null


添加 CEO 字段

ALTER TABLE `t_dept` 
add  CEO  INT(11)  ;
 # CEO=2 值,都应该是t_emp 中id的值。
update t_dept set CEO=2 where id=1;
update t_dept set CEO=4 where id=2;
update t_dept set CEO=6 where id=3;
update t_dept set CEO=8 where id=4;
update t_dept set CEO=9 where id=5;


求各个门派对应的掌门人名称
select d.deptName,e.`name` from t_dept d left join t_emp e on d.CEO=e.id


8.2 求所有当上掌门人的平均年龄
select avg(e.age) from t_dept d left join t_emp e on d.CEO=e.id


8.3 求所有人物对应的掌门名称
select e1.id,e1.name,d.address ,e2.name as '掌门名称' from 

t_emp e1 left join 
t_dept d on e1.deptId = d.id 

left join t_emp e2 on d.ceo = e2.id;


sql语句

统计中国每个省的总人口数,将总人口数小于100w进行从高到低排序显示
select district,sum(population) from city where countrycode='CHN' group by district having sum(population)<1000000 order by sum(ppopulation);


统计中国各个省的总人口数量
select district,sum(population) from city where countrycode='CHN' group by district;

统计各位老师,所教课程的及格率(case)
select teacher.tname,count(case when ifnull(sc.score,0)>=60 then 1 end)/count(*)*100  as '及格率%'
from teacher
inner join course
on course.tno=teacher.tno
join sc
on sc.cno=course.cno

统计每门课程:优秀(85分以上),良好(70-85),一般(60-70),不及格(小于60)的学生列表(case)

select course.cname,
group_concat(case when ifnull(sc.score,0)>=85 then student.sname end) as '优秀',
group_concat(case when ifnull(sc.score,0) between 70 and 85 then student.sname end ) as '良好',
group_concat(case when ifnull(sc.score,0) between 60 and 70 then student.sname end) as '一般',
group_concat(case when ifnull(sc.score,0)< 60 then student.sname end) as '不及格'
from student
join sc
on sc.sno=student.sno
join course
on course.cno=sc.cno
group by course.cno;

批注:
1.case when + 条件 then +结果
表示如果满足条件就返回的结果

2.group_concat +(条件)
表示 按照 满足条件的值按照分组 来展示 默认,分割

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值