| 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 关闭资源  
 
 
 
 |