JavaEE基础-数据库

214 阅读6分钟

一、SQL

1. 概念

Structured Query Language

结构化查询语言

本质就是定义了操作所有关系型数据库的规则

每一种数据库操作的方式存在不一样的地方,称为“方言”

2. 通用语法

  1. 可单行或者多行书写,以分号结尾
  2. 不区分大小写,关键字建议大写
  3. 单行注释:-- 注释内容(--后有一个空格) 或者 # 注释内容(MySQL特有)
  4. 多行注释:/* 注释内容 */

3. 分类

SQL分四类

1). DDL(Data Definition Language)数据定义语言

用来定义数据库对象:数据库,表,列等。关键字:

create drop alter

A. 操作数据库

a. 增(Create)
  • 创建数据库

    create database 数据库名;

  • 创建数据库,如不存在,再创建

    create database if not exists 数据库名;

  • 创建数据库,并指定字符集

    create database if not exists 数据库名 character set gbk;

b. 删(Delete)
  • 删除数据库

    drop database 数据库名;

  • 判断数据库存在,再删除

    drop database if exists 数据库名;

c. 改(Update)
  • 修改指定数据库的字符集

    alter database 数据库名 character set utf8mb4;

d. 查(Retrieve)
  • 查询所有数据库名称

    show databases;

  • 查询指定名称数据库

    show create database 数据库名;

e. 使用数据库
  • 查询当前正在使用的数据库名称

    select database();

  • 使用数据库

    use 数据库名;

B. 操作数据表

a. 增(Create)
  • SQL中的数据类型

    1. int 整数类型

      age int

    2. double 小数类型

      score double(5,2) -- 位数一共五位,小数点后保留两位 最大值为999.99

    3. date 日期类型

      -- 只包含年月日 yyyy-MM-dd

    4. datetime 日期类型

      -- 包含年月日时分秒 yyyy-MM-dd HH:mm:ss

    5. timestamp 时间戳类型

      -- 包含年月日时分秒 yyyy-MM-dd HH:mm:ss

      • 如果不给这个字段赋值,或赋值为null,则默认使用系统当前时间自动赋值
    6. varchar 字符串类型

      name varchar(20) -- 姓名最大20个字符

      zhangsan-> 8个字符

      张三-> 2个字符

  • 创建数据表

    create table 数据表名(column1 type1,column2 type2,...,columnN typeN);

b. 删(Delete)
  • 删除数据表

    drop table 数据表名;

  • 判断数据表存在,再删除

    drop table if exists 数据表名;

c. 改(Update)
  • 修改表名

    alter table 数据表名 rename to 新表名

  • 修改指定数据表的字符集

    alter table 数据表名 character set utf8mb4;

  • 为表添加一列

    alter table 数据表名 add 列名 数据类型

  • 为表删除一列

    alter table 数据表名 drop 列名

  • 修改表的列类型

    alter table 数据表名 modify 列名 新类型

  • 修改表的列名称及类型

    alter table 数据表名 change 列名 新列名 新类型

d. 查(Retrieve)
  • 查询某个数据库中所有表的名称

    show tables;

  • 查询表结构

    desc 数据表名;

e. 使用数据表
  • 复制数据表

    create table mynewtable like 数据表名;

2). DML(Data Manipulation Language)数据操作语言

用来对数据库中表的数据进行增删改。关键字:

insert delete update

A. 向表中添加数据

  • 语法:

    insert into 表名(列名1,列名2,...,列名n) values(值1,值2,...,值n);

  • 注意:

    1.如果表名后不定义列名,则默认给所有列添加值

    insert into 表名 values(值1,值2,...,值n);

    1. 除了数字类型数据,其他类型数据需要使用单双引号表示

B. 从表中删除数据

  • 根据条件删除表中数据

    delete from 表名 where 条件 -- 如果不加where,删除表中所有记录,效率低

  • 删除表中所有数据

    truncate table 表名 -- 先删除表,再创建一张一样的表

C. 在表中修改数据

  • 修改表中指定条件的值

    update 表名 set 列名1 = 值1, 列名2 = 值2,... where 条件 -- 如果不加where,则会将表中所有记录全部修改

3). DQL(Data Query Language)数据查询语言

用来查询数据库中表的记录(数据)。关键字:

select where

  • 查询表数据

    select 字段1,字段2,... from 表名1,表名2,... where 条件1,条件2,... group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定;

A. 基础查询

a.多个字段查询

select 字段名1 -- 注释内容, 字段名2 -- 注释内容, ... from 表名 -- 注释内容;

b.去除重复

select distinct 字段名 from 表名 ;

c.计算列字段

select 字段名1 + 字段名2 from 表名 -- 注释内容;

d.给列字段起别名

select 字段名1 AS 别名1, 字段名2 别名2, ... from 表名 ;

TIPS:

SELECT DISTINCT -- 结果集(根据条件查询得到的结果集合)去重复 name, math 数学 -- AS 可省略, english, math + IFNULL(english,0) -- 计算列字段之和 IFNULL(判断字段,替代值) AS 总分 FROM 表名

B. 条件查询

a. 条件运算符
  • > < <= >= = <>(不等于)

  • BETWEEN...AND

  • IN(集合)

  • LIKE -- 模糊查询

    • 单个占位符:_
    • 多个占位符:%
    • SELECT * FROM mytable WHERE NAME LIKE "%德%";
  • IS NULL

  • and 或 &&

  • or 或 ||

  • not 或 !

C. 排序查询

  • 语法:order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
  • 排序方式:
    • ASC:升序,默认
    • DESC:降序
  • 注意:多个排序条件则按从前到后顺序执行

D. 聚合函数

将一列数据作为一个整体,进行纵向计算

  1. count:计算个数

    • SELECT COUNT(NAME) FROM mytable;
    • 会排除NULL值,可用IFNULL替换
  2. max:计算最大值

  3. min:计算最小值

  4. sum:计算和

  5. avg:计算平均值

E. 分组查询

  • 语法:group by 分组字段
  • 注意:
    • 分组之后查询的字段:分组字段 或者 聚合函数
    • SELECT sex,AVG(math) FROM mytable WHERE math > 70 GROUP BY sex having COUNT(NAME) > 2;
    • where 和 having 的区别?
      • where 在分组之前进行限定,如果不满足条件,不参与分组。having在分组之后限定,如果不满足条件,则查询不出来
      • where后不可以跟聚合函数,但having后可以进行聚合函数的判断

F. 分页查询

  • 语法:limit 开始的索引,每页查询的条数;
  • 公式:开始的索引= (当前的页码 - 1)* 每页显示的条数
  • limit分页操作是mysql的“方言”

4). DCL(Data Control Language)数据控制语言

用来定义数据库的访问权限和安全级别,及创建用户。关键字:

GRANT REVOKE

4. 约束

唯一约束有时也称为唯一索引 因此删除时需要DROP INDEX

级联删除操作需谨慎

5. 多表关系

6. 范式

7. 数据库的备份与还原

8. 多表查询

左外连接:查询左表及左表交右表

9. 事务

脏读和不可重复读

隔离级别设置为read uncommitted

两个事务同时开启

其中一个事务修改数据未提交

另一个事务两次查询数据结果不同

发生脏读,不可重复读


隔离级别设置为read committed

两个事务同时开启

其中一个事务修改数据并提交

另一个事务两次查询 结果不同

脏读解决 发生不可重复读


隔离级别设置为repeatable read

脏读和不可重复读均解决

另一个事务也提交再查询才能看到数据变化情况


隔离级别设置为serializable

只有当一个事务完成commit时,另一个事务才能执行,类似于锁表操作

二、MySQL结构

1. 图解