第二部分MySQL数据库
Posted Aiden Yun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二部分MySQL数据库相关的知识,希望对你有一定的参考价值。
数据库初识:
数据
数据:描述事物的计算机所识别的符号记录
数据库
常见的数据库应用场景:
什么是DBMS?
常用数据库排名
mysql简介:
MySQL最受欢迎的的可视化工具-------Navicat
Navicat的基本使用
连接数据库
新建数据库
MySQL基本命令
SQL分类
命令行操作数据库
登陆数据库
查看当前所有数据库
show databases;
创建数据库
create database Test;
切换数据库
use test_01;
查看数据表
show tables;
创建数据表
数据表创建规范
查看数据表的表结构
desc userinfo;
数据类型
数值类型
字符串类型
日期和时间类型
空值类型
数据字段属性
UNSIGNED、ZEROFILL、AUTO_INCREMENT
NULL、NOT NULL、DEFAULT
表数据的注释
实战小练1
Result:
实战小练2
Result
CREATE table student( StudentNo int(4) not null PRIMARY KEY COMMENT "学号", LoginPwd varchar(20) not null COMMENT "登录密码", StudentName VARCHAR(20) not null COMMENT "学员姓名", Sex int(4) not null COMMENT "性别", GradeID INT(11) not NULL COMMENT "年级编号", Phone VARCHAR(50) NULL COMMENT "联系电话", Address VARCHAR(50) null DEFAULT "地址不详" COMMENT "地址", BornDate datetime not null COMMENT "出生日期", Email varchar(50) null COMMENT "邮箱", IdentityCard VARCHAR(18) NOT NULL COMMENT "身份证号" );
修改数据表
实战演练:
修改数据表名
添加数据表字段
修改数据表字段
删除数据表
备份数据库
数据库数据管理
添加数据-INSERT
实战小练
表间复制
WHERE条件子句
修改数据-UPDATE
实战小练
删除数据-DELETE
实战小练
清空表数据-TRUNCATE
DQL-数据查询
查询数据-select
AS子句
查询场景
实战小练
数据表
Result:
DISTINCT关键字-去重
where条件语句
NULL空值条件查询
BETWEEN AND范围查询
使用IN进行范围查询
LIKE模糊查询
连表查询
原数据
业务需求:
查询名字中有江的出版社,都出了哪些书?
普通等值连接写法
完整版
简写版
连接查询
内连接查询-inner join
上面的需求:查询名字中有江的出版社,都出了哪些书?用inner join 实现
外连接查询
实战小练
原数据:
左连接表查询
右连接表查询
ORDER BY排序
LIMIT分页
实战小练
MySQL的聚合函数(统计函数)
实战小练
GROUP BY分组
实战小练
原数据
Result
对于书籍出版社平均id值低于10的不显示?
注意:
分组后,对聚合函数的结果进行二次过滤时,要加在 having关键字后面,不能放在where语句中
MySQL子查询
实战小练:
原数据
业务需求:
查询曲江出版社出了哪些书?
Result
MySQL案例实战
案例实战1
原数据
学生表:student(编号sid,姓名sname,年龄age,性别sex)
课程表:course(课程编号cid,课程名称cname,教师编号tid)
教师表:teacher(教师编号tid,姓名tname)
成绩表:sc(学生编号sid,课程编号cid,成绩score)
业务需求
1. 查询平均成绩大于60分的同学的学号和平均成绩
2. 查询所有同学的学号、姓名、选课数、总成绩
3. 查询姓“李”的老师的个数
4. 查询学过“李纯”老师课的同学的学号、姓名
5. 查询没学过“李雷”老师课的同学的学号、姓名
6. 查询“001”课程比“002”课程成绩高的所有学生的学号、姓名
7. 查询学过“001”并且也学过编号“003”课程的同学的学号、姓名
8. 查询各科成绩最高分和最低分:以如下形式显示:课程ID,课程名,最高分,最低分
9. 查询没有学全所有课的同学的学号、姓名
10. 查询学过“李雷”老师所教的所有课的同学的学号、姓名
11. 查询至少学过学号为“1001”同学所学的一门课的其他同学学号和姓名
12. 按各科平均成绩从低到高和及格率的百分数从高到低顺序排序
13. 删除学习“李纯”老师课的SC表记录
Result:
查询平均成绩大于60分的同学的学号和平均成绩?
查询所有同学的学号、姓名、选课数、总成绩
查询姓“李”的老师的个数
查询学过“李纯”老师课的同学的学号、姓名
第一种方法:
第二种方法:
select sc.sid \'学号\',sname \'姓名\' from sc inner join student st on sc.sid=st.sid inner join course on sc.cid=course.cid inner join teacher on course.tid=teacher.tid where tname="李纯";
查询没学过“李雷”老师课的同学的学号
方法1
方法2
查询“001”课程比“002”课程成绩高的所有学生的学号、姓名
查询学过“001”并且也学过编号“003”课程的同学的学号、姓名
查询各科成绩最高分和最低分:以如下形式显示:课程ID,课程名,最高分,最低分
select sc.cid,cname,max(score),min(score) from course inner join sc on course.cid=sc.cid GROUP BY sc.cid;
查询没有学全所有课的同学的学号、姓名?
select sc.sid,sname,count(*) "选课数" from student inner join sc on student.sid=sc.sid GROUP BY sc.sid HAVING 选课数 <(select count(*) from course);
查询学过“李雷”老师所教的所有课的同学的学号、姓名
查询至少学过学号为“1001”同学所学的一门课的其他同学学号和姓名
方法1
方法2
按各科平均成绩从低到高和及格率的百分数从高到低顺序排序
删除学习“李纯”老师课的SC表记录
查询不同课程成绩相同的学生的学号、课程号、学生成绩
自联表的应用
select DISTINCT a.sid,a.cid,a.score from sc a inner join sc b on a.score=b.score where a.cid<>b.cid and a.score=b.score ORDER BY a.score asc;
统计各科成绩的各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
case when分支判断的应用
select sc.cid "课程ID", cname "课程名称", sum(case when score BETWEEN 85 and 100 then 1 else 0 end) "[100-85]", sum(case when score BETWEEN 70 and 85 then 1 else 0 end) "[70-85]", sum(case when score BETWEEN 60 and 70 then 1 else 0 end) "[60-70]", sum(case when score BETWEEN 0 and 60 then 1 else 0 end) "[<60]" from sc inner join course on sc.cid=course.cid GROUP BY sc.cid;
查询所有学生的选课情况,显示学生姓名和选修的课程名?
提示:组内拼接函数 group_concat(要拼接的字段名)
select sname,GROUP_CONCAT(cname) from student s inner join sc on s.sid=sc.sid inner join course c on sc.cid=c.cid GROUP BY sc.sid;
把sc表中胡悦悦老师教的课的成绩都改为此课程的平均成绩
UPDATE sc inner join (select sc.cid sc_cid,avg(score) sc_avg from sc inner join course on sc.cid=course.cid INNER JOIN teacher
on course.tid=teacher.tid where tname="胡悦悦") a on a.sc_cid=sc.cid set score=a.sc_avg;
注意:
对同一张表查看的时候更新会引起数据不一致,将查询结果放在派生表中就可避免。
MySQL视图
数据库视图的含义
视图的作用
创建视图的语法
实战小练:
原数据:
需求:为讲师创建只能查看课程id为4的课程成绩和学生姓名?
查看视图
修改视图
更新视图
删除视图
MySQL的事务
事务的含义
事务的ACID原则
MySQL事务的实现方法
MySQL事务处理步骤
事务小练
MySQL触发器
触发器的定义
触发器使用场景
触发器语法
触发器实战
业务需求:
监控student表,student表新增一个学生stu_count表中的count字段就加1?
Result:
===========================================================触发器============================================= # 创建stu_count表 create table stu_count( count INT(4) null DEFAULT 0, modif_data datetime ); # 向stu_count表中插入初始数据 insert into stu_count VALUES(1,now()); # 创建触发器 create TRIGGER count_stu after insert on student for each row begin update stu_count set count=count+1,modif_data=now(); end; 测试触发器 insert into student values(1010,"鲁班",19,"男");
删除触发器 drop trigger count_stu;
删除触发器
触发器必知
MySQL日期函数
返回当前的日期和时间
select now();
返回当前的日期
select curdate();
添加时间隔离
date_add(date,INTERVAL expr unit)
返回5年后的今天
select DATE_ADD(curdate(),INTERVAL 5 year);
返回5年前的今天
select DATE_ADD(curdate(),INTERVAL -5 year);
返回5周后的今天
select DATE_ADD(curdate(),INTERVAL 5 week);
获取当月的最后一天
select LAST_DAY(DATE_ADD(curdate(),INTERVAL -1 month)) ;
获取当月第一天
select DATE_ADD(curdate(), interval -day(curdate())+1 day);
select DATE_ADD(LAST_DAY(DATE_ADD(curdate(),INTERVAL -1 month)),INTERVAL 1 day);
日期格式化函数
date_format(date,format)
select DATE_FORMAT(curdate(),\'%Y-%m-%D\');
日期格式化参数:
Y完整年 y取后两位年
M英语月份 m数字型月份
D英语日 d数以上是关于第二部分MySQL数据库的主要内容,如果未能解决你的问题,请参考以下文章