一、数据库

  • 数据库:用于存储和管理数据的仓库。
  • 数据库的特点
    • 持久化储存数据,数据库就是一个文件系统。
    • 方便储存和管理数据。
    • 使用了统一的方式操作数据库——SQL。
  • 配置
    • Mysql 服务启动
      • 手动
      • 运行 —— services.msc,打开服务窗口启动。
      • 使用管理员打开 cmd
        • net start mysql : 启动 mysql 服务。
        • net stop mysql : 停止 mysql 服务。
    • Mysql 登录
      • mysql -u root -p
    • Mysql 退出
      • exit
      • quit
    • Mysql 目录结构
      • Mysql 安装目录:D:\Program Files\MySQL\MySQL Server 5.5
        • 配置文件:my.ini
      • Mysql 数据目录:C:\ProgramData\MySQL\MySQL Server 5.5\data
        • 几个概念
          • 数据库:文件夹
          • 表:文件
          • 数据:数据

二、SQL

  • 什么是 SQL ?
    • Structured Query Language:结构化查询语言。
    • 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
  • SQL 通用语法
    •  SQL 语句可以单行或多行书写,以分号结尾。
    • 可使用空格和缩进来增强语句的可读性。
    • MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
    • 3 种注释
      • 单行注释
        • -- 注释内容
        • # 注释内容(mysql 特有) 
      • 多行注释
        •  /* 注释 */
  • SQL 分类
    • DDL (Data Definition Language)数据定义语言
      • 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
    • DML(Data Manipulation Language)数据操作语言
      • 用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
    • DQL(Data Query Language)数据查询语言
      • 用来查询数据库中表的记录(数据)。关键字:select, where 等
    • DCL(Data Control Language)数据控制语言(了解)
      • 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
  • DDL
    • 操作数据库,表。
    • C(Create):创建
      • 创建数据库
        • create database 数据库名称 ;
      • 创建数据库,判断不存在,再创建
        • create database if not exits 数据库名称 ;
      • 创建数据库,并指定字符集
        • create database 数据库名称 character set 字符集名 ;
    • R(Retrieve):查询
      • 查询所有数据库的名称
        • show databases ;
      • 查询某个数据库的字符集:查询某个数据库的创建语句。
        • show create database 数据库名称 ;
    • U(Update):修改
      • 修改数据库的字符集
        • alter database 数据库名称 character set 字符集 ;
    • D(Delete):删除
      • 删除数据库名称
        • drop database 数据库名称 ;
      • 判断数据库存在,存在再删除
        • drop database if exists 数据库名称 ;
    • 使用数据库
      • 查询当前正在使用的数据库名称
        • select database() ;
      • 使用数据库
        • use 数据库名称 ;
    • 操作表
      • C(Create):创建
        • create table 表名(
          • 列名1    数据类型1,
          • 列名2    数据类型2,
          • ...
          • 列名n    数据类型n
        • ) ;
        • 注意事项
          • 最后一列末尾不加 "逗号" 。
          • 数据类型
            • int:整型
            • double:小数类型
              • source  double(5,2)
            • date:日期
              • 只包含年月日:yyyy-MM-dd
            • datetime:日期,包含年月日时分秒。
              • yyyy-MM-dd  HH:mm:ss
            • timestamp:时间戳类型,包含年月日时分秒。
              • 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值。
            • varchar:字符串
        • 复制表
          • create table 表名 like 被复制的表名 ;
      • R(Retrieve):查询
        • 查询某个数据库中所有的表名称
          • show tables ;
        • 查询表结构
          • desc 表名 ;
      • U(Update):修改
        • 修改表名
          • alter table 表名 rename to 新表名 ;
        • 修改表的字符集
          • alter table 表名 character set 字符集名称 ;
        • 添加一列
          • alter table 表名 add 列名 数据类型 ;
        • 修改列名称、数据类型
          • alter table 表名 change 列名 新列名 新数据类型 ;
          • 修改列数据类型
            • alter table 表名 modify 列名 新数据类型 ;
        • 删除列
          • alter table 表名 drop 列名 ;
      • D(Delete):删除
        • drop table 表名;
        • drop table if exists 表名 ;
  • DML:增删改表中数据。
    • 添加数据
      • insert into 表名(列名1,列名2 ... 列名n) values(值1,值2 ... 值n) ;
        • 注意事项
          • 列名和值一一对应。
          • 如果表名后,不定义列名,则表示给所有列名赋值。
          • 除了数字类型,其他类型需要用引号(单双都可以)引起来。
    • 删除数据
      • delete from 表名 [where 条件] ;
        • 注意事项
          • 如果不加条件,则删除表中所有数据。
          • 如果要删除所有记录
            • delete from 表名:不推荐使用,有多少条记录就会执行多少次删除操作。
            • TRUNCATE table 表名:推荐使用,先删除表,再创建一张一模一样的表,效率更高。
    • 修改数据
      • update 表名 set 列名1=值1,列名2=值2 ...  [where 条件] ;
        • 注意事项
          • 如果不加任何条件,则会将表中所有记录全部修改。
  • DQL:查询表中记录
    • select * from 表名 ;
      • 高级查询
      • select 
        • 字段列表
      • from 
        • 表名
      • where
        • 条件查询
      • group by
        • 分组字段
      • having
        • 分组之后条件
      • order by
        • 排序
      • limit
        • 分页限定 ;
    • 别名:AS 
      • 可以给字段、表取别名。
      • AS 可以省略。
      • 别名有特殊符号
        • 对于字段,建议给别名加引号(单双都行)。
        • 对于表,不能加引号,也不能有特殊符号。
    • 去重:DISTINCT
      • SELECT DISTINCT 列名 FROM 表名 ;
    • '着重号'
      • 用单引号把列名或表名引起来。

