学习python 第二十三天

关系数据库
数据持久化 - 将数据保存到(在掉电情况下)能够长久保存数据的存储介质中。

关系数据库:

1.Oracle
2.DB2
3.SQL Server
4.MySQL
5.PostgreSQL

MySQL简介
安装和配置(以CentOS Linux环境为例)。

下面以MySQL 5.7.26版本和Red Hat Enterprise Linux为例,直接下载包含所有安装文件的归档文件,解归档之后通过包管理工具进行安装。

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

yum list installed | grep mariadb | awk ‘{print $1}’ | xargs yum erase -y
接下来可以按照如下所示的顺序用RPM(Redhat Package Manager)工具安装MySQL。

rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
可以使用下面的命令查看已经安装的MySQL相关的包。

rpm -qa | grep mysql
启动MySQL服务。

可以使用下面的命令来启动MySQL。

service mysqld start
在CentOS 7中,更推荐使用下面的命令来启动MySQL。

systemctl start mysqld
启动MySQL成功后,可以通过下面的命令来检查网络端口使用情况,MySQL默认使用3306端口。

netstat -nap | grep mysql
也可以使用下面的命令查找是否有名为mysqld的进程。

pgrep mysqld
使用MySQL客户端工具连接服务器。

命令行工具:

mysql -u root -p
说明:启动客户端时,-u参数用来指定用户名,MySQL默认的超级管理账号为root;-p表示要输入密码(用户口令);如果连接的是其他主机而非本机,可以用-h来指定连接主机的主机名或IP地址。

如果是首次安装MySQL,可以使用下面的命令来找到默认的初始密码。

cat /var/log/mysqld.log | grep password
上面的命令会查看MySQL的日志带有password的行,在显示的结果中root@localhost:后面的部分就是默认设置的初始密码。

修改超级管理员(root)的访问口令为123456。

set global validate_password_policy=0;
set global validate_password_length=6;
alter user ‘root’@‘localhost’ identified by ‘123456’;
说明:MySQL默认不允许使用弱口令作为用户口令,所以我们通过上面的前两条命令修改了验证用户口令的策略和口令的长度。(最好的做法是将数据库置于内网,至少要做到不向公网开放数据库服务器的访问端口)

查看服务器版本。

select version();
查看所有数据库。

show databases;
切换到指定数据库。

use mysql;
查看数据库下所有表。

show tables;
获取帮助。

? contents;
? functions;
? numeric functions;
? round;

? data types;
? longblob;
SQL详解
DDL

– 如果存在名为school的数据库就删除它
drop database if exists school;

– 创建名为school的数据库并设置默认的字符集和排序方式
create database school default charset utf8 collate utf8_bin;

– 切换到school数据库上下文环境
use school;

– 创建学院表
create table tb_college
(
collid int auto_increment comment ‘编号’,
collname varchar(50) not null comment ‘名称’,
collmaster varchar(20) not null comment ‘院长’,
primary key (collid)
);

– 创建学生表
create table tb_student
(
stuid int not null comment ‘学号’,
stuname varchar(20) not null comment ‘姓名’,
stusex boolean default 1 comment ‘性别’,
stubirth date not null comment ‘出生日期’,
stuaddr varchar(255) default ‘’ comment ‘籍贯’,
collid int not null comment ‘所属学院’,
primary key (stuid),
foreign key (collid) references tb_college (collid)
);

– 创建教师表
create table tb_teacher
(
teaid int not null comment ‘工号’,
teaname varchar(20) not null comment ‘姓名’,
teatitle varchar(10) default ‘助教’ comment ‘职称’,
collid int not null comment ‘所属学院’,
primary key (teaid),
foreign key (collid) references tb_college (collid)
);

– 创建课程表
create table tb_course
(
couid int not null comment ‘编号’,
couname varchar(50) not null comment ‘名称’,
coucredit int not null comment ‘学分’,
teaid int not null comment ‘授课老师’,
primary key (couid),
foreign key (teaid) references tb_teacher (teaid)
);

– 创建选课记录表
create table tb_record
(
recid int auto_increment comment ‘选课记录编号’,
sid int not null comment ‘选课学生’,
cid int not null comment ‘所选课程’,
seldate datetime default now() comment ‘选课时间日期’,
score decimal(4,1) comment ‘考试成绩’,
primary key (recid),
foreign key (sid) references tb_student (stuid),
foreign key (cid) references tb_course (couid),
unique (sid, cid)
);
DML

– 插入学院数据
insert into tb_college (collname, collmaster) values
(‘计算机学院’, ‘左冷禅’),
(‘外国语学院’, ‘岳不群’),
(‘经济管理学院’, ‘风清扬’);

