MySQL

一 数据库简介

存储数据的仓库

本质上是一个文件系统 以文件的方式存在服务器电脑上

所有关系型数据库都可以使用通用的SQL语句进行管理

常见的数据库软件有 MySQL Oracle PostgreSQL...

 

二 MySQL简介

开源免费的数据库 小型数据库 功能强大 已经被Oracle收购 MySQL6.x版本也开始收费

1. MySQL安装

  Linux 安装MySQL(使用Mac远程访问)

2. MySQL登录

  mysql -u用户名 -p密码

  mysql -hIP地址 -u用户名 -p密码

3. MySQL退出

  exit

  quit

4. MySQL常见数据类型

  INT 整数类型

  DOUBLE(X,Y) 小数类型 最多有X位 小数点后面保留Y位

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

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

  TIMESTAMP 时间戳 默认使用当前的系统时间来自动赋值

  VARCHAR(X) 字符串 最多有X个字符

 

三 SQL简介

Structured Query Language 结构化查询语言

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

通用的数据库操作语言可以用在不同的数据库中 不同的数据库SQL语句有一些区别

 

四 SQL语句分类

1. DDL: Data Definition Language 数据定义语言 比如建库 建表

2. DML: Data Manipulation Language 数据操作语言 比如对表数据的增删改

3. DQL: Data Query Language 数据查询语言 比如对表数据的查询

4. DCL: Data Control Language 数据控制语言 比如对用户权限的设置

 

五 库操作

创建数据库

CREATE DATABASE 数据库名称;

创建数据库 判断不存在再创建

CREATE DATABASE IF NOT EXISTS 数据库名称;

创建数据库 并指定默认编码

CREATE DATABASE 数据库名称 CHARACTER SET utf8;

创建数据库 判断不存在再创建 并指定默认编码

CREATE DATABASE IF NOT EXISTS 数据库名称 CHARACTER SET utf8;

删除数据库

DROP DATABASE 数据库名称;

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

DROP DATABASE IF EXISTS 数据库名称;

修改当前使用的数据库

USE 数据库名称;

修改数据库的字符集

ALTER DATABASE 数据库名称 CHARACTER SET utf8;

查看当前使用的数据库

SELECT DATABASE();

查看所有数据库

SHOW DATABASES;

查看指定数据库的定义信息

SHOW CREATE DATABASE 数据库名称;

 

六 单表操作

创建表

CREATE TABLE account (
    aid INT,
    aname VARCHAR(100),
    amoney DOUBLE
);

创建表 指定主键 主键特点是非空且唯一

CREATE TABLE account (
    aid INT PRIMARY KEY,
    aname VARCHAR(100),
    amoney DOUBLE
);

创建表 指定主键 且主键自动增长

CREATE TABLE account (
    aid INT PRIMARY KEY AUTO_INCREMENT,
    aname VARCHAR(100),
    amoney DOUBLE
);

创建表 复制

CREATE TABLE account_new LIKE account;

删除表

DROP TABLE account;

删除表 判断存在再删除

DROP TABLE IF EXISTS account;

修改表名

ALTER TABLE account RENAME TO account_new;

修改表的字符集

ALTER TABLE account CHARACTER SET utf8;

修改表 添加列

ALTER TABLE account ADD asex INT;

修改表 修改列的类型 长度 约束

ALTER TABLE account MODIFY asex VARCHAR(1) NOT NULL;

修改表 修改列的名称 类型 长度 约束

ALTER TABLE account CHANGE asex asex_new INT;

修改表 删除列

ALTER TABLE account DROP asex_new;

查看数据库中的所有表

SHOW TABLES;

查看表结构

DESC account;

查看指定表的定义信息

SHOW CREATE TABLE account;

 

七 单表数据操作

插入表纪录