三、关联查询(联合查询)

  • 七种结果

 

  • 如何实现
    • 内连接
    • 外连接:左外连接,右外连接,全外连接(Mysql 使用 union 代替全外连接)
  • 准备数据库

  • 内连接:实现 A ∩ B
    • 语法
    • select 字段列表 from A表 inner join B表 on 关联条件 where 等其他子句;
      或
      select 字段列表 from A表 , B表 where 关联条件 and 等其他子句;

      代码示例

    • #查询员工的姓名和他所在的部门的名称
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e INNER JOIN dept d ON e.`did` = d.`did`;

      查询结果

  • 左外连接
    • 语法
    • #实现查询结果是 A
      select 字段列表 from A表 left join B表 on 关联条件 where 等其他子句;
      #实现 A - A∩B
      select 字段列表 from A表 left join B表 on 关联条件 where 关联字段 is null and 等其他子句;

      代码示例

    • #查询所有员工的姓名和他所在的部门的名称
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did`;
      
      #查询所有没有部门的员工
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL;

      查询结果

    •  

  • 右外连接
    • 语法
    • #实现查询结果是 B
      select 字段列表 from A表 right join B表 on 关联条件 where 等其他子句;
      #实现 B -  A∩B
      select 字段列表 from A表 right join B表 on 关联条件 where 关联字段 is null and 等其他子句;

      代码示例

    • #查询所有部门,以及所有部门下的员工信息
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.did = d.did;
      
      #查询那些没有员工的部门
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.did = d.did WHERE e.did IS NULL;

      查询结果

    •  

  • 使用 UNION 代替全外连接
    • 语法
    • #实现查询结果是 A∪B
      #用左外的 A,union 右外的 B
      select 字段列表 from A表 left join B表 on 关联条件 where 等其他子句
      union 
      select 字段列表 from A表 right join B表 on 关联条件 where 等其他子句;
      
      #实现 A∪B -  A∩B  或   (A -  A∩B) ∪ (B - A∩B)
      #使用左外的 (A -  A∩B)  union 右外的(B - A∩B)
      select 字段列表 from A表 left join B表 on 关联条件 where 关联字段 is null and 等其他子句
      union
      select 字段列表 from A表 right join B表 on 关联条件 where 关联字段 is null and 等其他子句

      代码示例

    • #查询所有员工,所有部门,包括没有员工的部门,和没有部门的员工
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did`
      UNION 
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.`did` = d.`did`;
      
      #查询那些没有部门的员工和所有没有员工的部门
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e LEFT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL
      UNION 
      SELECT id "员工ID",NAME "员工姓名" ,dname "部门名称" FROM employee e RIGHT JOIN dept d ON e.`did` = d.`did` WHERE e.did IS NULL;

      查询结果

    •  