– 插入学生数据
insert into tb_student (stuid, stuname, stusex, stubirth, stuaddr, collid) values
(1001, ‘杨逍’, 1, ‘1990-3-4’, ‘四川成都’, 1),
(1002, ‘任我行’, 1, ‘1992-2-2’, ‘湖南长沙’, 1),
(1033, ‘王语嫣’, 0, ‘1989-12-3’, ‘四川成都’, 1),
(1572, ‘岳不群’, 1, ‘1993-7-19’, ‘陕西咸阳’, 1),
(1378, ‘纪嫣然’, 0, ‘1995-8-12’, ‘四川绵阳’, 1),
(1954, ‘林平之’, 1, ‘1994-9-20’, ‘福建莆田’, 1),
(2035, ‘东方不败’, 1, ‘1988-6-30’, null, 2),
(3011, ‘林震南’, 1, ‘1985-12-12’, ‘福建莆田’, 3),
(3755, ‘项少龙’, 1, ‘1993-1-25’, null, 3),
(3923, ‘杨不悔’, 0, ‘1985-4-17’, ‘四川成都’, 3),
(4040, ‘隔壁老王’, 1, ‘1989-1-1’, ‘四川成都’, 2);

– 删除学生数据
delete from tb_student where stuid=4040;

– 更新学生数据
update tb_student set stuname=‘杨过’, stuaddr=‘湖南长沙’ where stuid=1001;

– 插入老师数据
insert into tb_teacher (teaid, teaname, teatitle, collid) values
(1122, ‘张三丰’, ‘教授’, 1),
(1133, ‘宋远桥’, ‘副教授’, 1),
(1144, ‘杨逍’, ‘副教授’, 1),
(2255, ‘范遥’, ‘副教授’, 2),
(3366, ‘韦一笑’, ‘讲师’, 3);

– 插入课程数据
insert into tb_course (couid, couname, coucredit, teaid) values
(1111, ‘Python程序设计’, 3, 1122),
(2222, ‘Web前端开发’, 2, 1122),
(3333, ‘操作系统’, 4, 1122),
(4444, ‘计算机网络’, 2, 1133),
(5555, ‘编译原理’, 4, 1144),
(6666, ‘算法和数据结构’, 3, 1144),
(7777, ‘经贸法语’, 3, 2255),
(8888, ‘成本会计’, 2, 3366),
(9999, ‘审计学’, 3, 3366);

– 插入选课数据
insert into tb_record (sid, cid, seldate, score) values
(1001, 1111, ‘2017-09-01’, 95),
(1001, 2222, ‘2017-09-01’, 87.5),
(1001, 3333, ‘2017-09-01’, 100),
(1001, 4444, ‘2018-09-03’, null),
(1001, 6666, ‘2017-09-02’, 100),
(1002, 1111, ‘2017-09-03’, 65),
(1002, 5555, ‘2017-09-01’, 42),
(1033, 1111, ‘2017-09-03’, 92.5),
(1033, 4444, ‘2017-09-01’, 78),
(1033, 5555, ‘2017-09-01’, 82.5),
(1572, 1111, ‘2017-09-02’, 78),
(1378, 1111, ‘2017-09-05’, 82),
(1378, 7777, ‘2017-09-02’, 65.5),
(2035, 7777, ‘2018-09-03’, 88),
(2035, 9999, default, null),
(3755, 1111, default, null),
(3755, 8888, default, null),
(3755, 9999, ‘2017-09-01’, 92);

sql批量插入

– 查询所有学生信息
select * from tb_student;

– 查询所有课程名称及学分(投影和别名)
select couname, coucredit from tb_course;
select couname as 课程名称, coucredit as 学分 from tb_course;

– 查询所有学生的姓名和性别(条件运算)
select stuname as 姓名, case stusex when 1 then ‘男’ else ‘女’ end as 性别 from tb_student;
select stuname as 姓名, if(stusex, ‘男’, ‘女’) as 性别 from tb_student;

– 查询所有女学生的姓名和出生日期(筛选)
select stuname, stubirth from tb_student where stusex=0;

– 查询所有80后学生的姓名、性别和出生日期(筛选)
select stuname, stusex, stubirth from tb_student where stubirth>=‘1980-1-1’ and stubirth<=‘1989-12-31’;
select stuname, stusex, stubirth from tb_student where stubirth between ‘1980-1-1’ and ‘1989-12-31’;

– 查询姓"杨"的学生姓名和性别(模糊)
select stuname, stusex from tb_student where stuname like ‘杨%’;

– 查询姓"杨"名字两个字的学生姓名和性别(模糊)
select stuname, stusex from tb_student where stuname like ‘杨_’;

– 查询姓"杨"名字三个字的学生姓名和性别(模糊)
select stuname, stusex from tb_student where stuname like ‘杨__’;

_用来占位 两个_代表占两个 一个_代表一个

– 查询名字中有"不"字或"嫣"字的学生的姓名(模糊)
select stuname, stusex from tb_student where stuname like ‘%不%’ or stuname like ‘%嫣%’;

