美文网首页
MYSQL数据库

MYSQL数据库

作者: 开心的小哈 | 来源:发表于2022-02-14 12:41 被阅读0次
    1. 安装-见百度
    2. 卸载
    • 去mysql的安装目录找到my.ini文件 复制 datadir=“C:/pro。。。。。”
    • 卸载mysql
    • 删除datadir目录下的mysql文件夹
    1. 配置
    • mysql服务启动
      • 手动。cmd-》 services.msc打开服务的窗口
      • net stop mysql
    • mysql登录
      • mysql -uroot -p
      • mysql -uroot -p密码
      • mysql -h127.0.0.1 -uroot -p
    • mysql退出quit,exit
    • mysql目录结构
      1.mysql安装目录
      配置文件my.ini
      2.mysql数据目录
      几个概念:1,数据库:文件夹2,表:文件,3.数据:文件里存储的数据
    1. 操作SQL
    • 什么是SQL?
      Structured Query Language :结构化查询语言
      其实就是定义了操作所有关系型数据库的规则(每一种数据库的操作方式存在不一样的地方,称为‘方言’)
    • SQL通用语法
      SQL语句可以单行或多行书写,以分号结尾。
      可以使用空格和缩进进来增强语句的可读性
      mysql数据库的SQL语句不区分大小写,关键字建议使用大写
    • 2种注释
      1.单行注释:-- 注释内容 或 # 注释内容(mysql特有)
      2.多行注释: /* 注释 */
    • SQL分类
      1. 数据定义语言DDL(Data Definition Language)
        CREATE,DROP,ALTER
        主要为创建、修改、删除数据库的逻辑结构,其中包括表结构,视图和索引等。
        创建、删除数据库:CREATE DATABASE; DROP DATABASE
        创建、修改、重命名、删除表:CREATE TABLE; ALTER TABLE; RENAME TABLE; DROP TABLE;
        创建和删除索引:CREATE INDEX; DROP INDEX
      2. 数据查询语言DQL(Data Query Language)
        SELECT
        用于数据库中数据的检索查询。各种简单查询,连接查询等都属于DQL。
      3. 数据操纵语言DML(Data Manipulation Language)
        INSERT,UPDATE,DELETE
        主要用于数据库中数据的修改,包括添加、删除、修改等
        插入数据到一个表中:INSERT语句
        更新表中已有的数据:UPDATE语句
        删除表中的数据:DELETE语句
      4. 数据控制语言DCL(Data Control Language)
        GRANT,REVOKE,COMMIT,ROLLBACK
        主要为数据库访问权限控制,给用户授予访问权限:GRANT语句,取消授权:REVOKE
      5. 事务控制语言TCL(Transaction Control Language)
        BEGIN,SAVEPOINT xxx,ROLLBACK,ROLLBACK TO xxx,COMMIT
        用于提交事务和回滚事务,维护数据的一致性

    DDL:操作数据库,表

    1. 操作数据库:CRUD
      1.C(Create):创建 create database db1;
      先判断是否存在如果存在则不进行创建,如果不存在则进行创建:create database if not exists db2;
      修改字符集character set gbk:create database if not exists db3 character set gbk;
      2.R(Retrieve)查询
      查询所有数据库的名称:show databases;
      查询创建mysql的语法:show create database 数据库名称;
      3.U(Update)修改
      修改数据库的字符集:alter database 数据库名称 character set 字符集名称;alter database db3 character set utf8;
      4.D(Delete)删除
      drop database 数据库名称;
      判断数据库存在如果存在则进行删除
      drop database if exists 数据库名称
      5.使用数据库
      查询正在使用的数据库名称: select database();
      使用数据库use 数据库名称;
    2. 操作表
      1.C(Create)创建
      create table 表明(列名1 数据类型1,列名2 数据类型2)注意最后一列不需要加,号
      数据类型: 整形int 小数类型double(5,2)五位,保留小数点2位,date日期:年月日,datetime日期:年月日时分秒,timestamp时间戳类型,如果不赋值则默认使用当前系统时间;字符串类型varchar(20)字符最大长度20字符;张三是两个字符,zhangsan是8个字符
      create table student(id int,name varchar(32),age int,score double(4,1),birthday date,insert_time timestamp);
      复制表:再创建已经存在的表: create table stu like student;
      2.R(Retrieve)查询
      查询某个数据库中所有表名称:show tables;
      查询表结构:desc 表名;
      3.U(Updata)修改
      修改表名:alter table 表名 rename to 新表明
      修改表的字符集,查看字符集:show create table sut;,修改字符集alter table sut character set gbk;
      添加一列
      alter table 表名 add 列名 数据类型;alter table sut add gender varchar(10);
      删除一列
      alter table sut drop sex;
      修改名称 类型
      alter table sut change gender sex int;
      只修改类型
      alter table sut modify sex varchar(10);
      注意:
      --SQLserver中需要使用该语句进行修改
      alter table stu alter column name varchar(40)
      4.D(Delete)删除
      drop table 表名;
      drop table if exists 表名
      客户端图形化工具:sqlyog

    DML 增删改表中数据

    1. 添加数据
      语法:insert into 表名(列名1,列名2)values(值1,值2);
      注意:列名和值要一一对应。如果表名后,不定义列名,则默认给所有列添加值
      insert into 表名 values(值1,值2.。。。。)
      除了数字类型其他类型需要使用引号引起来单引号双引号都可以英文的哦;
    2. 删除数据
      delete from 表名 [where 条件]
      delete from sut where id=1;
      注意:1.如果不加条件则删除表中所有记录。
      delete from 表名 --不推荐使用,有多少条就会执行多少次删除操作;
      truncate table 表名;--推荐使用,效率高先删除表,然后再创建一个一摸一样的空表
    3. 修改数据
      update 表名 set 列名1=值1,列名2 值2,....[where 条件];
      注意如果不加任何条件则会修改所有值
      update 表名 set 列名1=值1

    DQL 查询表中的记录

    select * from 表名;
    语法:select
    字段列表 form
    表名列表
    where
    条件列表
    group by
    分组字段
    having
    分组之后的条件
    order by
    排序
    limits
    分页限定
    2.基础查询
    1.多个字段的查询
    select 字段名1,字段名2,。。。from 表名;
    注意如果查询所有字段则可以使用*进行代替
    2.去除重复
    distinct
    3.计算列

    一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
    计算注意:
    1.如果有null参与的运算,计算结果都为null,那么如何避免?
    ifnull(表达式1,表达式2)null参与计算的结果都为null
    表格式1,那个字段需要判断是否为null
    表达式2,如果该字段为null后则替换值。
    1.查询年龄等于20岁
    select * from student where age =20;
    查询年两不等于20岁
    select * from student where age != 20;
    select * from student where age <>20;
    查询年两大于等于20,小于等于30
    select * from student where age >= 20 && age <=30;
    select * from student where age >= 20 and age <=30;
    select * from student where age between 20 and 30;
    查询等于22岁,18,25岁的信息;
    select * from student where age = 22 or age =18 or age =25;
    select * from student where age in(22,18,25);
    查询英语成绩为null
    select from student where english=null;--不对的,null不能使用=(!=)判断
    select * from student where english is null;
    查询英语成绩不为null
    select * from student where english is not null;--是否可以使用 is not 22?
    查询姓名第二个字时化的人
    select * from student where name like "化%";
    查询名字是3个字的人
    select * from student where name like "
    __";
    查询名字中包含化的人
    select * from student where name like "%化%";
    排序
    select * from student order by math asc;(asc正序,desc倒叙)
    select * from student order by math desc;
    按照数学成绩排名,如果数学成绩一样,则按照英语成绩排名
    select * from student order by math asc,english asc;
    注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件;
    4.起别名
    as as也可以是省略
    select 书名 from books;
    --去除重复的结果集
    select distinct 书名 from books;
    3.条件查询
    1.where子句后面跟条件
    2.运算符
    聚合函数:将一列数据作为一个整体,进行纵向计算
    1.count计算个数,一般选择非空的列:主键count(
    )
    2.max计算最大值,min计算最小值
    3.sum计算和
    4.avg计算平均值
    注意:聚合幻术的计算,排除null值.
    解决方案:1.选择不包含非空的列进行计算,2.ifnull函数

    3.分组查询
    1.语法:group by 分组字段;
    2.注意:1.分组之后查询的字段:分组字段,聚合函数,2.where和having的区别?1.where在分组之前进行限定,如果条件不满足,则不参与分组.having在分组之后进行限定,如果不满足结果,则不会被查询出来;
    2.where后不可以跟聚合函数,having可以使用聚合函数的判断;?

    按照性别分组,分别查询男,女同学的平均分
    select sex,avg(math) from student group by sex;
    按照性别分组,查询男,女的平均数,人数
    select sex avg(math) ,count(id) from student group by sex;
    按照性别分组,分别查询男,女同学的平局分,人数,要求低于70分的人,不参与分组
    select sex, avg(math),count(id) from student where math>70 group by sex;
    按照性别分组,分别查询男,女同学的平局分,人数,要求低于70分的人,不参与分组,分组之后人数要大于2个人
    select sex, avg(math),count(id) from student where math>70 group by sex having count(id)>2;

    4.分页查询
    语法:limit 开始的索引,每页查询的条数;
    2.公式:开始索引=(当前的页码-1)*
    --每页显示3条记录
    --分页
    select * from books limit 0,3;--limit是mysql的方言

    约束

    • 概念:对表中的数据进行限定,保证数据的正确性,有效性和完整性。
    • 分类:
      1. 主键约束:primary kay(可以配合auto_increment进行自增长)
      2. 非空约束:not null
      3. 唯一约束:unique
        4.外键约束:foreign key
    • 非空约束:not null 某一列的值不能为null
      1. 创建表时添加约束
        create table stu(id int, name varchar(40) not null);
        insert into stu values(1,null);--报错
        drop table stu;
      2. 创建表完成后,添加非空约束
        create table stu(id int, name varchar(40));
        insert into stu values(1,null);--成功
        --alter table stu modify name varchar(40),not null;--modify为MySQL的方言
        --alter table stu change name varchar(40),not null;--modify为MySQL的方言
        alter table stu alter column name varchar(40) not null;--插入时的表里数据如果有已存在的null值则不能加该约束语句
      3. 删除name的非空约束
        alter table stu alter column name varchar(40);
        update stu set name =0 where name is null;
        insert into stu(id,name)values(1,null);
    • 唯一约束:unique,某一列的值不能重复
      注意唯一约束可以有null值,但只能有一条记录为null
      1. 在创建表时,条件唯一约束
        create table stu(id int,phone_number varchar(11) unique);
      2. 删除唯一约束
        --alter table stu change phone_number phone_number varchar(40);--modify为MySQL的方言(删除唯一约束不可可以使用该方式哦)
        mysql删除方式
        alter table stu drop index name;
        alter table stu drop constraint UQ__stu__A1936A6B95E015AE;--SQLserver需要这样删除哦要得到该表的唯一约束id
      3. 在表创建完成后,添加唯一约束
        alter table stu change name name varchar(20) unique;
        alter table stu modify name varchar(40) unique;
    • 主键约束:primary key
      1. 注意:含义非空并且唯一,一张表只能有一个字段为主键,主键就是标轴记录的唯一标识
      2. 在创建表时,添加约束
        create table stu(id int primary key ,name varchar(20));
      3. 删除主键
        错误的方式 alter table stu modify id int;或者change id id int 都不行
        需要使用:alter table stu drop primary key;
      4. 创建完成后添加主键
        alter table stu modify id int primary key;
    • 自动增长
      1. 概念:如果弄一列数值类型的,使用auto_increment可以完成值的自动增长
        规则增长的值会根据上一行的数据进行增加;
      2. 在创建表时,添加主键约束并且完成主键自增长
        create table stu(id int primary key auto_increment,name varchar(20));
      3. 删除自增长
        alter table stu modify id int ;
      4. 创建完成后添加自增长
        alter table stu modify id int auto_increment;
    • 外键约束:foreign key
      概念:让表与表产生关系,从而保证数据的正确性
      1. 创建表时,可以添加外键
        create table a(id int primary key auto_increment,name varchar(20));

    create table b(id int primary key auto_increment,name varchar(20) ,pa_id int,constraint ap foreign key (pa_id) references a(id));

    1. 删除外键
      alter table b drop foreign key ap;
    2. 创建之后添加外键
      alter table b add constraint ap foreign key (pa_id) references a(id);
    3. 级联操作
      1. 添加级联操作
        语法:alter table b add constraint av foreign key (pa_id) references a(id) on update cascade on delete cascade;
      2. 分类:
        级联更新:on update cascade
        级联删除:on delete cascade

    数据库的设计

    多表之间的关系

    1. 分类:
      1. 一对一:
        如身份证号和人,一个人只能有一个身份证号
      2. 一对多:
        如:部门和员工,一个部门有多个员工
      3. 多对多:
        如:学生与课程表,一个学生可以选择很多课程,一个课程可以有很多学生
    2. 实现关系:
      1. 一对多:在多的一方建立外键,指向一的一方的主键。
      2. 多对多:多对多实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外联,分别指向两张表的主键;
        注意多对多连接后还可以添加联合主键进行约束数据组合不重复:如一个文件不能收藏两边:
        A表用户,B表书本
        A收藏B,需要C第三张表
        第三个表创建语句
        create table c(aid int ,date datetime,bid int,
        --创建符合主键
        primary key(aid,bid),
        foreign key(aid) references a(id),
        foreign key(bid) references b(id)
        );
      3. 一对一:可以在任意一方添加唯一外键指向另一方的主键。一般存在在一张表中
    3. 数据库设计的范式
      在设计数据库时,需要遵循的一些规范。
    • 数据库设计规范
      设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
      关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
    • 分类:
      1. 第一范式(1NF):每一列都是不可分割的原子数据项
      2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
      • 几个概念:
        1. 函数依赖:A-->B,如果通过A属性(属性组),可以确认唯一B属性的值。称为B依赖于A
          例如:学号-->姓名。(学号,课程名称)-->分数
        2. 部分函数依赖:A-->B,如果A时一个属性组,则B属性值得确定需要依赖于A属性组中某一些值即可。
          例如:(学号,课程名称)--> 姓名
        3. 完全函数依赖:A-->B,如果A时一个属性组,则B属性值得确定需要依赖于A属性组所有的属性值。
          例如:(学号,课程名称)-->分数
        4. 传递函数依赖:A-->B,B-->C,如果通过A属性(属性值)的值,可以确认唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
          例如:学号-->系名,系名-->系主任;
        5. 码:如果在一张表中,一个属性或属性组,被其他属性完全依赖,则称这个属性(属性组)为该表的码
          例如:该表码为(学号,课程名称)
        • 主属性:码属性组中的所有属性
        • 非主属性:除过码属性组的属性
      • 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
      • 举个例子
      1. 第一范式


        image.png
      2. 第二范式


        image.png
      3. 第三范式


        image.png

    数据库的备份和还原

    保存的就是该数据表中的所有数据及表结构的sql命令

    1. 命令行:
      1. 备份:mysqldump -u 用户名 -p 密码 要保存的数据库> 保存的路径
      2. 还原:
        1. 登录数据库
        2. 创建数据库
        3. 使用数据库
        4. 执行文件SOURCE 文件路径
    2. 图形化工具:
    • 多表查询
    1. 隐士连接:
      select
      t1.name --员工的姓名
      t1.gender --员工的性别
      t2.name --部门表的名称
      from
      per t1,
      dept t2
      where
      t1.'dept_id'=t2.'id';

    2. 显示内连接:
      语法:select 字段列表 from 表1 inner join 表2 on 条件

      1. 从那些表中查询数据
      2. 条件是什么
      3. 查询那些字段
    3. 外连接查询:

      1. 左连接:语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
        查询的是左表所有数据以及其交集部分。
      2. 右链接:语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
        查询的是右表所有数据以及其交集部分。
    4. 子查询:
      概念:查询中嵌套查询,称嵌套查询为子查询。
      查询工资最高的员工信息

      1. 查询最高的工资是多少
        select max(salary) from emp;
      2. 查询员工信息,并且工资等于9000的
        select * from emp where emp.'salary'=9000;
      3. 一条语句就执行完这个操作查询员工最高工资的人并且还要展示员工信息,
        select * from emp where emp.'salary'=(select max(salary)from emo);
        子查询不同情况
    5. 子查询的结果时单行单列的:

      1. 子查询可以作为条件,使用运算符去判断。运算符:>>=<<==
      2. 查询员工工资小于平均工资的人:select * from emp where emp.salary<(select avg(salary) from emp);
    6. 子查询的结果时多行单列的:

      1. 子查询可以作为条件,使用运算符in来判断,查询‘财务部’和市场部的所有员工的信息:select *from emp where dept_id in(select id from dept where name ='财务部' or name=‘市场部');
    7. 子查询结果时多行多列的:

      1. 子查询可以作为一张虚拟表

        查询员工入职日期时2011-11-11日之后的员工信息和部门信息

        select *from dept t1,(select *from emp where emp.join_date >'2011-11-11') t2 where t1.id=t2.det_id;

      2. 普通内链接

        select * from emp t1,dept t2 where t1.'dept_id'=t2.'id' and t1.'join_date'>'2011-11-11';

    事物

    1. 事务的基本介绍
      如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
      操作:
      开启事务:start transaction;
      回滚:rollback;
      提交:commit;
      例子:
      创建一个张三,李四的表
    id name balance
    1 zhangsan 1000
    2 lisi 1000

    交易过程,
    1,将张三的金额-500
    update accoun set balance=balance-500 where name='zhangsan';
    2.将李四的金额+500
    update accoun set balance =balance+500 where name='lisi';
    注意进行修改时发生错误(如果数据库处于安全模式下safe-updates模式下该模式会导致非主键条件下无法执行update或者delete命令。)
    解决方案:1,修改数据库模式,2,使用id进行操作

    update accoun set balance=balance-500 where id=1;
    123123中间存在错误问题
    update accoun set balance =balance+500 where  id=2;
    

    执行结果展示为

    id name balance
    1 zhangsan 500
    2 lisi 1000

    张三减去500但李四没有增加500导致出现数据问题,为了避免该问题增加事务进行处理
    在操作之前:张三减去500之前

    update accoun set balance =1000 where id=1 or id=2;
    start transaction;
    update accoun set balance=balance-500 where id=1;
    123123
    update accoun set balance =balance+500 where  id=2;
    rollback;
    commit;
    

    在mysql数据库中事务默认自动提交
    一条DML(增三改)语句会自动提交一次事务;
    事务提交的两种方式,一种是自动提交:mysql就是自动提交的,一条DML语句就会提交一次,一种是手动提交,需要开启事务,再提交;
    修改事务的默认提交方式:set @@autocommit=0;
    查看事务的默认提交方式:select @@autocommit; 结果1是自动提交,结果0是手动提交;

    1. 事务的四大特征:
      1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;c
      2. 持久性:当事务提交或回滚后,数据会持久化的保存数据;
      3. 隔离性:多个事务之间。相互独立;
      4. 一致性:事务操作前后,数据总量不变;
    2. 事务的隔离级别(了解)
      • 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
      • 存在的问题:
        1. 脏读:一个事务,读取到另一个事务中没有提交的数据;
        2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
        3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一个条数据,则第一个事务查询不到自己的修改。
      • 隔离级别:
        1. read uncommitted:读未提交:产生的问题:脏读,虚读,幻读 ;
        2. read committed : 读已提交:虚读,幻读 ;(Oracle 默认)
        3. repeatable read :可重复读:幻读;(MySQL默认)
        4. serializable:串行化:可以解决所有的问题;
      • 注意:隔离级别从小到大安全性越来越高,但效率越来越低‘
      • 数据库查询隔离级别:select @@tx_isolation; 8.0以上使用select @@transaction_isolation;
      • 数据库设置隔离级别:set transaction isolation level 级别字符串;

    DCL:管理用户,授权

    • DBA:数据库管理员
    1. 管理用户
      1. 添加用户:create user '用户名'@'192.168.1.11主机地址' identified by '密码';
      2. 删除用户:drop user 'zhangsan'@'%';
      3. 修改用户密码:
        mysql8.0以前使用:update user set password =password('b123456') where user='zhangsan';
        set password for 'zhangsan'@'%' =PASSWORD('c123456');
        8.0以后使用:alter user 'zhangsan'@'%' identified by 'b123456';
      4. 查询用户: 1.切换到mysql数据库,use mysql;2.查询user表,select * from user;
        通配符#表示任何主机可以使用用户登录数据库;
    • 在MySQL中忘记了root用户密码怎么办?
      1. cmd-->net stop mysql 停止MySQL服务;或者通过服务页面停止mysql的服务
      2. 使用无验证方式启动MySQL服务:MySQL--skip-grant-tables
      3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
      4. alter user 'root'@'%' identified by 'b123456';
      5. 关闭两个窗口
      6. 打开任务管理器手动结束mysqld.exe的进程
      7. 启动MySQL服务
      8. 使用新密码登录
    • 授权
      1. 查询权限:show grants for 'root'@'localhost';
      2. 授予权限:grant 权限列表 on 数据库名.表名 to 'root'@'localhost';
        授予查询权限:grant select on db1.stu to 'zhangsan'@'%';
        授予全部权限:grant all on *.* to 'root'@'localhost';
      3. 撤销权限:revoke 权限列表 on 数据库.表名 from 'root'@'localhost';
        插销查询权限:revoke select on db1.stu from 'zhangsan'@'%';
        注意:%号代表任何一个ip地址即可访问,
        默认root是localhost的可以修改成%即可在其他电脑上进行访问;
        UPDATE user SET `Host` = '%' WHERE `User` = 'root' LIMIT 1;
        强制刷新权限:flush privileges;

    相关文章

      网友评论

          本文标题:MYSQL数据库

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