目录数据库1.数据库的概述2.sql语言3.数据库的基础命令4.数据库基础的增删改查命令5.数据库引擎6.数据库的建表约束1.非空约束 NK not null2.唯一约束 UK3.主键约束 PK primary key4.外键约束FK foreign key5.检查约束7.数据库中的各种查询机制1.简单查询2.限定查询3.分组查询4.统计查询5.排序查询6.多表查询7.连接查询8.分页查询9.子查询难8.数据库的事务处理1.案例2.为什么需要事务3.事务的四大特性4.事务的隔离级别1.理解脏读、不可重复读、幻读2.事务的隔离级别测试9.pymysql连接pycharm1.pymysq连接执行简单查询​2.pymysql执行带参数查询数据库1.数据库的概述关系型数据库Mysql 3306、 Oracle1521关系型数据库是一种基于关系模型的数据库其数据以表格的形式存储表与表之间可以建立关系。关系型数据库最典型的数据结构是表由二维表及其之间的联系所组成的一个数据组织。非关系型数据库 Redis端口号6379 、 MongoDB27017非关系型数据库又称NoSQLNot Only SQL是一种数据结构化存储方法的集合可以是文档、键值对等形式。它不是单一的数据库类型而是一种数据存储解决方案的集合2.sql语言数据查询DQL, Data Query Language主要通过 SELECT 语句实现用于从数据库中检索所需数据是 SQL 的核心功能。例如SELECT name, age FROM student WHERE age20 ORDER BY age;数据操纵DML, Data Manipulation Language包括 INSERT、UPDATE、DELETE 等语句用于增加、修改或删除已有数据。例如INSERT INTO student (id, name, age) VALUES (1001, Tom, 22);UPDATE student SET age 23 WHERE id 1001;DELETE FROM student WHERE id 1001;数据定义DDL, Data Definition Language包括 CREATE、ALTER、DROP 等语句用于定义和修改数据库、表、索引、视图等结构。例如CREATE TABLE student (id INT PRIMARY KEY,name VARCHAR(50),age INT);数据控制DCL, Data Control Language包括 GRANT、REVOKE 等语句用于权限控制和访问管理同时事务语句如 COMMIT、ROLLBACK 保证一致性和安全性。例如GRANT SELECT ON student TO user1;COMMIT;ROLLBACK;3.数据库的基础命令验证是否成功安装mysql -u root -p查看所有数据库 show databases;使用数据库 use 数据库名称创建数据库 create database 数据库名;查看数据库详细信息 show create database 数据库名称;删除数据库 drop database 数据库名称;查看所有表格show tables;创建表格 create table 表格名字段 类型 长度));删除表格 drop table 表格名称修改表格追加字段 alter table t_useraddcolumn age int(3);修改字段名称 alter table t_userchangeusername name varchar(20);字段删除alter table t_userdropcolumnage;查看表结构 desc t_user;4.数据库基础的增删改查命令增加insert into t_user values(1,zs,123456);insert into t_username,password )value(1,zs,123456);删除 delete from t_userwhere id 1;修改 update t_user set name rht,password 456789 where id 2;查询 select * from t_user;5.数据库引擎InnoDB‌MySQL 5.5 版本后的默认引擎支持事务处理、行级锁和外键适用于高并发和需要数据一致性的场景 。‌‌3‌MyISAM‌早期默认引擎强调快速读取操作不支持事务和行级锁适合读多写少的应用6.数据库的建表约束1.非空约束 NK not null2.唯一约束 UK3.主键约束 PK primary key效果上等同于 非空约束唯一约束或者 满足id自增且 设置id为主键注意主键注意事项一主键的类型问题一般情况下将id中作为主键来设置每一张表都建议至少一个主键当主键为int类型一般设置该主键为自动递增模式方式一mysql支持自动递增所以在设置主键过程中可以追加自动递增AUTO_INCREMENT方式二当数据库不支持数据自动递增如 oracle要么采用各自数据库的技术要么使用终极版通过python程序控制id id1当主键为varchar类型无法使用自动递增策略方式一通过python程序来生成不重复的固定格式的idid0 id 拼接 xszx001·方式二通过第三方算法来支持雪花算法 或UUID模块主键注意事项二联合主键当需要两个或两个以上字段同时成为主键4.外键约束FK foreign key一对多多对多需要使用中间表create table t_student(sid int(10) auto_increment,sname varchar(20),project varchar(20),constraint pk_id primary key(sid));create table t_teacher(tid int(10) auto_increment,tname varchar(20),tnumber varchar(20) ,constraint pk_id primary key(tid));create table t_student_teacher(id int(10) auto_increment,sid int(10),tid int(10),constraint pk_id primary key(id),constraint fk_sid foreign key(sid) references t_student(sid),constraint fk_tid foreign key(tid) references t_teacher(tid));外键级联操作当删除一方的时候默认会报错属于正常状况有两种特殊处理方式方式一级联删除 on delete cascade(不建议使用把数据删了对数据不友好)create table t_group(id int(10) auto_increment,gname varchar(20),constraint pk_id primary key(id));create table t_person(id int(10) auto_increment,usernamae varchar(20),password varchar(20) ,gid int(10),constraint pk_id primary key(id),constraint fk_gid foreign key(gid) references t_group(id)on delete cascade);方式二级联为空 on delete set nullcreate table t_person(id int(10) auto_increment,username varchar(20),password varchar(20) ,gid int(10),constraint pk_id primary key(id),constraint fk_gid foreign key(gid) references t_group(id)on delete set null);执行 delete from t_group where id 15.检查约束create table t_student(id int(10) auto_increment,sname varchar(20),age int(3) ,constraint pk_id primary key(id),constraint ck_age check (age18 and age 60));注意1.检查约束在mysql8.0之前不生效在8.0之后可以使用检查约束2.一般检查约束在数据库中不建议使用 建议通过程序来控制7.数据库中的各种查询机制1.简单查询#查询所有员工信息select * from emp;#查询员工的姓名职位薪资select EName,JOB,SAL from emp;#查询员工的姓名职位薪资(起别名)select EName 姓名,JOB 职位,SAL 薪资 from emp;#查询公司中的所有职位(去重)select distinct job from emp;2.限定查询select 字段 from 表名 限定条件限定条件 where ! between.....and orand in is like#查询所有员工信息select * from emp;#查询员工的姓名职位薪资select EName,JOB,SAL from emp;#查询员工的姓名职位薪资(起别名)select EName 姓名,JOB 职位,SAL 薪资 from emp;#查询公司中的所有职位(去重)select distinct job from emp;#查询薪资高于2000的员工信息select * from emp where sal 2000;#查询薪资介于2000到5000之间的员工信息select * from emp where sal between 2000 and 5000;select * from emp where sal 2000 and sal5000;#查询没有奖金的员工信息select * from emp where comm is NULL or comm 0;#查询名字中包含s的select * from emp where ename like %s%;#查询名字中以s结尾的select * from emp where ename like %s;#查询名字中以s开头的select * from emp where ename like s%;#查询名字中m为第二位的select * from emp where ename like _m%;#查询在1981年入职的员工信息select * from emp where hiredate like %1981%;#查询员工编号在7499 7521 7566的信息select * from emp where empno in(7499,7521,7566);3.分组查询select 字段 from 表名 [限定条件] [分组条件][排序条件]分组关键字group by 分组字段分组之后要统计的注意1.在分组查询之后还需要做条件查询的时候要用having不能用where2.一旦出现分组查询select关键字后边只允许出现 分组字段与统计函数#查询公司中的所有职位,并统计各个职位的员工数量select job 职位,count(empno) 人数 from emp group by job;#查询每个职位的总薪资平均薪资,显示平均工资2000的信息select job,count(empno),sum(sal),avg(sal) from emp group by job having avg(sal)2000;4.统计查询统计数量 count()统计最大值 max()统计最小值 min()统计平均值 avg()求和 sum()5.排序查询select 字段 from 表名 [限定条件] [排序条件]排序关键字order by 排序字段升序asc降序desc#按照薪资由高到低,如果薪资相同按照入职日期由低到高进行排序select * from emp order by sal desc,hiredate asc;6.多表查询#查询员工信息和部门信息select* from emp,dept;简单地把两张表堆积在一块出现大量冗余数据叫做笛卡尔效应#查询员工编号员工姓名员工工资领导编号领导姓名领导工资#把一张emp表 看成一张员工表 一张领导表 通过领导编号进行连接select e1.empno 员工编号,e1.ename 员工姓名,e1.sal 员工工资,e2.empno 领导编号,e2.ename 领导姓名,e2.sal 领导工资 from emp e1,emp e2 where e1.mgr e2.empno;出现边界值丢失问题大领导的信息无法显示因此利用连接查询7.连接查询select 字段 from 表名 [连接条件][限定条件][排序条件]左外连接 left join.....on 左表为主表右外连接 right join...on 右表为主表#查询员工编号员工姓名员工工资领导编号领导姓名领导工资e1员工表 e2领导表select e1.empno 员工编号,e1.ename 员工姓名,e1.sal 员工工资,e2.empno 领导编号,e2.ename 领导姓名,e2.sal 领导工资 from emp e1left joinemp e2one1.mgr e2.empno;补充交叉连接 join select * from emp join dept;自然连接 natural join select * from emp natural join dept; (8.0之后不推荐使用)join...on select * from emp join dept on emp.deptno dept.deptno;join...using(字段) select * from emp join dept using(deptno);8.分页查询select 字段 from 表名 limit 起始索引每页显示的条数分页关键字limit nmn 数据下标索引 当n为0时 可以省略m每页显示的条数注意起始索引 查询页码-1* 每页记录数#查询第二页员工数据每页展示10条记录select * from emp limit 10,10;9.子查询难where子查询情况一当第一步查询为单行单列的时候#查询公司中薪资比smith高的员工信息select * from emp where sal (select sal from emp where ename smith);情况二当第一步查询结果为多行单列时查询公司中员工工资与经理的薪资一致的信息第一步查询所有经理的工资select sal from emp where job manager第二步比较全体员工薪资select * from emp where sal in (select sal from emp where job manager);from子查询当查询结果为多行多列时查询部门的详细信息部门编号、名称、位置、人数、平均薪资步骤一 通过员工表查询部门编号部门人数和平均薪资select deptno, count(empno) num,avg(sal) avgsal from emp group by deptno;步骤二通过部门表查询部门编号名称位置步骤三结合select d.deptno,d.LOC,d.dname,temp.num,temp.avgsal from dept d,(select deptno, count(empno) num,avg(sal) avgsal from emp group by deptno)temp where d.deptno temp.deptno;步骤四 考虑边界值 用左连接select d.deptno,d.LOC,d.dname,temp.num,temp.avgsal from dept d left join(select deptno, count(empno) num,avg(sal) avgsal from emp group by deptno)temp on d.deptno temp.deptno;8.数据库的事务处理1.案例张三在2026年4月28日入职某家公司添加用户 insert into t_person ;insert into t_person_role;两个语句 要不同时执行成功 要不同时执行失败否则打不了卡 所以要上锁2.张三给李四转账500张三账户减少500 李四账户增加500 一定是个整体2.为什么需要事务在开发中一个业务逻辑中发生两次或两次以上的DML操作需要保证两次或以上DML操作同时成功或失败需要使用事务来进行控制3.事务的四大特性原子性(Atomicity)‌事务是不可分割的工作单元操作要么全部成功要么全部回滚。‌‌一致性‌(Consistency)事务执行前后数据库必须从一个一致性状态变换到另一个一致性状态。‌‌隔离性(Isolation)‌并发执行的事务之间不能互相干扰独立执行。‌通常来说一个事务所做的修改在提交以前对其他事务是不可见的。但是可以设置事务的隔离级别来觉得这个不可见是否被允许。事务隔离分为不同级别包括读未提交Read uncommitted、读提交read committed、可重复读repeatable read和串行化Serializable‌持久性‌(Durability)事务一旦提交对数据的改变是永久的即使系统故障也不会丢失。‌四大特性的关系四大特性协同工作原子性是操作基础一致性是目标隔离性解决并发问题持久性确保结果可靠4.事务的隔离级别在SQL标准中定义了四种隔离级别每一种级别都规定了一个事务中所做的修改哪些在事务内和事务之间是可见的、哪些是不可见的。较低级别的隔离通常可以执行更高的并发系统开销也更低。其各级别的特性入下图读未提交Read uncommitted读提交read committed可重复读repeatable read串行化Serializable1.理解脏读、不可重复读、幻读脏读A事务读取到了B事务已添加或修改但还未提交的数据如果B事务后期回滚了那么A事务就读到了脏数据。不可重复读同一个事务中对于同一数据执行完全相同的select语句时可能看到不一样的结果。幻读幻读并不是说两次读取获取的结果集不同幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些select 某记录是否存在不存在准备插入此记录但执行 insert 时发现此记录已存在无法插入此时就发生了幻读。2.事务的隔离级别测试查看当前隔离级别select transaction_isolation; 结果是可重复读mysql的事务默认的自动提交机制若想测试隔离级别需要关闭自动提交或者开启手动提交关闭自动提交set autocommit 0;开启自动提交set autocommit 1如果关闭自动提交在增删改之后需要用户手动提交事务否则数据没有变化手动提交commit;手动回滚rollback步骤读未提交Read uncommitted测试1.修改隔离级别set global transaction isolation levelread UNCOMMITTED根据隔离级别修改;2.关闭自动提交set autocommit 0;3.开启事务start transaction4转账测试update t_sal set sal sal-500 where id 1;update t_sal set sal sal500 where id 2;记得最后加上commit;读已提交read committed测试可重复读repeatable read测试数据是读已提交之后的基础上进行的串行化Serializable测试9.pymysql连接pycharm1.pymysq连接执行简单查询2.pymysql执行带参数查询参数传递方式一参数传递方式二备选参数传递方式三参数传递方式四