第二部分MySQL数据库

Posted Aiden Yun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二部分MySQL数据库相关的知识,希望对你有一定的参考价值。

数据库初识:

数据

数据:描述事物的计算机所识别的符号记录

 

数据库

 

 

常见的数据库应用场景:

 

 

什么是DBMS?

 

 

常用数据库排名

 

mysql简介:

 

 MySQL最受欢迎的的可视化工具-------Navicat

 

 

 

 

Navicat的基本使用

连接数据库

 

 

 

 

 

 

 

 

 

 

新建数据库

 

 

 

 

 

 

 

 

 

MySQL基本命令

SQL分类

 

 

 

 

 

命令行操作数据库

登陆数据库

mysql  -uroot -p

 

 

 

 

查看当前所有数据库

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

 


日期格式化参数: