一.单表查询(作业)
二.数据库表的关系问题---->数据库三大范式
1.表和表的关系问题
一对多
/*用户和订单的关系 一个用户可以有多个订单,某个订单从属于某个用户
员工和部门的关系,一个部门有多个员工,一个员工属于某个部门的
多对多
订单表和商品表
一个订单包含多个商品 一个商品被多个订单包含
学生表和选课表
一个学生可以选多个课程
一个课程可以被多个学生选择
三.多表查询(使用最多)
笛卡尔乘积
SELECT e.*, d. * FROM employee e, dept d ;
上面查询的结果不符合实际要求,7个员工,现在出现了21个 这个就是笛卡尔乘积,针对A表的记录 和B的记录数,两个表的记录相乘 出现笛卡尔乘积的原因:没有设置连接条件!
内连接
隐式:select 指定字段 from 表1,表2 where 连接关系
-- 多表查之内连接() /* 隐式内连接:where条件---多去使用这种查! select 字段列表 from 表名1,表名2...表名n where 这些表之间的连接条件; */ -- 需求:查询员工表和部门表的所有信息 SELECT e.id
'员工编号', e.name
'姓名', e.gender
'性别', e.salary
'工资', e.join_date
'入职日期', e.dept_id
'员工所在的部门', d.id '部门编号', d.name
'部门名称' FROM employee e, dept d WHERE e.dept_id
= d.id
显示:select 指定字段 from
外连接
子查询:select 嵌套 select....
四.数据库的事务/事务的特点/事物的隔离级别
1.引入事务
转账操作-------------->整个业务在执行多个sql语句的时候,尤其添加删除修改需要使用事务
管理,防止出现某条sql执行了,后面没有执行,造成数据紊乱;
2.mysql中如何管理事务--单独指令
1)start transaction:开启事务---在操作多个sql语句之前,将整个业务操作管理起来自动提交事务怯寒手动提交事务
2)执行你的业务操作:多个sql语句或者多张表的sql(增删改)
如果中间出现了问题,可以回滚---rollback;(回滚到操作sql之前的状态)
3)然后提交事务------>commit;事务不提交,数据只是临时改变,数据无法永久更新!只是当前
这个绘画是改变的,当这个会话关闭(断开连接),数据还是之前的数据!
3.事务指令
-- 开启事务
START TRANSACTION;
-- 操作多个sql语句或多张表的sql(同时增删改)
UPDATE account SET balance = balance -500 WHERE id =1;
-- 出问题了
UPDATE account SET balance = balance +500 WHERE id =1;
-- 事务回滚
ROLLBACK;
-- 提交事务
COMMIT;
关系型数据库传统事务:ACID
A原子性:在使用事务管理的时候,执行多个sql增删改,哟啊么同时执行成功,要么同时执行失败;
C一致性:高并发的时候,需要保证事务多次读写,保证数据一致性!
I隔离性:事务和事务之间独立相互不影响
D持久性:事务一旦提交,对数据的影响是永久性,即使关机了,数据依然在更新
-- 事务的隔离级别
READ UNCOMMITTED:读未提交 --->脏读:事务管理中最严重的问题,一个事务读取到另一个没有提交
的事务
READ COMMITTED:读已提交 --->有效防止脏读,出现了一个问题"不可重复读",打破了一致性,多次读取到的事务不一致
REPEATABLE READ:可重复读 (mysql的默认隔离级别)---->可重复读,有效脏读,不可重复读,出现幻读
(一般有更新操作影响了数据)
SERIALIZABLE:串行话(最安全的隔离,但效率低)
SELECT TRASACTION_ISOLATION; mysql8.0以后的查看事务的隔离级别
-- mysql5.7以前查看事务隔离级别
SELECT @@tx_isloation;
-- 设置隔离级别
SET GLOBAL TRANSACTION ISOLOATION LEVEL 级别的名称
五.JDBC 连接数据库
package Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class java_mysql_jar { public static void main(String[] args) throws ClassNotFoundException, SQLException { //jdbc连接数据库,java连接mysql //1.导入驱动jar包 //2.注册驱动 Class.forName("Test.java_mysql_jar"); //3.获取数据库连接对象 编码格式 是否启用证书认证 服务器时区 是否公钥模式 //jar或mysql是8.0以上url后面带上?CharacterEncoding=utf8&useSSL=false&ServerTimezone=UTC&allowPublicKeyRetrieval=true Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/myee_2211","root","123456"); //4.准备sql语句 String sql ="insert into student (name) values ('高圆圆')"; //5.通过数据库连接对象获取数据库执行对象 Statement statement=connection.createStatement(); //6.执行sql语句 int count=statement.executeUpdate(sql); System.out.println("影响了"+count+"行"); //7.释放资源 statement.close(); connection.close(); } }