1.多表查询
* 查询语句
select
列名列表
from
表名列表
where····
笛卡尔积算法:* 有两个集合A,B .取这两个集合的所有组成情况。
* 要完成多表查询,需要消除无用的数据
* 多表查询的分类:
1.内连接查询:
1.隐式内连接:使用where条件消除无用数据
2.显示内连接:select 字段列表 from 表名1 join 表名2 on 条件
3. 内连接查询:
1. 从哪些表中查询数据
2. 条件是什么
3. 查询哪些字段
2.外连接查询:
1.左外连接: select 字段列表 from 表1 left join 表2 on 条件
* 查询的是左表所有数据以及其交集部分。
2.右外连接: select 字段列表 from 表1 rigth join 表2 on 条件
* 查询的是右表所有数据以及其交集部分。
3.子查询:
* 概念:查询中嵌套查询,称嵌套查询为子查询。
* 子查询不同情况
1. 子查询的结果是单行单列的:
* 子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
在查询中还有一个查询,返回的是单值 用运算符
2. 子查询的结果是多行单列的:
*子查询可以作为条件,使用运算符in来判断
结果返回的是单列多值的时候用 in
3. 子查询的结果是多行多列的:
* 子查询可以作为一张虚拟表参与查询
在查询中有一个查询。
2.事务 : 一系列事情要么都做,要么都不做
概念: * 如果一个包含多个步骤的业务操作,被事物管理那么这些操作要么同时成功要么同时失败
操作:
开始事务 : start transaction
回滚 : roll uback
提交 : commit;
MySQL 数据库中事务默认自动提交
* 事务提交的两种方式:
* 自动提交:
mysql就是自动提交。
* 一条DML(增删改)语句会自动提交一次事务。
* 手动提交:
* Oracle 数据库默认是手动提交事务
* 需要先开启事务,再提交
* 修改事务的默认提交方式:
* 查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
* 修改默认提交方式: set @@autocommit = 0;
2.事物的四大特征:(重点)
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
2.持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3.隔离性: 多个事务之间,相互独立
4.一致性: 事务操作前后,数据总量不变
ACID
Atomic
Consistence
Isolation
Durable
3.事物的隔离级别(了解)
* 多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,射设置不同
1.脏读:一个事务,读取到另一个事务中没有提交的数据
2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
3.幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离级别:
1.read uncommitted: 读未提交
* 产生的问题: 脏读、不和可重复读,幻读
2.read committed : 读已提交 (Oracle 默认)
* 产生的问题: 可不重复读、幻读
3.repeatable read :可重复读)(mySQL 默认)
产生的问题: 幻读
4. serializable :串行化
* 可以解决所有的问题
注意: 隔离级别从小到大安全性越来越高,但是效率越来低
3.DCL: 管理用户、授权
1. 添加用户:
* 语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
2. 删除用户:
* 语法:DROP USER '用户名'@'主机名';
3. 修改用户密码:
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
* mysql 中忘记了root用户的密码
1. cmd -- > net stop mysql 停止mysql服务
* 需要管理员运行该cmd
2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables
3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. use mysql;
5. update user set password = password('你的新密码') where user = 'root';
6. 关闭两个窗口
7. 打开任务管理器,手动结束mysqld.exe 的进程
8. 启动mysql服务
9. 使用新密码登录。
查询用户:
-- 1. 切换到mysql数据库
USE myql;
-- 2. 查询user表
SELECT * FROM USER;
* 通配符: % 表示可以在任意主机使用用户登录数据库
2. 权限管理:
1. 查询权限:
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
3. 撤销权限:
-- 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';
JDBC 基本概念
概念 : java DataBase Connectivity java 数据库连接( java语言操作数据库)
JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。 JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是
数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供
例:
- preson 接口 worker 类 person p = new worker (); p.eat()
快速入门:
- 导入驱动jar包 :
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
Class.forName(" com.mysql.jdbc.Driver ")
一个连接对象,可用于创建 Statement 和 PreparedStatement 对象
Connection conn = DriverManager . getConnection("jdbc:maysql:// localhost:3306//db3","root","root")
一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。
Sting sql = "update 表名 set 列名 = 修改列值 where 你要改的行 = 行数 " (修改)
- 执行sql,接受返回结果 ResultSet rs = statement.executeupdata
rs。getxxx()
详解个个对象
JDBC 核心API:
1. DriverManager 类 :
1.管理和注册数据库驱动
Class.forname("")
2.得到数据库连接对象
Connection getConnection (String url, String user, String password)
通过连接字符串,用户名,密码来得到数据 库的连接对
url : jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
user : 用户名
password : 密码
2. Connection 接口 :
概念:具体的实现类由数据库的厂商实现,代表一个连接对象。 可用于创建 Statement 和 PreparedStatement 对象。
createStatement() 创建一条 SQL 语句对象
3. Statement 接口 :
概念:一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。 使用 Statement 对象执行 SQL 语句
int executeUpdate 用于发送 DML 语句,增删改的操作,insert、update、delete 参数:SQL 语句 返回值:返回对数据库影响的行数 ResultSet
executeQuery(String sql) 用于发送 DQL 语句,执行查询的操作。select 参数:SQL 语句 返回值:查询的结果集
4. PreparedStatemen 接口 :
概念: 一个 SQL 语句对象,是 Statement 的子接口
5. ResultSet 接口 : 用于封装数据库查询的结果集,返回给客户端 Java 程序
Connection创建PreparedStatement对象
PreparedStatement prepareStatement(String sql) 指定预编译的 SQL 语句,SQL 语句中使用占位符? 创建一个语句对象
PreparedStatement接口中的方法:
int executeUpdate() 执行 DML,增删改的操作,返回影响的行数。
ResultSet executeQuery() 执行 DQL,查询的操作,返回结果集
8.6 使用PreparedStatement的步骤:
1 编写 SQL 语句,
未知内容使用?占位:"SELECT * FROM user WHERE name=? AND password=?";
2 获得 PreparedStatement 对象
3 设置实际参数:setXxx(占位符的位置, 真实的值)
4 执行参数化 SQL 语句
5 关闭资源
|