zoukankan      html  css  js  c++  java
  • 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 隔离级别字符串;

  • 相关阅读:
    DFS and BFS
    278. First Bad Version
    67. Add Binary
    Luogu3426 [POI2005]SZA-Template (KMP)(未完成)
    Luogu2375 [NOI2014]动物园 (KMP)
    Luogu3435 [POI2006]OKR-Periods of Words (KMP)
    Luogu4391 [BOI2009]Radio Transmission 无线传输 (KMP)
    Luogu2922 [USACO08DEC]秘密消息Secret Message (Trie树)
    Luogu2580 于是他错误的点名开始了 (Trie树)
    Luogu3375 【模板】KMP字符串匹配
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/13345598.html
Copyright © 2011-2022 走看看