MySQL学习笔记

2020-03-03  本文已影响0人  zfz_amzing

MySQL

MySQL常用数据类型

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

详情见菜鸟教程https://www.runoob.com/mysql/mysql-data-types.html

MySQL建表约束

总结:

  1. 建表的时候就添加约束
  2. 可以使用alter 。。。add。。。
  3. 可以使用alter。。。modify。。。
  4. 删除约束alter。。。drop。。。。

数据库的三大设计范式

数据表中的所有字段都是不可分割的原子值

字段值还可以拆分的就不满足第一范式

--不满足第一范式 address可以继续拆分
--address >> privence  |  city  |  street  |  detail 
create table student(
    id int primary key;
    name varchar(20);
    address varchar(30);
);
--满足第二范式,字段不可以继续拆分
create table student(
    id int primary key;
    name varchar(20);
    privence varchar(30);
    city(30);
    street varchar(30);
    detail varchar(30)
);

范式设计的越详细,对于某些实际操作可能更好,但也不一定都是好处。

必须是满足第一范式的前提下,第二范式要求除主键外的每一列都必须完全依赖于主键
如果必须要出现不完全依赖,只可能发生在联合主键的情况下

create table myorder(
    product_id int,
    customer_id,
    product_name varchar(20),
    customer_name varchar(20),
    primary key(product_id, cunstomer_id)
);

该表不满足第二范式,拆表!

create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int
);
create table product(
    id int primary key,
    name varchar(20)
);
create table customer(
    id int primary key,
    name varchar(20)
);

分成三个表之后就满足了第二范式的设计

必须先满足第二范式,除主键列的其他列之间不能有传递依赖关系

create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int,
    customer_phone varchar(15)
);

该表不满足第三范式,customer_id 可以通过 order_id 找到,customer_phone可以由customer_id找到,产生了冗余。

--满足第三范式
create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int
);
create table customer(
    id int primary key,
    name varchar(20),
    customer_phone varchar(15)
);

单表查询

mysql> select t_depart from teacher;
+------------+
| t_depart   |
+------------+
| 计算机系   |
| 计算机系   |
| 电子工程系 |
| 电子工程系 |
+------------+
4 rows in set (0.00 sec)

mysql> select distinct t_depart from teacher;
+------------+
| t_depart   |
+------------+
| 计算机系   |
| 电子工程系 |
+------------+
2 rows in set (0.00 sec)`
mysql> select * from student where s_class = '95031' or s_sex = '女';
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birthday          | s_class |
+------+--------+-------+---------------------+---------+
| 102  | 匡明   | 男    | 1975-10-02 00:00:00 | 95031   |
| 103  | 王丽   | 女    | 1976-01-23 00:00:00 | 95033   |
| 105  | 王芳   | 女    | 1975-02-10 00:00:00 | 95031   |
| 106  | 陆军   | 男    | 1974-06-03 00:00:00 | 95031   |
| 108  | 张全蛋 | 男    | 1975-02-10 00:00:00 | 95031   |
| 109  | 赵铁柱 | 男    | 1974-06-03 00:00:00 | 95031   |
+------+--------+-------+---------------------+---------+

多表查询

mysql> select s_name ,c_no, sc_degree from student,score where student.s_no = score.s_no;
+--------+-------+-----------+
| s_name | c_no  | sc_degree |
+--------+-------+-----------+
| 王丽   | 3-105 |        92 |
| 王丽   | 3-245 |        86 |
| 王丽   | 6-166 |        85 |
| 王芳   | 3-105 |        88 |
| 王芳   | 3-245 |        75 |
| 王芳   | 6-166 |        79 |
| 赵铁柱 | 3-105 |        76 |
| 赵铁柱 | 3-245 |        68 |
| 赵铁柱 | 6-166 |        81 |
+--------+-------+-----------+

连接查询

数据表

+------+------+--------+
| id   | name | cardId |
+------+------+--------+
|    1 | 张三 |      1 |
|    1 | 李四 |      3 |
|    1 | 王五 |      6 |
+------+------+--------+
+------+--------+
| id   | name   |
+------+--------+
|    1 | 饭卡   |
|    2 | 建行卡 |
|    3 | 农行卡 |
|    4 | 工商卡 |
|    5 | 邮政卡 |
+------+--------+

内连接

inner join 或者 join

mysql> select * from person inner join card on person.cardId = card.id;
+------+------+--------+------+--------+
| id   | name | cardId | id   | name   |
+------+------+--------+------+--------+
|    1 | 张三 |      1 |    1 | 饭卡   |
|    1 | 李四 |      3 |    3 | 农行卡 |
+------+------+--------+------+--------+

内联查询,其实就是两张表中的数据,通过某个字段相等,查询相关记录数据

外连接

连接查询其实就是集合运算

内连接就是求两个集合的交集

左(右)外连接就是求左(右)边表的全部数据

完全外连接就是求交集

事务

事务的四大特性:

事务的隔离性

  1. read uncommitted:读未提交的
    • 其他事务读未提交数据,出现脏读;
    • 如果一个事务开始写数据,另一个事务不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现
    • 避免了更新丢失,可能出现脏读。也就是说事务a读到了事务b未提交的数据
  2. read committed:读已提交的
    • 允许写事务,所以会出现不可重复读
    • 读取数据得事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行
    • 该隔离级别避免了脏读,但是可能出现不可重复读。事务a事先读取了数据,事务b紧接着更新了数据,并提交了事务,而事务a再次读取该数据时,数据已经发生了改变。
  3. repeatable read:可以重复读
    • 禁止写事务
    • 读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止其他任何事务
    • 避免了不可重复读取和脏读,但是有时可能出现幻读,即第二次查询数据时会包含第一次查询中未出现的数据。这可以通过“共享读锁”和“排他写锁”实现
  4. serializable:串行化
    • 禁止任何事务,一个一个进行;
    • 提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
    • 序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。
上一篇下一篇

猜你喜欢

热点阅读