– 查询没有录入家庭住址的学生姓名(空值)
select stuname from tb_student where stuaddr is null;

is null 代表某个字段为空

– 查询录入了家庭住址的学生姓名(空值)
select stuname from tb_student where stuaddr is not null;

– 查询学生选课的所有日期(去重)
select distinct seldate from tb_record;

distinct 代表seldate进行去重展示 与group by seldate 含义类似但有不同

– 查询学生的家庭住址(去重)
select distinct stuaddr from tb_student where stuaddr is not null;

– 查询男学生的姓名和生日按年龄从大到小排列(排序)
select stuname as 姓名, datediff(curdate(), stubirth) div 365 as 年龄 from tb_student where stusex=1 order by 年龄 desc;

SELECT DATEDIFF(day,‘2008-12-30’,‘2008-12-29’) AS DiffDate
返回第三个个参数减第二个参数的差 1

– 查询年龄最大的学生的出生日期(聚合函数)
select min(stubirth) from tb_student;

– 查询年龄最小的学生的出生日期(聚合函数)
select max(stubirth) from tb_student;

– 查询男女学生的人数(分组和聚合函数)
select stusex, count(1) from tb_student group by stusex;

– 查询课程编号为1111的课程的平均成绩(筛选和聚合函数)
select avg(score) from tb_record where cid=1111;

avg平均值

– 查询学号为1001的学生所有课程的平均分(筛选和聚合函数)
select avg(score) from tb_record where sid=1001;

– 查询每个学生的学号和平均成绩(分组和聚合函数)
select sid as 学号, avg(score) as 平均分 from tb_record group by sid;

– 查询平均成绩大于等于90分的学生的学号和平均成绩
– 分组以前的筛选使用where子句 / 分组以后的筛选使用having子句
select sid as 学号, avg(score) as 平均分 from tb_record group by sid having 平均分>=90;

例子
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。

HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore

FROM student

GROUP BY id

HAVING AVG(score)>=80;

在这里,如果用WHERE代替HAVING就会出错

– 查询年龄最大的学生的姓名(子查询/嵌套的查询)
select stuname from tb_student where stubirth=( select min(stubirth) from tb_student );

– 查询年龄最大的学生姓名和年龄(子查询+运算)
select stuname as 姓名, datediff(curdate(), stubirth) div 365 as 年龄 from tb_student where stubirth=( select min(stubirth) from tb_student );

– 查询选了两门以上的课程的学生姓名(子查询/分组条件/集合运算)
select stuname from tb_student where stuid in ( select stuid from tb_record group by stuid having count(stuid)>2 );

– 查询学生姓名、课程名称以及成绩(连接查询)
select stuname, couname, score from tb_student t1, tb_course t2, tb_record t3 where stuid=sid and couid=cid and score is not null;

– 查询学生姓名、课程名称以及成绩按成绩从高到低查询第11-15条记录(内连接+分页)
select stuname, couname, score from tb_student inner join tb_record on stuid=sid inner join tb_course on couid=cid where score is not null order by score desc limit 5 offset 10;

select stuname, couname, score from tb_student inner join tb_record on stuid=sid inner join tb_course on couid=cid where score is not null order by score desc limit 10, 5;

– 查询选课学生的姓名和平均成绩(子查询和连接查询)
select stuname, avgmark from tb_student, ( select sid, avg(score) as avgmark from tb_record group by sid ) temp where stuid=sid;

select stuname, avgmark from tb_student inner join ( select sid, avg(score) as avgmark from tb_record group by sid ) temp on stuid=sid;

– 查询每个学生的姓名和选课数量(左外连接和子查询)
select stuname, ifnull(total, 0) from tb_student left outer join ( select sid, count(sid) as total from tb_record group by sid ) temp on stuid=sid;
DCL

– 创建名为hellokitty的用户
create user ‘hellokitty’@’%’ identified by ‘123123’;

– 将对school数据库所有对象的所有操作权限授予hellokitty
grant all privileges on school.* to ‘hellokitty’@’%’;

– 召回hellokitty对school数据库所有对象的insert/delete/update权限
revoke insert, delete, update on school.* from ‘hellokitty’@’%’;
相关知识
三大范式
第一范式:数据表的每个列的值域都是由原子值组成的,不能够再分割。
第二范式:数据表里的所有数据都要和该数据表的键(主键与候选键)有完全依赖关系。
第三范式:所有非键属性都只和候选键有相关性,也就是说非键属性之间应该是独立无关的。
数据完整性
实体完整性 - 每个实体都是独一无二的
主键(primary key) / 唯一约束 / 唯一索引(unique)
外键(foreign key)

数据类型及长度
非空约束(not null)
默认值约束(default)

事务:一系列对数据库进行读/写的操作。

原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态
隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中

MySQL中的事务操作

开启事务环境

start transaction
提交事务

commit
回滚事务

rollback

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mr.杰瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值