美文网首页
MySQL基础

MySQL基础

作者: 一昂Jone | 来源:发表于2019-06-19 11:31 被阅读0次

    MySQL

    [TOC]


    注释

    • 单行注释: --
    • 多行注释 :/* */

    SQL分类

    • DDL :Data Definition Language 数据定义语言:create、drop、alert等
    • DML:Data Manipulation language 数据操作语言: insert、update、delete等
    • DQL:Data Query Language 数据查询语言:select、where等
    • DCL:Data Control Language 数据控制语言(定义数据库访问权限和安全级别以及创建用户):GRANT、REVOKE等

    操作数据:CRUD

    1. C(Create):创建

    2. R(Retrieve):查询

    3. U(Update):修改

    4. D(Delete):删除

      /*-----------------------数据库操作----------------------*/
      /*创建数据库*/
      create database 数据库名称;
      /*创建数据库,如果不存在的话*/
      create database if is not exists 数据库名称;
      /*创建数据库 并设置字符集*/
      create database 数据库名称 character set GBK;
      
      /*查询所有数据库的名称*/
      show databases;
      /*查询创建数据库的语法*/
      show create database mysql;
      /*查询某个数据库的字符集*/
      show create database 数据库名称;
      
      /*修改数据库的字符集*/
      alter database 数据库名称 character set 字符集;
      
      /*删除数据库*/
      drop database 数据库名称;
      drop database 数据库名称 if exists;
      
      /*查询当前正在使用的数据库*/
      seletct database();
      /*使用数据库*/
      use 数据库名称
      
      /*-----------------------表操作----------------------*/
      /*创建表*/
      create table 表名(列名1 数据类型,列名2 数据类型... );
      /*查询数据库中所有表的名称*/
      show tables;
      /*查询表结构*/
      desc 表名;
      /*复制表*/
      create table 表名 like 被复制的表;
      
      /*修改表名*/
      alter table 表名 rename to 新的表名;
      /*修改表的字符集*/
      alter table 表名 character set 字符集;
      /*添加一列*/
      alter table 表名 add 列名 数据类型;
      /*修改列名称 类型*/
      alter table 表名 change  列名 新列名;
      alter table 表名 modify  列名 新数据类型;
      alter table 表名 change  列名 新列名 新数据类型;
      /*删除列*/
      alter table 表名 drop 列名;
      
      /*删除表*/
      drop table 表名 if exists;
      
      
      

    MySql支持的数据类型

    基本增删改查

    
    /*-----------------------表中数据操作----------------------*/
    /*添加 如不定义列名,则默认给所有列添加值*/
    insert into 表名 (列名1,列名2....) values (值1,值2,...)
    
    /*删除 如无条件,则删除全部*/
    delete from 表名 where [where条件]
    /*删除表,再创建一个一样的新表 */
    truncate table 表名
    
    /*修改数据*/
    update 表名 set 列名1=值1,列名2=值2.... [where条件]
    
    /*查询排序 升序(默认):asc  降序 desc*/
    select * from 表名 order by 列名 排序方式
    

    查询:

    1. 排序

      • 升序(默认):asc

      • 降序:desc

        select * from 表名 order by 列名1 排序方式1,列名2 排序方式2 ... [where条件]
        
    2. 聚合函数

      • count :个数

      • max:最大值

      • min:最小值

      • sum:和

      • avg:平均值

        select count(*) from 表名 --查询条数,只要有一个值不为空就算一跳记录
        select count(列名) from 表名  --会排除null值
        select count(列名 ifnull(列名,默认值)) from 表名 --不排除null值,设置null时的默认值
        
    3. 分组 group by

      group by 分组字段

      having 分组后的限定条件

      select * from 表名 [where 条件] group by 分组条件 having [having 限定条件]; 
      

      where 和 having 的区别 :

      1. [where 条件] 分组前限定,并不可用聚合函数判断

      2. [having 限定条件] 分组后限定,可与聚合函数一起判断

        例: 查询学生表中,男女生数学成绩的平局值,要求:参与分组分数不得小于70人,且人数不少于2人

        select sex,avg(math),count(id)  from student where math>70 group by sex having count(id)>2;
        
    4. 分页 limit

      limit 开始的索引,每页的条数

      // 每页3条数据,查询第一页的数据
      select * from student limit 0,3
      
    5. 去重distinct

      //id去重
      select distinct id from student 
      //多个字段去重,只有多个字段完全一样才会被去重
      
    6. 模糊查询

      select * from student where name like "a%";
      //第二个字是a的
      select * from student where name like "_a%";
      //名字是三个字的
      select * from student where name like "___";
      //名字包含a的
      select * from student where name like "%a%";
      
    7. 其他基础

      >、<、>=、<=、=

      between..and

      in 集合

      like

      is null

      and 或者 &&

      or 或者 ||

      not 或者 !

    约束

    例子:

    CREATE TABLE stu(
        id INT PRIMARY KEY AUTO_INCREMENT,   --主键
        name VARCHAR(20) NOT NULL,   --非空
        phone VARCHAR(20) UNIQUE --唯一
        );
    
    1. 主键:primary key (非空且唯一,一张表只能有一个字段为主键)

      -- 添加主键
      ALTER TABLE stu MODIFY id INT PRIMARY KEY;
      -- 主键 无法用一下语句删除
      ALTER TABLE stu MODIFY id INT;
      -- 主键删除
      ALTER TABLE stu DROP PRIMARY KEY;
      -- 删除主键自增长
      ALTER TABLE stu MODIFY id INT;
      
    1. 非空约束:not null (字段不能为空)

      -- 添加非空约束
      ALTER TABLE stu MODIFY name VARCHAR(20) NOT NULL; 
      -- 删除非空约束
      ALTER TABLE stu MODIFY name VARCHAR(20) ;
      
    1. 唯一约束:unique (字段值唯一,注意MySQL中 null可有多个)

      ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE;
      -- 唯一约束 无法用一下语句删除
      ALTER TABLE stu MODIFY phone VARCHAR(20) ;
      -- 唯一约束正确的删除方式:
      ALTER TABLE stu DROP INDEX phone;
      
    2. 外键约束:foreign key

      语法: CONSTRAINT [外键名称] FOREIGN KEY ([本表的字段]) REFERENCES 外键链接的表名([链接表名中的字段])

      
      CREATE TABLE A(
       id INT PRIMARY KEY AUTO_INCREMENT
      );
      
      CREATE TABLE B(
       id INT PRIMARY KEY AUTO_INCREMENT,
       id_A INT,
       CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id)  -- 创建表时添加外键
      );
      
      
      -- 添加外键
      ALTER TABLE B ADD CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id)
      -- 删除外键
      ALTER TABLE B DROP FOREIGN KEY a_b_id;
      
      -- 级联操作 
      -- 1.级联更新  ON UPDATE CASCADE 
      -- 2.级联删除  ON DELETE CASCADE 
      ALTER TABLE B ADD CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id) ON UPDATE CASCADE ON DELETE CASCADE;
      
      

    数据库设计的三大范式

    第一范式(1NF):数据库表的每一列都是不可分割的原子数据项

    第二范式(2NF):在第一范式的基础上,实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性

    第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

    数据库备份与还原

    1. 备份: mysqldump -u用户名 -p密码 > 保存路径

      备份指定数据库: mysqldump -u用户名 -p密码 数据库名称 > 保存路径

    2. 还原:

      1. 登陆数据库
      2. 创建数据库
      3. 使用数据库
      4. 执行备份文件,source 文件路径

    多表查询

    笛卡尔积:多表查询,清除无用数据

    select * from table_a,table_b [where 条件]
    
    -- 为表取别名
    select * from table_a a,table_b b [where 条件]
    
    1. 内连接:查询多表交集部分

      • 隐式内连接:使用where 条件消除无用数据

        语法: select 字段列表 from table1,table2 where table1.id = table2.id

      • 显示内连接

        语法: select 字段列表 from table1 [inner] join table2 ON [条件] (inner 可省略)

    2. 外链接

      • 左外连接:查询的是左表的全部信息,以及与右表其交集部分

        语法:select 字段列表 from table1 left [outer] join table2 on [条件]

      • 右外连接:查询的是右表的全部信息,以及与左表其交集部分

        语法:select 字段列表 from table1 right [outer] join table2 on [条件]

    3. 子查询

      • 单行多列:作为条件使用运算符 >、<、=、>=、<=

      • 多行单列:作为条件运算符 IN

      • 多行多列:作为虚拟表进行多表联查

        select * from table1 t1,(select * from table2 [where]) t2 where table1.id = table2.id
        

    事务

    1. 事务概念:如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同事失败。

    2. 事务操作方式

      1. 开启事务:start transaction;
      2. 回滚:rollback;
      3. 提交:commit;
      -- 开启事务
      start transaction;
      -- 被事务管理的sql语句
      ...
      -- 执行通过
      commit;
      -- 出现问题,回滚事务  删除临时数据,回滚数据到开启事务之前
      rollback;
      
      

    关于数据提交需要注意的地方

    MySQL 中事务默认自动提交,Oracle 默认手动提交

    自动提交:增删改语句会默认自动提交,使数据持久化

    手动提交:开启事务的情况下,必须commit 手动提交,才能让数据持久化

    修改事务的默认提交方式:

    ​ 查询默认提交方式:select @@autocommit; -- 1 自动提交 2 手动提交

    ​ 修改默认提交方式:set @@autocommit=0;

    修改完成后每一条sql都需要手动更新

    1. 事务的四大特征

      1. 原子性:不可分割的最小操作单位
      2. 持久性:事务一旦提交或者回滚,会持久化保存数据
      3. 隔离性:多个事务之间相互独立
      4. 一致性:事务操作前后数据总量不变
    2. 事务的隔离级别

      用来处理多个事务处理同一批数据引发的一些问题

      存在问题:

      1. 脏读:一个事务读到另一个事务中没有提交的数据
      2. 不可重复读(虚度):同一个事务中,两次独到的数据不一样
      3. 幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务无法查询到自己的修改

      隔离级别:

      1. read uncommitted :读未提交

        问题:脏读、不可重复读、幻读

      2. read committed :读已提交(Oracle 默认) (只有提交了数据另一个事务才能读到)

        问题 : 不可重复读、幻读

      3. repeatable read : 可重复读(MySQL 默认)

        问题 : 幻读

      4. serializable:串行化 (锁表)

        解决所有存在的问题

      注意:隔离级别 安全性越来越高,效率越来越低

    关于数据库隔离级别设置:

    -- 查询事务的隔离级别
    select @@tx_isolation;
    -- 设置隔离级别
    set global transaction isolation level 级别字符串;
    

    数据库管理员

    1. 管理用户

      1. 添加用户

        语法:create user '用户名'@'主机名' identified by '密码';

      2. 删除用户

        语法:drop user '用户名'@'主机名';

      3. 修改用户密码

        语法:update user set password = password('新密码') where user ='用户名'

        或者:set password for '用户名'@'主机名' = password('新密码');

      4. 查询用户

        1. 切换到mysql数据库

          use mysql;

        2. 查询user 表

          select * from user;

    1. 管理权限

      1. 查询权限:show grants for '用户名'@'主机名';

      2. 授予权限:grant 权限列表 on 数据库.表名 to '用户名'@'主机名';

        授予所有权限:grant ALL on *.* to '用户名'@'主机名';

      3. 撤销权限: revoke 权限列表 on 数据库.表名 from '用户名'@'主机名';

    相关文章

      网友评论

          本文标题:MySQL基础

          本文链接:https://www.haomeiwen.com/subject/jjknvqtx.html