关于Null值查询

在mysl中可能存在列值为null的情况,在查询时,用where条件进行判断是不可以的,可以使用提供的运算符进行查询,运算符号分别为:

  • is null
  • is not null
  • <=>

示例如下:
image.png
错误示范:
image.png
正确操作:
image.png
name is null 和 name<=>null 效果一致

正则表达式

MySQL 支持正则表达式的匹配, 使用 REGEXP 操作符来进行正则表达式匹配。
原始数据如下
image.png

  • 匹配name字段是a开头的记录

image.png

  • 匹配name字段是a结尾的记录

image.png

  • 匹配name字段是a结尾a开头的字段

image.png

  • 匹配name字段中包含‘a’字符

image.png

  • 匹配集合中的任意字符

匹配包含a或者b的记录
image.png

  • 原始数据

image.png
匹配ac或者bc 前者或关系
image.png

    • 代表匹配前面表达式0-n次

image.png

    • 代表匹配的前面表达式最少一次

image.png
至少要匹配一次

事务

名词解释

事务是用来维护数据库的完整性的,保证sql要么全部执行,要么全部不执行
事务须满足4个条件,即我们常说的ACID

  • Atomicity 原子性

原子性是指当前事务所包含的操作要么全部执行成功,要么全部失败进行回滚到之前的状态。

  • Consistency 一致性

一致性是指事务必须使数据库从一个一致性状态变成另一个一致性状态,老生常谈的例子就是转账
A给B转账100 A的账号少100 B的账号多100 A用户和B用户的总计在当前事务中是不会发生变化的。

  • Isolation 隔离性

隔离性是当多个用户进行并发操作时,数据库为每一个用户都开启事务,不能被其他的事务所干扰,多个并发事务之间需要相互隔离。

  • Duarbility 持久性

持久性就是一个事务一旦提交,那么对数据库中的数据改变也是永久的,即便是数据库系统遇到故障的情况下也不会丢失事务的提交操作。

操作流程

start transaction | begin 事务开始
commit | commit work 事务提交
rolback | rollback work 事务回滚
MySQL中默认采用的是自动提交(autocommit)模式,如下所示:
image.png
关闭自动提交
image.png

示例

提交
image.png
回滚
image.png
通过上面的实验发现,没有commit数据仍然存在数据库中,其实是没有写入的,只是在当前事务中存在,下面是俩个终端的结果展示
提交之前:
image.png
提交之后:
image.png

数据库索引

数据库索引的建立对数据库高校运行是非常重要的,索引可以提高数据的检索速度,索引分单列索引和组合索引。索引创建在查询时候经常用在where语句后面条件字段中。

  • 索引的优点是可以提高检索速度
  • 缺点是降低更新表的速度

    索引分类

  • 主键索引

根据主键建立的索引,特点是不允许重复,不允许空值

  • 唯一索引

用来创建此类型的索引的列必须是唯一的,允许空值

  • 普通索引

使用表中的普通列进行构建的索引,没有任何限制

  • 全文索引

使用文本对象列构建索引

  • 组合索引

多列组成的索引,在对多列组合建立索引时,会遵循「最左前缀」原则。如使用col1,col2,col3多列索引,相当于创建了(col1)单列索引 (col1,col2)组合索引以及(col1,col2,col3)的组合索引。所以在创建多列组合索引的时候需要把最常用的列放在左边。

操作

  • 创建索引

image.png

  • 显示索引

image.png

临时表

mysql可以创建临时表,临时表只在当前连接可见,关闭连接时候会自动删除临时表,释放相关所有资源。

创建临时表

image.png

使用show tables语句无法查看看到临时表

image.png

查询临时表数据(当前连接)

image.png

新连接查询临时表数据

image.png

删除临时表的方式:

  • 断开当前数据库连接
  • drop tabel table_name;

    用查询直接创建临时表

    image.png
    image.png

    复制表

    完全复制表结构,索引,默认值等有下面几种方案。

    查看创建语句,复制执行

    使用show create table命令查看创建语句
    image.png
    执行sql即可

like创建

  • 使用create table table_name like source_tabke;

image.png

  • 查看实际效果

image.png

  • 查看实际表结构

image.png

复制表结构到新表,但是索引之类的不会被复制

image.png

重复数据处理

防止表中出现重复数据

  • 设置主键
  • 设置UNIQUE

    统计重复数据

  • 原始数据

image.png

  • 统计name出现的次数

image.png

UNION 操作符