四、SELECT 语句的 6 大字句

  • 6 大字句排序
    • from:从哪些表中筛选
    • where:从表中筛选的条件
    • group by:分组依据
    • having:在统计结果中再次筛选
    • order by:排序
      • 降序:desc
      • 升序:用么默认,要么加 asc
    • limit:分页
      • imit m,n
        • m = (第几页 - 1)* 每页的数量
        • n = 每页的数量
    • 代码示例
    • #查询每个部门的男生的人数,并且显示人数超过5人的,按照人数降序排列,
      SELECT did ,COUNT(*) "人数" FROM employee  WHERE sex = '' GROUP BY did HAVING COUNT(*) > 1 ORDER BY 人数 DESC LIMIT 0,10;

      查询结果

  • GROUP BY 与分组函数
    • 语法
    • SELECT column, group_function(column)
      FROM table
      [WHERE condition]
      [GROUP BY group_by_expression];

      代码示例

    • #求每个部门的平均成绩
      SELECT did,AVG(score) FROM employee WHERE did IS NOT NULL  GROUP BY did ;

      查询结果

  • HAVING 与分组函数
    • HAVING 和 WHERE 的区别?
      • WHERE 是从表中筛选的条件,而 HAVING 是统计结果中再次筛选。
      • WHERE 后面不能加“分组/聚合函数”,而 HAVING 后面可以跟。
    • 代码示例
    • #统计部门平均工资高于 85 的部门和平均工资
      SELECT did,AVG(score) FROM employee WHERE did IS NOT NULL GROUP BY did HAVING AVG(score) > 85 ;

      查询结果

五、子查询

  • 嵌套在另一个查询中的查询。
  • 根据位置不同,分为
    • where型
    • from型
      • 必须给子查询取别名
    • exists型
  • 注意事项
    • 不管子查询在哪里,子查询必须使用 () 括起来。
    • 代码示例
    • #查询全公司最高分数的员工信息
      SELECT * FROM employee WHERE score = (SELECT MAX(score) FROM employee);
      
      #查询每个部门的编号,名称,平均成绩
      SELECT d.did,d.dname,temp.avgs FROM dept d INNER JOIN (SELECT did,AVG(score) avgs FROM employee GROUP BY did) temp ON d.did = temp.did;
      
      #查询那些有员工的部门
      SELECT did, dname FROM dept WHERE EXISTS (SELECT * FROM employee  WHERE dept.did = employee.did);

      查询结果

    •  

       

六、忘记 root 密码问题

  • 通过任务管理器或者服务管理,关掉 mysqld (服务进程) 。
  • 通过命令行+特殊参数开启 mysqld 。
    • mysqld --skip-grant-tables
  • 此时,mysqld 服务进程已经打开,并且,不需要权限检查。
  • mysql -uroot 无密码登陆服务器。
  • 修改权限表
    • use mysql;
    • update user set Password = password('root') where User = 'root';
    • flush privileges;
  • 通过任务管理器,关掉mysqld服务进程。
  • 再次通过服务管理,打mysql服务。
  • 即可用修改后的新密码登陆。

七、JDBC

  • 概念
    • Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库。
    • 本质
      • 其实是官方(sun 公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。
    • 快速入门
      • 导入驱动 jar 包
        • mysql-connector-java-5.1.37-bin.jar
      • 注册驱动
        • Class.forName("com.mysql.jdbc.Driver");
      • 获取数据库连接对象 Connection
        • DriverManager.getConnection(String  url , String  username , String  password)
          • uri:指定连接的路径
            • jdbc:mysql://ip地址(域名):端口号/数据库名称
          • username
            • 数据库用户名
          • password
            • 数据库密码
      • 定义 sql 
        • 预编译的SQL:参数使用 ? 作为占位符。
      • 获取执行 sql 语句的对象 Statement  
      • 执行 sql,接受返回结果
      • 处理结果
      • 释放资源
  • 详解几个对象
    • Connection:数据库连接对象。
      • 功能:
        • 1. 获取执行 sql 的对象。
          • Statement createStatement()
          • PreparedStatement prepareStatement(String sql)  
        • 2. 管理事务
          • 开启事务:setAutoCommit(boolean autoCommit);
            • 调用该方法设置参数为 false,即开启事务。
          • 提交事务:commit();
          • 回滚事务:rollback();
    • Statement:执行 sql 的对象。
      • boolean execute(String sql) 
        • 可以执行任意的 sql 。(了解) 
      • int executeUpdate(String sql)
        • 执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
        • 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
      • ResultSet executeQuery(String sql) 
        • 执行 DQL (select) 语句。
    • ResultSet:结果集对象,封装查询结果。
      • boolean next()
        • 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true 。
      • getXxx(参数):获取数据。
        • Xxx:代表数据类型   如: int getInt() , String getString()
        • 参数
          • int:代表列的编号,从1开始。如: getString(1)
          • String:代表列名称。 如:getDouble("balance")
    • PreparedStatement:执行 sql 的对象。
      • 作用:解决 sql 注入问题。
      • 预编译的SQL:参数使用 ? 作为占位符。
        • 如:select * from user where username = ? and password = ?;
        • 给?赋值的方法
          • setXxx(参数1,参数2)
            • 参数1:? 的位置编号,从1 开始。
            • 参数2:? 的值。
 posted on 2020-03-19 16:47  _MoLiao  阅读(139)  评论(0编辑  收藏  举报