多表查询
交叉链接
cross join 查询表的笛卡尔积
select * from 表 cross join 表
select * from 表,表
内连接
inner join 查询两个表中共有的数据
select * from 表 inner join 表1 [on 表.列 = 表1.列]
隐式内链接:select * from 表,表1 [where 表.列 = 表1.列]
外链接
左外链接
以左表为基准,查询两表结果
select * from 表 outer left join 表1 on 表.列 = 表1.列
右外链接
以右边表为基准,查询
select * from 表 right outer join 表 on 关联条件
简写:select * from 表 right join 表 on 关联条件
子查询
一个语句查询结果依赖另一个语句查询结果
查询语句的嵌套
in
子查询的结果
select * from 表 where 列 in (子查询语句)
exists
子查询有数据,前边语句才会执行
select * from 表 where exists (查询语句,查询出语句才会执行 (select * from 表))
any
大于查询子查询中任意数据
select * from 表 where 列 运算符 any(子查询,必须保证查询结果**一列**数据)
all
大于查询中所有数据
select * from 表 where 列 运算符 all(子查询,必须保证查询结果**一列**数据)
事务
逻辑上的一系列操作,要么全部成功,要么全部失败
事务特性(ACID):
原子性:
组成事务的各个逻辑单元不可分离
一致性:
如果执行失败,数据还会回滚到之前的状态。数据前后一致性
隔离性:
事务在操作指定数据时,其他事务不能干扰这个数据。
脏读:
事务读取数据时读到其他事务为提交的数据,导致结果不一致
不可重复读:
一个事务读到另一个事务update 数据,导致多次不一致
虚读:
一个事务读到另一个事务已经提交的Insert数据,导致结果不一致
事务的等级:
read uncommitted: 未提交读,事务执行没提交/回滚时,其他事务就可以读到
read committed : 已提交读,当前事务必须把数据提交后,其他事务才会读到提交后数据。
repeatable read : 可重复读
serializable : 事务不允许并发,必须逐个执行
PreparedStatement prepareCall(String sql) 调用存储过程
开始事务:
start transaction
提交事务:
commit
JDBC
连接各种数据的一种规范
JDBC链接数据库:
1,注册驱动
2,创建链接对象
3,创建执行SQL语句对象
4,执行SQL语句,获取执行结果
5,释放资源
DriverManager 驱动管理类
//获取连接对象
Connection getConnection(String url,String user,String password)
url 连接数据库语句:jdbc:mysql://[localhost:3306]/数据库
user 数据库管理员
password 管理员密码
Connection 连接对象
与数据库连接对象
创建SQL语句对象
Statement createStatement() 执行SQL,有SQL注入风险
创建预处理SQL对象
创建后SQL语句格式固定
PreparedStatement prepareStatement(String sql);
SQL中的占位符
setString/Int(int index,String value)
index 第一个 占位符(?)
value 对应的值
Statement
执行SQL语句对象
ResultSet executeQuery(String sql) 执行查询语句,返回结果集
int executeUpdate(String sql) 执行查询语句,返回受影响行数
ResultSet
返回结果集
boolean next() 是否有下一条记录,没有返回false,有,返回true,指针移动到下一条记录
String getxx
两个重载:
传入列索引
传入列名称,尽量传入列名称
getInt
getLong
getString.,mn
getDouble
getObject
批量执行SQL
PreparedStatement
addBash() 把当前SQL执行对象添加到批处理中
clearPreparers() 清空当前批处理中的SQL执行对象