createtable t_user2(
name VARCHAR(32),
phone VARCHAR(11),
email VARCHAR(32),PRIMARYKEY(name,phone));
第四关 外键约束
mysql -uroot -p123123 -h127.0.0.1
createdatabase TestDb;
use TestDb;
CREATETABLE t_class
(
id INTPRIMARYKEY,
name VARCHAR(22));
CREATETABLE t_student
(
id INTPRIMARYKEY,
name VARCHAR(22),
classId int,CONSTRAINT fk_stu_class1 FOREIGNKEY(classId)REFERENCES t_class(id));
第五关 添加常用约束
mysql -uroot -p123123 -h127.0.0.1
CREATEDATABASE MyDb;
USE MyDb;
CREATETABLE t_user
(
id INTPRIMARYKEYAUTO_INCREMENT,
username VARCHAR(32)NOTNULLUNIQUE,
sex VARCHAR(4)DEFAULT'男')DEFAULTCHARSET=utf8;
单表查询(一)
第一关 基本查询语句
USE Company;#请在此处添加实现代码########## Begin #################### retrieving the Name and Salary ##########select Name,Salary from tb_emp;########## retrieving all the table ##########select*from tb_emp;########## End ##########
第二关 带 IN 关键字的查询
USE Company;#请在此处添加实现代码########## Begin #################### retrieving the Name and Salary with IN statement ##########SELECT Name,Salary FROM tb_emp WHERE Id NOTIN(1);########## End ##########
第三关 带 BETWEEN AND 的范围查询
USE Company;#请在此处添加实现代码########## Begin #################### retrieving the Name and Salary with BETWEEN AND statement ##########SELECT Name,Salary FROM tb_emp
WHERE Salary BETWEEN3000AND5000;########## End ##########
单表查询(二)
第一关 带 LIKE 的字符匹配查询
USE Company;######### Begin #########SELECT Name,Salary FROM tb_emp WHERE Name LIKE"C%";######### End #########
第二关 查询空值与去除重复结果
USE Company;######### Begin #########SELECT*FROM tb_emp WHERE DeptId ISNULL;######### End ################## Begin #########SELECTDISTINCT Name FROM tb_emp;######### End #########
第三关 带 AND 与 OR 的多条件查询
USE Company;######### Begin #########SELECT*FROM tb_emp WHERE DeptId=301AND Salary >3000;######### End ################## Begin #########SELECT*FROM tb_emp WHERE DeptId=301OR DeptId=303;######### End #########
单表查询(三)
第一关 对查询结果进行排序
USE School;#请在此处添加实现代码########## Begin #################### 查询1班同学的所有信息以成绩降序的方式显示结果 ##########select*from tb_score where class_id =1orderby score desc;########## End ##########
第二关 分组查询
USE School;#请在此处添加实现代码########## Begin #################### 对班级名称进行分组查询 ##########SELECT*FROM tb_class GROUPBY class_id;########## End ##########
第三关 使用 LIMIT 限制查询结果的数量
USE School;#请在此处添加实现代码########## Begin #################### 查询班级中第2名到第5名的学生信息 ##########SELECT*FROM tb_score orderby score descLIMIT1,4;########## End ##########
数据库和表的基本操作(一)
第一关 查看表结构与修改表名
USE Company;########## Begin #################### modify the table name ##########ALTERTABLE tb_emp RENAME jd_emp;########## show tables in this database ##########showtables;########## describe the table ##########describe jd_emp;########## End ##########
第二关 修改字段名与字段数据类型
USE Company;#请在此处添加实现代码########## Begin #################### change the column name ##########ALTERTABLE tb_emp change Id prod_id int(11);########## change the data type of column ##########ALTERTABLE tb_emp MODIFY Name varchar(30);########## End ##########DESCRIBE tb_emp;
第三关 添加与删除字段
USE Company;#请在此处添加实现代码########## Begin #################### add the column ##########ALTERTABLE tb_emp ADD Country varchar(20)AFTER Name;########## delete the column ##########ALTERTABLE tb_emp DROP Salary;########## End ##########DESCRIBE tb_emp;
第四关 修改字段的排列位置
USE Company;#请在此处添加实现代码########## Begin #################### modify the column to top ##########ALTERTABLE tb_emp MODIFY Name varchar(25)FIRST;########## modify the column to the rear of another column ##########ALTERTABLE tb_emp MODIFY DeptId int(11)AFTER Salary;########## End ##########DESCRIBE tb_emp;
第五关 删除表的外键约束
USE Company;#请在此处添加实现代码########## Begin #################### delete the foreign key ##########ALTERTABLE tb_emp DROPFOREIGNKEY emp_dept;########## End ##########SHOWCREATETABLE tb_emp \G;
数据库和表的基本操作(二)
第一关 插入数据
USE Company;#请在此处添加实现代码########## Begin #################### bundle insert the value #########INSERTINTO tb_emp(Id,Name,DeptId,Salary)VALUES(1,"Nancy",301,2300.00),(2,"Tod",303,5600.00),(3,"Carly",301,3200.00);########## End ##########SELECT*FROM tb_emp;########## End ##########
第二关 更新数据
USE Company;#请在此处添加实现代码########## Begin #################### update the value ##########update tb_emp
set Name="Tracy",DeptId=302,Salary=4300.00where Id =3;########## End ##########SELECT*FROM tb_emp;
第三关 删除数据
USE Company;#请在此处添加实现代码########## Begin #################### delete the value ##########DELETEFROM tb_emp
WHERE Salary>3000;########## End ##########SELECT*FROM tb_emp;
连接查询
第一关 内连接查询
USE School;########## 查询数据表中学生姓名和对应的班级 ###########请在此处添加实现代码########## Begin ##########select tb_student.name as studentName,tb_class.name as className from tb_student join tb_class on tb_class.id = tb_student.class_id;########## End ##########
第二关 外连接查询
USE School;########## 使用左外连接查询所有学生姓名和对应的班级 ###########请在此处添加实现代码########## Begin ##########select tb_student.name as studentName,tb_class.name as className
from tb_class rightjoin tb_student on
tb_class.id=tb_student.class_id;########## End #################### 使用右外连接查询所有学生姓名和对应的班级 ##########select tb_student.name as studentName,tb_class.name as className
from tb_class leftjoin tb_student
on tb_class.id=tb_student.class_id;#请在此处添加实现代码########## Begin #################### End #################### End ##########
第三关 复合条件连接查询
USE School;########## 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级 ###########请在此处添加实现代码########## Begin ##########select s1.name as studentName,score,
s2.name as className from tb_student as s1,
tb_class as s2 where s1.class_id=s2.id and
s1.score>90orderby score desc;########## End ##########
子查询
第一关 带比较运算符的子查询
USE Company;#请在此处添加实现代码########## Begin ###########1.查询大于所有平均年龄的员工姓名与年龄select name,age from tb_emp where age>(selectavg(age)from tb_emp);########## End ##########
第二关 关键字子查询
USE Company;#请在此处添加实现代码########## Begin ###########1.使用 ALL 关键字进行查询SELECT position,salary FROM tb_salary WHERE salary >ANY(SELECTmax(salary)FROM tb_salary where position="java");#2.使用 ANY 关键字进行查询SELECT position,salary FROM tb_salary WHERE salary >ANY(SELECTmin(salary)from tb_salary where position="java");#3.使用 IN 关键字进行查询select position,salary from tb_salary where position in("java");########## End ##########
复杂查询(一)
第一关 交换工资
#请在此添加实现代码########## Begin ##########UPDATE tb_Salary
SET
sex =CASE sex WHEN"m"THEN"f"ELSE"m"END;########## End ##########
第二关 换座位
#请在此添加实现代码########## Begin ##########SELECTif(Id%2=0,Id-1,if(Id=5,Id,Id+1))AS id,name
FROM tb_Seat ORDERBY Id;########## End ##########
第三关 分数排名
#请在此添加实现代码########## Begin ##########select Score,(selectcount(distinct score)from score where score >=s.score)as Rank
from score as s orderby Score desc;select Score,(selectcount(*)from score as s2 where s2.score >s1.score)+1as Rank
from score as s1 orderby Rank;########## End ##########
第四关 体育馆的人流量
#请在此添加实现代码########## Begin ##########selectdistinct a.*from gymnasium a,gymnasium b,gymnasium c
where a.visitors_flow>=100and b.visitors_flow>=100and c.visitors_flow>=100and((a.id = b.id-1and b.id = c.id -1)or(a.id = b.id-1and a.id = c.id +1)or(a.id = b.id+1and b.id = c.id +1))orderby a.id;########## End ##########
第五关 统计总成绩
#请在此添加实现代码########## Begin ##########select t1.classname,t1.chinese,t2.maths
from(select c.classname classname,sum(s.chinese)
chinese from tb_class c,tb_score s where c.stuname=
s.name and s.chinese>=60groupby c.classname)t1,(select c.classname classname,sum(s.maths)maths from tb_class c,tb_score s
where c.stuname=s.name and s.maths>=60groupby c.classname)t2
where t1.classname=t2.classname;########## End ##########
复杂查询(二)
第一关 查询学生平均分
#请在此添加实现代码########## Begin ##########select b.s_id,b.s_name,ROUND(AVG(a.s_score),2)as avg_score from student b
innerjoin score a on b.s_id = a.s_id
GROUPBY b.s_id,b.s_name HAVING avg_score <60unionselect a.s_id,a.s_name,0as avg_score from student a
where a.s_id notin(selectdistinct s_id from score);########## End ##########
第二关 查询修课相同学生信息
#请在此添加实现代码########## Begin ##########createviewtempas(select s_id,group_concat(c_id)as c from score groupby s_id);select*from student where s_id in(select s_id fromtempwhere c=(select c fromtempwhere s_id="01")and s_id<>"01");########## End ##########
第三关 查询各科成绩并排序
#请在此添加实现代码########## Begin ##########select a.*,count(b.s_score)+1 rank from score a leftjoin score b
on a.c_id = b.c_id and a.s_score <b.s_score
groupby a.c_id,a.s_id
orderby a.c_id,count(b.s_score);########## End ##########
第四关 查询张老师课程成绩最高的学生信息
#请在此添加实现代码########## Begin ##########select a.*,b.s_score,b.c_id,c.c_name from student a
INNERJOIN score b ON a.s_id = b.s_id
INNERJOIN course c ON b.c_id = c.c_id
where b.c_id =(select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name="张三")and b.s_score in(selectMAX(s_score)from score where c_id="02");########## End ##########
第五关 查询两门课程不及格同学信息
#请在此添加实现代码########## Begin ##########select a.s_id,a.s_name,ROUND(AVG(b.s_score))
avg_score from student a
innerjoin score b on a.s_id = b.s_id
where a.s_id in(select s_id from score where s_score<60GROUPBY s_id havingcount(*)>=2)GROUPBY a.s_id,a.s_name;########## End ##########
使用聚合函数查询
第一关 COUNT( )函数
USE School;#请在此处添加实现代码########## Begin #################### 查询该表中一共有多少条数据 ##########selectcount(*)from tb_class;########## 查询此表中367班有多少位学生 ##########select classid,count(*)from tb_class where classid=367;########## End ##########
第二关 SUM( )函数
USE School;#请在此处添加实现代码########## Begin #################### 查询所有学生总分数 ##########selectsum(score)from tb_class;########## 查询学生语文科目的总分数 ##########select course,sum(score)from tb_class where course="语文";########## End ##########
第三关 AVG( )函数
USE School;#请在此处添加实现代码########## Begin #################### 查询学生语文科目的平均分数 ##########select course,avg(score)from tb_class where course="语文";########## 查询学生英语科目的平均分数 ##########select course,avg(score)from tb_class where course="英语";########## End ##########
第四关 MAX( )函数
USE School;#请在此处添加实现代码########## Begin #################### 查询语文课程中的最高分数 ##########select course,max(score)from tb_class where course="语文";########## 查询英语课程中的最高分数 ##########select course,max(score)from tb_class where course="英语";########## End ##########
第五关 MIN( )函数
USE School;#请在此处添加实现代码########## Begin #################### 查询语文课程中的最低分数 ##########select course,min(score)from tb_class where course="语文";########## 查询英语课程中的最低分数 ##########select course,min(score)from tb_class where course="英语";########## End ##########
其他函数的使用
第一关 字符函数
#请在此添加实现代码########## Begin ##########select CONCAT(UPPER(SUBSTR(Name,1,1)),LOWER(SUBSTR(Name,2,LENGTH(Name))))as Name from employee;########## End ##########
第二关 数学函数
#请在此添加实现代码########## Begin ##########update Score set s_score=TRUNCATE(s_score-(round(sqrt((power(4,4)-power(3,3))/power(2,2)),2)),2);########## End ##########
第三关 日期时间函数和流程控制类函数
#请在此添加实现代码########## Begin #################### 查询学生出生年份及年龄 ##########selectyear(s_birth)year,'2019-01-01'-s_birth '年龄'from Student;########## 查询课程的最高分、最低分、平均分和及格率 #########select c.c_id '课程id',
c_name '课程名',max(s_score)'最高分',min(s_score)'最低分',round(avg(s_score),2)'平均分',round((count(s_score >=60ornull)/count(s_score))*100,2)'及格率'from Score s,Course c
where s.c_id=c.c_id
groupby s.c_id;########## End ##########
USE School;#请在此处添加实现代码########## Begin ###########1.查询表中2,3,4年级中分别男女的总人数select gradeId,sex,count(*)from student where gradeId in(2,3,4)groupby gradeId,sex;########## End ##########
第二关 使用 HAVING 与 ORDER BY
USE School;#请在此处添加实现代码########## Begin ###########1.查询表中至少有两门课程在90分以上的学生信息select sno,count(*)from tb_grade
where score >=90groupby sno havingcount(pno)>=2;#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息select sno,avg(score)from tb_grade where sno
in(select sno from tb_grade where score >=95and pno ="语文")groupby sno havingavg(score)>=90;########## End ##########
视图
use School;#请在此处添加实现代码########## Begin ###########1.创建单表视图CREATEVIEW stu_view
ASselect math,chinese,math+chinese
FROM student;#2.创建多表视图CREATEVIEW stu_classes
ASselect student.stu_id,[student.name](http://student.name/),stu_info.classesFROM student,stu_info
WHERE student.stu_id=stu_info.stu_id;########## End ##########
索引
use School;#请在此处添加实现代码########## Begin ###########1.创建名为pk_student的主键索引createtable student(
stu_id intnotnull,
name varchar(25)notnull,
age intnotnull,
sex char(2)notnull,
classes intnotnull,
grade intnotnull,primarykey(stu_id));#2.创建名为idx_age的普通索引createindex idx_age on student(age);#3.创建名为uniq_classes的唯一索引createuniqueindex uniq_classes on student(classes);#4.创建名为idx_group的组合索引altertable student addindex idx_group(name,sex,grade);########## End ##########
分页和索引
第一关 MySQL 分页查询
USE Products;#请在此处添加实现代码########## Begin ###########1.分页查询select prod_id from products where prod_id >(select prod_id from products limit4,1)limit5;#2.用子查询优化分页查询语句select prod_id from products where prod_id >(select prod_id from products limit9,1)limit5;########## End ##########
第二关 索引(单列索引)
USE Students;#请在此处添加实现代码########## Begin ###########1.创建student表结构并且设置id为主键索引CREATETABLE student (
id int(11)NOTNULLAUTO_INCREMENT,
name varchar(20)NOTNULL,
score int(10),PRIMARYKEY(id));#2.对name建立唯一索引CREATEUNIQUEINDEX name_index ON`student`(`name`);#3.对score建立普通索引CREATEINDEX score_index ON`student`(`score`);SHOWINDEXFROM student;########## End ##########
第三关 索引(组合索引)
USE Person;#请在此处添加实现代码########## Begin ###########1.增加组合索引ALTERTABLE person ADDINDEX name_city_score (name,age,address);########## End ##########SHOWINDEXFROM person;
删除重复数据
第一关 利用主键删除
#请在此添加实现代码########## Begin ##########deletefrom users where id in(select*from(select id from users where user_name
in(select user_name from users groupby user_name havingcount(1)>1)and id notin(selectmin(id)from users groupby user_name havingcount(1)>1))as stu_repeat_copy
);########## End ##########
第二关 复杂重复数据删除
#请在此添加实现代码########## Begin ##########update users b join(select user_name,group_concat(distinct SUBSTRING_INDEX(SUBSTRING_INDEX(mobile,',',t.id),',',-1)) mobile from(select user_name,mobile,length(concat(mobile,','))-length(replace(mobile,',','')) size from users
) a innerjoin tb_sequence t on a.size>=t.id groupby a.user_name
) c on b.user_name = c.user_name set b.mobile = c.mobile;########## End ##########
查询、索引和完整性
第一关 基本查询的学习
//请在下面补齐查询一的MySQL语句/***begin***/select ename,eid,sex from emp
where did in(select did from dept
where dname='cwb')/***end***/and
birth<=all(select birth from emp
where did in(select did from dept
where dname='yfb'));//请在下面输入查询二的MySQL语句/***begin***/select ename,income,outcome
from emp,sal,dept
where emp.eid=sal.eid and
emp.did=dept.did and
dname='cwb'and income>5200;/***end***/
第二关 深入学习查询语句
//请在下面输入查询一的MySQL语句/***begin***/selectcount(eid)from emp
where did=(select did
from dept
where dname='cwb');/***end***///请在下面输入查询二的MySQL语句/***begin***/selectcount(eid)from emp
groupby did;/***end***///请在下面输入查询三的MySQL语句/***begin***/select emp.ename
from emp,sal
where emp.eid=sal.eid
orderby income;/***end***//***end***/
第三关 视图的创建和使用
//请在下面输入创建cx_sal的视图的MySQL语句/***begin***/createorreplaceview cx_sal
asselect ename,income,outcome
from emp,sal,dept
where emp.eid=sal.eid and
emp.did=dept.did and
dname='cwb';/***end***///请在下面输入查询财务部雇员薪水情况视图的MySQL语句/***begin***/select*from cx_sal;/***end***/
USE mydb;#请在此处添加实现代码########## Begin ##########dropprocedureifexists mydb.GetCustomerLevel;delimiter $$
createPROCEDURE GetCustomerLevel(in p_customNumber int(11),out p_customerLevel varchar(10))Begindeclare levels int;select creditlimit into levels from customers where customerNumber=p_customNumber;if levels <5000thenset p_customerLevel ='SILVER';elseif levels <10000thenset p_customerLevel ='GOLD';elseset p_customerLevel ='PLATINUM';endif;select p_customNumber as customerNumber,p_customerLevel;End $$
delimiter;########## End ##########
安全性控制
第一关 用户和权限
请填写语句,完成以下功能:
#(1) 创建用户tom和jerry,初始密码均为'123456';createuser tom identified by'123456';createuser jerry identified by'123456';#(2) 授予用户tom查询客户的姓名,邮箱和电话的权限,且tom可转授权限;grantselect(c_name,c_mail,c_phone)on client to tom withgrantoption;#(3) 授予用户jerry修改银行卡余额的权限;grantupdate(b_balance)on bank_card to jerry;#(4) 收回用户Cindy查询银行卡信息的权限。revokeselecton bank_card from Cindy;
第二关 用户、角色与权限
请填写语句,完成以下功能:
(1) 创建角色client_manager和fund_manager;
create role client_manager,fund_manager;(2) 授予client_manager对client表拥有select,insert,update的权限;
grantselect,insert,updateon client to client_manager;(3) 授予client_manager对bank_card表拥有查询除银行卡余额外的select权限;
grantselect(b_number,b_type,b_c_id)on bank_card to client_manager;(4) 授予fund_manager对fund表的select,insert,update权限;
grantselect,insert,updateon fund to fund_manager;(5) 将client_manager的权限授予用户tom和jerry;
grant client_manager to tom,jerry;(6) 将fund_manager权限授予用户Cindy.grant fund_manager to Cindy;
授权与撤销授权
第一关 数据库授权
########## 开始编写 SQL ##########set password for casual_user@'localhost'= password('123456');-- grant SELECT,INSERT,UPDATE on . to casual_user@'localhost' identified by "123456";grantSELECT,INSERT,UPDATEon*.*to casual_user@'localhost';
FLUSH PRIVILEGES;