union用于连接多个select 语句结果到一个结果集合中
语法如下:

  1. SELECT expression1, expression2, ... expression_n
  2. FROM tables
  3. [WHERE conditions]
  4. UNION [ALL | DISTINCT]
  5. SELECT expression1, expression2, ... expression_n
  6. FROM tables
  7. [WHERE conditions];
  • 原始数据

    1. mysql> select * from demo4;
    2. +------+----------+------+
    3. | id | name | age |
    4. +------+----------+------+
    5. | 1 | CH | 25 |
    6. | 2 | HH | 26 |
    7. | 3 | zhangsan | 27 |
    8. +------+----------+------+
    9. 3 rows in set (0.00 sec)
    1. mysql> select * from demo1;
    2. +----+-------+----------+
    3. | id | price | name |
    4. +----+-------+----------+
    5. | 7 | 6 | jack |
    6. | 2 | 1 | lisi |
    7. | 4 | 2 | lisi |
    8. | 5 | 5 | lisi |
    9. | 6 | 6 | lisi |
    10. | 1 | 1 | zhangsan |
    11. | 3 | 1 | zhangsan |
    12. +----+-------+----------+
    13. 7 rows in set (0.00 sec)
  • 查看两表中所有不同的name值

    1. mysql> select name from demo1 UNION select name from demo4;
    2. +----------+
    3. | name |
    4. +----------+
    5. | jack |
    6. | lisi |
    7. | zhangsan |
    8. | CH |
    9. | HH |
    10. +----------+
    11. 5 rows in set (0.00 sec)
  • 查询两表中所有的name(包括相同重复的数据)

    1. mysql> select name from demo1 UNION ALL select name from demo4;
    2. +----------+
    3. | name |
    4. +----------+
    5. | jack |
    6. | lisi |
    7. | lisi |
    8. | lisi |
    9. | lisi |
    10. | zhangsan |
    11. | zhangsan |
    12. | CH |
    13. | HH |
    14. | zhangsan |
    15. +----------+
    16. 10 rows in set (0.00 sec)

    mysql连接使用

    JOIN分类

  • INNER JOIN (内连接 等值连接)获取俩表中都匹配的字段

  • LEFT JOIN (左连接)获取左表所有记录
  • RIGHT JOIN (右面连接) 和左连接相反

    操作

  • 原始数据 ```sql mysql> select * from demo1; +——+———-+—————+ | id | price | name | +——+———-+—————+ | 7 | 6 | jack | | 2 | 1 | lisi | | 4 | 2 | lisi | | 5 | 5 | lisi | | 6 | 6 | lisi | | 1 | 1 | zhangsan | | 3 | 1 | zhangsan | +——+———-+—————+ 7 rows in set (0.00 sec)

mysql> select * from demo4; +———+—————+———+ | id | name | age | +———+—————+———+ | 1 | CH | 25 | | 2 | HH | 26 | | 3 | zhangsan | 27 | +———+—————+———+ 3 rows in set (0.00 sec)

  1. - 内连接 查找两表中id相等的记录
  2. ```sql
  3. mysql> select a.id,a.name,b.age from demo1 a Inner JOIN demo4 b on a.id=b.id;
  4. +----+----------+------+
  5. | id | name | age |
  6. +----+----------+------+
  7. | 1 | zhangsan | 25 |
  8. | 2 | lisi | 26 |
  9. | 3 | zhangsan | 27 |
  10. +----+----------+------+
  11. 3 rows in set (0.00 sec)
  • 左连接 扫描左表全部记录,右表没有则为空

    1. mysql> select a.id,a.name,b.age from demo1 a LEFT JOIN demo4 b on a.id=b.id;
    2. +----+----------+------+
    3. | id | name | age |
    4. +----+----------+------+
    5. | 1 | zhangsan | 25 |
    6. | 2 | lisi | 26 |
    7. | 3 | zhangsan | 27 |
    8. | 7 | jack | NULL |
    9. | 4 | lisi | NULL |
    10. | 5 | lisi | NULL |
    11. | 6 | lisi | NULL |
    12. +----+----------+------+
    13. 7 rows in set (0.00 sec)
  • 右连接 扫描右表全部记录,左表没有为空

    1. mysql> select a.id,a.name,b.age from demo1 a RIGHT JOIN demo4 b on a.id=b.id;
    2. +------+----------+------+
    3. | id | name | age |
    4. +------+----------+------+
    5. | 1 | zhangsan | 25 |
    6. | 2 | lisi | 26 |
    7. | 3 | zhangsan | 27 |
    8. +------+----------+------+
    9. 3 rows in set (0.00 sec)