INSERT INTO account VALUES (1, '吃饭支出', 247);
INSERT INTO account (aid, aname, amoney) VALUES (2, '工资收入', 12345);
INSERT INTO account (aid, aname, amoney) VALUES (3, '服装支出', 1000);
INSERT INTO account (aid, aname, amoney) VALUES (4, '吃饭支出', 325);
INSERT INTO account (aid, aname, amoney) VALUES (5, '股票收入', 8000);
INSERT INTO account (aid, aname, amoney) VALUES (6, '打麻将支出', 8000);
INSERT INTO account (aid, aname, amoney) VALUES (7, NULL, 5000);
INSERT INTO account (aid, aname, amoney) VALUES (8, '打麻将支出', 2000);

删除所有记录 一条一条删除 不清空AUTO_INCREMENT记录数

DELETE FROM account;

删除所有记录 直接将表删除 重新建表 AUTO_INCREMENT归零 效率更高

TRUNCATE TABLE account;

删除指定记录 一条一条删除 不清空AUTO_INCREMENT记录数

DELETE FROM account WHERE aid = 1;

修改所有记录

UPDATE account SET aname = '钱都用光了';

修改指定记录

UPDATE account SET aname = '捡到一袋子钱', amoney = 88888 WHERE aid = 1;

查询语法

SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组之后的条件 ORDER BY 排序 LIMIT 分页

查询所有字段

SELECT * FROM account;

查询指定字段

SELECT aname, amoney FROM account;

查询 去除重复记录

SELECT DISTINCT amoney FROM account;

查询 别名

SELECT * FROM account AS a;
SELECT * FROM account a;
SELECT aname, amoney AS money FROM account;
SELECT aname, amoney money FROM account;

查询 运算

SELECT aname, amoney + 100 FROM account;

查询 不等于

SELECT * FROM account WHERE aname <> '吃饭支出';

查询 大于

SELECT * FROM account WHERE amoney > 1000;

查询 之间

SELECT * FROM account WHERE amoney >= 2000 AND amoney <= 5000;
SELECT * FROM account WHERE amoney BETWEEN 2000 AND 5000;

查询 或

SELECT * FROM account WHERE amoney = 1000 OR amoney = 3500 OR amoney = 5000;
SELECT * FROM account WHERE amoney IN (1000, 3500, 5000);

查询 包含

SELECT * FROM account WHERE aname LIKE '%支出%';

查询 字符长度匹配

SELECT * FROM account WHERE aname LIKE '_____';

查询 不为NULL

SELECT * FROM account WHERE aname IS NOT NULL;
SELECT * FROM account WHERE NOT (aname IS NULL);

查询 升序+降序

SELECT * FROM account ORDER BY amoney ASC, aid DESC;

查询 条件+升序 排序必须放在最后

SELECT * FROM account WHERE aname LIKE '%支出%' ORDER BY amoney ASC;

查询 求和 对表中数据条数求和

SELECT COUNT(aid) FROM account;
SELECT COUNT(IFNULL(aname, 0)) FROM account;

查询 求和 对表中数据内容求和 一般是数值型

SELECT SUM(amoney) FROM account WHERE aname LIKE '%收入%';

查询 最大值 一般是数值型

SELECT MAX(amoney) FROM account;

查询 最小值 一般是数值型

SELECT MIN(amoney) FROM account;

查询 平均值 一般是数值型

SELECT AVG(amoney) FROM account;

查询 分组 必须跟随聚合函数

SELECT aname, SUM(amoney) FROM account WHERE aname LIKE '%支出%' GROUP BY aname HAVING SUM(amoney) > 888 ORDER BY SUM(amoney) ASC;

查询 分页 参数一=开始索引 参数二=每页显示个数 pageSize

SELECT * FROM account LIMIT (N - 1) * pageSize, pageSize;
SELECT * FROM account LIMIT 0, 3;
SELECT * FROM account WHERE aname LIKE '%支出%' ORDER BY amoney ASC LIMIT 2, 2;

 

八 约束

对表中的数据进行限定 保证数据的正确性 有效性和完整性

1. 主键约束 primary key

非空且唯一 一张表只能有一个字段为主键 主键就是表中记录的唯一标识

a. 在创建表时 添加主键约束

CREATE TABLE demo_primary_key (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

b. 删除主键约束 删除不了自动增长的主键

ALTER TABLE demo_primary_key DROP PRIMARY KEY;

c. 创建表后 添加主键约束

ALTER TABLE demo_primary_key MODIFY id INT PRIMARY KEY;

2. 非空约束 not null

值不能为null

a. 在创建表时 添加非空约束

CREATE TABLE demo_not_null (
    id INT,
    name VARCHAR(20) NOT NULL
);

b. 删除非空约束

ALTER TABLE demo_not_null MODIFY name VARCHAR(20);

c. 创建表后 添加非空约束

ALTER TABLE demo_not_null MODIFY name VARCHAR(20) NOT NULL;

3. 唯一约束 unique

值不能重复

a. 在创建表时 添加唯一约束

CREATE TABLE demo_unique (
    id INT,
    name VARCHAR(20) UNIQUE
);

b. 删除唯一约束

ALTER TABLE demo_unique DROP INDEX name;

c. 创建表后 添加唯一约束

ALTER TABLE demo_unique MODIFY name VARCHAR(20) UNIQUE;

4. 外键约束 foreign key

让表于表产生关系 从而保证数据的正确性

a. 在创建表时 添加外键约束

CREATE TABLE 表名 (
    ...
    外键列
    CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称 (主表字段名称)
);

b. 删除外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

c. 创建表后 添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称 (主表字段名称);

 

九 多表操作(一对多)

1. 表操作

创建表 一

CREATE TABLE category (
    cid VARCHAR(32) PRIMARY KEY,
    cname VARCHAR(100)
);

创建表 多

CREATE TABLE product (
    pid VARCHAR(32) PRIMARY KEY,
    pname VARCHAR(100),
    pprice DOUBLE,
    pcid VARCHAR(32)
);

添加外键约束

ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY (pcid) REFERENCES category (cid);

删除外键约束

ALTER TABLE product DROP FOREIGN KEY product_fk;

2. 数据操作

插入表纪录

INSERT INTO category VALUES ('c001', '家电');
INSERT INTO category VALUES ('c002', '服饰');
INSERT INTO category VALUES ('c003', '化妆品');
INSERT INTO product VALUES ('p001', '联想', 5000, 'c001');
INSERT INTO product VALUES ('p002', '海尔', 3000, 'c001');
INSERT INTO product VALUES ('p003', '雷神', 5000, 'c001');
INSERT INTO product VALUES ('p004', 'JACK JONES', 800, 'c002');
INSERT INTO product VALUES ('p005', '真维斯', 200, 'c002');
INSERT INTO product VALUES ('p006', '花花公子', 440, 'c002');
INSERT INTO product VALUES ('p007', '劲霸', 2000, 'c002');
INSERT INTO product VALUES ('p008', '香奈儿', 800, 'c003');
INSERT INTO product VALUES ('p009', '相宜本草', 200, 'c003');

查询 隐式内连接 两表交集

SELECT * FROM category, product WHERE cid = pcid;

查询 显示内连接 两表交集

SELECT * FROM category INNER JOIN product ON cid = pcid;

查询 左外连接 左表全部和两表交集

SELECT * FROM category LEFT JOIN product ON cid = pcid;

查询 右外连接 右表全部和两表交集

SELECT * FROM category RIGHT JOIN product ON cid = pcid;

查询 子查询 一条SELECT语句结果作为另一条SELECT语句一部分

SELECT * FROM product WHERE pcid = (SELECT cid FROM category WHERE cname = '化妆品');

 

十 多表操作(多对多)

创建表 多

CREATE TABLE goods (
    gid VARCHAR(32) PRIMARY KEY,
    gname VARCHAR(100),
    gprice DOUBLE
);

创建表 多

CREATE TABLE orders (
    oid VARCHAR(32) PRIMARY KEY,
    ototal_price DOUBLE
);

创建表 中间表

CREATE TABLE item (
    gid VARCHAR(32),
    oid VARCHAR(32)
);

添加外键约束

ALTER TABLE item ADD CONSTRAINT item_goods_fk FOREIGN KEY (gid) REFERENCES goods (gid);
ALTER TABLE item ADD CONSTRAINT item_orders_fk FOREIGN KEY (oid) REFERENCES orders (oid);

删除外键约束

ALTER TABLE item DROP FOREIGN KEY item_goods_fk;
ALTER TABLE item DROP FOREIGN KEY item_orders_fk;

 

十一 数据库设计范式

设计数据库时 需要遵循的一些规范 要遵循后边的范式要求 必须先遵循前边的所有范式要求

1. 第一范式(1NF) 原子性

每一列都是不可分割的原子数据项

表中的每一列不可再拆分

2. 第二范式(2NF) 不产生局部依赖

在1NF的基础上 非码属性必须完全依赖于码

表中的每一列都完全依赖于主键

3. 第三范式(3NF) 不产生传递依赖

在2NF的基础上 任何非码属性不依赖于其它非码属性

表中的每一列都直接依赖于主键 而不是通过其它列来间接依赖于主键 数据不能存在传递关系

 

十二 数据库命名规范

1. 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成 命名简洁明确 多个单词用下划线'_'分隔

2. 全部小写命名 禁止出现大写

3. 禁止单独使用数据库关键字 比如name time password等等

4. 表名称不应该取得太长(一般不超过三个英文单词)

5. 用单数形式表示名称 比如使用user而不是users

6. 表名 业务表前缀business 系统表前缀system

7. 如果该表主键需要作为别的多个表的外键 需要有前缀区分 并且命名一致 比如产品类型表business_product_type 表的主键会被产品表business_product和价格表business_price等多张表设为外键 那么business_product_type表的主键不能是id 应该是product_type_id 产品表business_product和价格表business_price的外键命名也应该是product_type_id

 

十三 事务

1. 简介

如果一个包含多个步骤的业务操作 被事务管理 那么这些操作要么同时成功 要么同时失败

2. 自动提交事务

MySQL默认每一条DML(增删改)语句都是一个单独的事务 每条语句都会自动开启一个事务 语句执行完毕 自动提交事务 MySQL默认开启自动提交事务

3. 手动提交事务

执行成功的情况

  开启事务 -> 执行多条SQL语句 -> 提交事务

  START TRANSACTION; -> SQL... -> COMMIT;

执行失败的情况

  开启事务 -> 执行多条SQL语句 -> 回滚事务

  START TRANSACTION; -> SQL... -> ROLLBACK;

4. 修改事务提交方式

查看事务提交方式

  SELECT @@autocommit; //0=手动提交 1=自动提交

修改事务提交方式

  set @@autocommit = 0; //0=手动提交 1=自动提交

5. 事务的四大特征

原子性: 是不可分割的最小操作单位 要么同时成功 要么同时失败

持久性: 当事务提交或回滚后 数据库会持久化的保存数据

隔离性: 多个事务之间 相互独立

一致性: 事务操作前后 数据总量不变

6. 事务的隔离级别

多个事务之间保持隔离 互不影响 如果多个事务操作同一批数据 则会引发一些问题 设置不同的隔离级别就可以解决这些问题

a. 存在问题

1> 脏读: 一个事务 读取到另一个事务中没有提交的数据

2> 不可重复读(虚读): 在一个事务中 两次读取到的数据内容不一样 这是update时引发的问题

3> 幻读: 在一个事务中 两次读取到的数据数量不一样 这是insert或delete时引发的问题

b. 隔离级别

隔离级别越高 性能越差 安全性越高

1> read uncommitted 读未提交

  产生的问题: 脏读 不可重复读 幻读

2> read committed 读已提交 Oracle默认

  产生的问题: 不可重复读 幻读

3> repeatable read 可重复读 MySQL默认

  产生的问题: 幻读

4> serializable 串行化

  可以解决所有的问题

c. 查看数据库隔离级别

查看数据库隔离级别

  select @@tx_isolation;

修改数据库隔离级别 重新连接才会生效

  set global transaction isolation level 隔离级别字符串;

 

你可能感兴趣的:(MySQL)