MySQL_基础

MySQL概述

  • 数据库相关概念

    • 概念  
      • 数据库  dataBase
      • 数据库管理系统  DataBase Management System
      • SQL

人  → DBMS → DataBase

    • 主流的关关系型数据库
      • Oracle
      • MySQL 
      • Microsoft SQL Server
      • PostgreSQL
  • MySQL数据库

    • 安装部署
    • 启动与停止
      • services.msc 手动启动和停止
      • net start mysql80/ net stop  mysql80
    • 客户端连接
      • 方式一:MySQL提供的客户端命令行工具(MySQL 8.0 Command Line Client)
      • 方式二:系统自带的命令行工具:mysql [-h 127.0.0.0] [-P 3306] -u root -p pwd(必须配置环境变量)
    • 数据模型

Snipaste_2025-10-01_20-17-22

    • 数据库分类
      • 关系型数据库(RDBMS)
        • 概念:建立在关系的模型上, 有多张相互连接的二维表组成的数据库。
        • 特点:
          • 使用包存储数据,格式统一,便于维护。
          • 使用SQL语句操作,标准统一, 使用方便。
  • 图形化界面工具

    • sqlyog
    • navicat
    • DataGrip

SQL

  • SQL通用语法

    • 分号结尾
    • 不区分大小写,关键字建议使用大写
    • 注释
      • 单行注释:-- 或者# 
      • 多行注释:/* */
  • SQL语句分类

    • DDL   Data Definition Language   数据库定义语言

用来定义数据库对象(数据库、表 、字段)

      • 关于数据库操作语法

        查询
            查询所以数据库:SHOW DATABASES;
            查询当前数据库: SELECT DATABASE();
            查询当前数据库所有表 : show tables;
        创建
            创建数据库:CREATE  DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集]  [COLLATE 排序规则]
           示例:create database if not exists  accountApp default charset utf8;(utf8占3个字节, utf8mb4占4个字节)
        删除
            删除数据库: drop database if exists accountApp;
        使用
            use accountapp;
            select database();
      • 关于表操作的语法

      • 查询
            查询当前数据库所有表 : show tables;
           查询当前表中有哪些字段:DESC 表名;
        查询当前表的建表语句:SHOW CREATE TABLE 表名; 创建
        创建表:create table 表名(                  字段1 字段1类型 [comment 字段1注释],                  字段n 字段n类型 [comment 字段n注释]                  )[connent 表注释]; 删除 删除表: drop TABLE 表名; 修改 表结构修改语法:ALTER TABLE 表名 ADD/MODIFY/CHANGE(修改字段名称)/DROP/RENAME TO(修改表名)...;
      • 数据类型
        • 数值类型Snipaste_2025-10-02_23-00-48
        • 字符串类型
        • 日期时间类型
    • DML Data manipulation Languange  数据操作语言,

      • 用来对数据库中的表的数据记录进行操作。

      • 添加
          1、给指定字段添加数据     INSERT INTO 表名 (字段1, 字段2,...) VALUES(值1, 值2,...) 
          2、给全部字段添加数据
            INSERT INTO 表名 VALUES(值1,值2,...)
          3、批量添加数据
            INSERT INTO
        表名 (字段1, 字段2,...)ALUES(值1,值2,...),(值1,值2,...),(值1,值2,...)
            INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...)
        修改
           UPDATE 表名 地段1=值1, 字段2=值2 [WHERE条件]
        删除
           DELETE FROM 表名 [WHERE 条件] 
    • DQL 数据库查询语言

      • 用来查询数据库表中的记录

      • SELECT 
            字段列表
        FROM 
            表名
        //条件查询)
        WHERE     >, >=, < ,<=, = ,<>, like, between...and, in, and , or,
            条件列表
        //分组查询
            GROUP BY
                分组字段列表
        //条件列表
            HAVING
                分组后条件列表
        //排序
            ORDER BY
                排序字段列表        升序:ASC, 降序:DESC
        //分页参数
            LIMIT                     起始索引(从0开始),每页展示记录数

         

        示例:

        查询性别为男,年龄在200到40(含40)以内的5个员工信息,对查询的结果按年龄升序,年龄一样按入职时间升序。
        select * from tb_user where gender= '男' and age between 20 and 40 order by age asc, entrydata asc limit 5;
      • 聚合函数

        • count
        • max
        • min
        • avg
        • sum
    • DCL数据控制语言

用来管理数据库用户, 控制数据库的访问权限

      • 用户管理
                CREATE USER '用户名'@‘主机名’  IDENTIFIED BY '密码'ALTER USER '用户名'@‘主机名’  IDENTIFIED WITH mysql_native_password BY '密码'DROP USER '用户名'@‘主机名’ ;
        访问权限  
          GRANT 权限列表 ON 数据库名.表名 TO
        '用户名'@‘主机名’;
          REVOKE 权限列表 ON 数据库名.表名 FORM '用户名'@‘主机名’; 

函数

  • 字符串函数

    • 语法

      • select 函数(参数)
    • 函数

      • concat(s1, s2) 将字符串拼接
      • lower  str转小写
      • upper  str转大写
      • lpad(str, n, pad) 左填充
      • rpad(str, n, pad) 右填充
      • trim 去掉头尾空格
      • substring (str, start, len) 截取字符串
    • 示例

      • 企业员工工号同意为5位数。不够5位的全部在前面补0, 例如1号员工00001
        update tb_user  set workon = lpad(wokeno. 5, '0')
  • 数值函数

    • 语法

      • select 函数(参数)
    • 函数  

      • cerl 向上取整
      • floor 向下取整
      • mod(x,y) x/y取模
      • rand() 0-1的随机数  
      • round(x, y) 对x四舍五入,保留y个小数
    • 示例

      • 生成一个6位数的随机验证码
        select lpad(round(rand()*1000000), 0), 6, '0');的
  • 日期函数

    • 语法

      • select 函数(参数)
    • 函数

      • curdate()  当前日期
      • curtime() 当前时间
      • now() 当前日期和时间
      • year(date) 获取data的年份
      • month(date)
      • day(date)
      • date_add(date, increate expr type)  data上增加时间
      • datediff(date1, date2) 之间的天数
  • 流程函数 

    • 语法

      • select 函数
    • 函数

      • if(value,t, f)value未true, 返回他, 否则返回f
      • ifnull(value1,value2) value1不为空,返回value1,否则返回values2
      • case when [val] then [res] ... else [default] end; val为true返回热水, 否则返回default的默认值
      • case [expr] when [val] then [res] ... else [default] end; 如果expr的值等于val,返回res,否则返回default的默认值
    • 示例

      • 根据不同的分数定级
        select 
                id,  
                name
                 (case when math >= 85 then '优秀’  when math >= 60  then '及格' else '不及格' end)'数学',case when english>= 85 then '优秀’  when english>= 60  then '及格' else '不及格' end)'英语',case when chinese>= 85 then '优秀’  when chinese>= 60  then '及格' else '不及格' end)'语文',
             from score;            

约束

  • 概述

    • 概念:

作用在表中字段上的规则, 用于限制存贮在表中的数据

    • 分类

      • 非空约束  not  null
      • 唯一约束 unique
      • 主键约束 primary key 
      • 默认约束  default
      • 检查约束  check
    • 案例

      • image

        create table yueshu_user(
            id int primary key auto_increment comment '主键',
            name varchar(10) not null unique  comment '姓名',
            age int check ( age > 0 && age <= 120 ) comment '年龄',
            status char(1) default '1' comment '状态',
            gender char(1) comment '性别'
        )comment '用户表';
        
        insert into yueshu_user(name, age, status,gender) values ('t',19,'1',''),('t2',25,'0','');
    • 外键约束  foreign key 

      • 概念:

两张表数据之间建立连接,保证数据的一致性和完整性

      • 案例

        • image

        • 添加外键
          create table 表名{
            字段 数据类型
              ...
            [
          constraint] 外键名称 foreing key 外键字段名 peferences 主表(主表列名)
          }

          alter table 表名 add_constraint 外键名称 foreign key (外键字段) peferencrs 表名(主表列名)

          例如:
          alter table emp
          add constraint waijian foreign key(user_id) peferencrs tb_job(jobid)

          删除外键
          alter table emp drop foreign key waijian;
      • 删除更新行为

        • image

多表查询

  • 多表关系

    • 一对多(多对一)

      • 案例:部门与员工的关系,多个员工对应一个部门
      • 实现:在多的一方建立外键,指向一的一方的主键
        • image

           

    • 多对多

      • 案例: 学生与课程之间的关系
      • 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方的主键
      • image

    • 一对一

      • 案例:用户与用户详情的关系
      • 关系:一对一的关系,多用于多表拆分,将一张表的基础字段放在一张表中,其他详情信息放在另一张表中,以提升操作效率。
      • 实现:在任意一方加入主键,关联另一方的主键,并且设置外键的唯一性。
      • 原表
      • image
      •  拆分后

      • image

  • 多表查询

    • 笛卡尔积:

      两个结合A和B中所有组合情况。多表查询药消除这种情况。

      • 设置两张表中的ID相等
      • select * from student, course where course.id = student.id;
    • 分类 

      • 连接查询

        • 内连接: A和B的交集  
          • 隐式外连接
            • select  字段列表 from t1,t2  where ...
              例如:查询一个员工的姓名,并关联的部门名称
              sele t1.name,t2.name from t1, t2 where t1.id = t2.id;
          • 显示外连接
            • select  字段列表 from t1 [inner] join t2 on 链接条件
              例如:查询一个员工的姓名,并关联的部门名称
              select * from table1 t inner join table2 t2 on t1.id = t2.id;
        • 外连接
          • 左外连接
            • select 字段列表 from table1 left [outer] join  table2 on 条件
              
              例如:查询teble1中的所以数据,和对应的部门信息
              select t1.*, t2.name  from table1 t1 left outer join table2 t2 on t1.id = t2.id;
          • 右外连接
            • select 字段列表 from table1 left [outer] join  table2 on 条件
              
              例如:查询teble2中的所以数据,和对应的员工信息
              select t2.*, t1.*  from table1 t1 right outer join table2 t2 on t1.id = t2.id;
        • 自连接
          • select 字段列表 from table1 别名1 join  table1 别名2 on 条件
            例如:查询员工及其所属领导的ID
            select t1.name , t2.name from table1 t1  join table1 t2 where t1.mangerid = t2.id;
            
            
            查询所有员和领导的名字,如果员工没有领导,也要查出来
            select t1.name '员工', t2.name ‘领导’  from table t1 left join table t2 on t1.manageid = t2.id;
      • 联合查询

        • 就是把多次查询的结果合并起来, 形成一个新的查询结果集
        • select 字段列表  from  表A
          union [all]
          select 字段列表  from  表B
          
          例如:将薪资低于5000的员工和年龄大于50的员工全部查询出来
          
          直接合并
          select & from emp where slary <5000
          union all 
          select & from emp where age > 5000;
          
          合并之后去重
          select & from emp where slary <5000
          union  
          select & from emp where age > 5000;

           

        • 多张表的列数必须保持一致,字段类型也要保持一致。

      • 子查询

        • SQL中嵌套select语句,称为嵌套语句,也称为子查询。
        • 分类
          • 标量子查询:子查询的结构为单个数
            • select * from emp where dept_id = (select  id from dept where  name ='销售部')
          • 列子查询:子查询结果为一列
            • image

            • 查询销售部和市场部的所有员工信息
              select * from emp where dept_id in (
              select ID from dept whereh name='销售部' or Name = '市场部';)
              查询比财务部所有人工资都高的员工信息

              select * from emp where salary > all(
              select salsry from emp where dept_id = (select id from dept where name = '财务部' );)
              查询比市场部其中任意一个工资高的员工信息
              select * from emp where salary > any (select salsry from emp  where dept_id = (select id from dept where name = '财务部' ););
              select * from emp where salary > some(select salsry from emp  where dept_id = (select id from dept where name = '财务部' ););
          • 行子查询:子查询的结果为一行
            • 操作符:= ,<>, in , not in,
            • 查询 某的薪资及其直属领导相同的员工信息
              select * from emp where (salary,manageid) = (select salsry, mainageid from emp where name = ‘某’;);
          • 表子查询:子查询的结构为多行多列
            • 操作符:in
            • 查询与a和b 的职位和薪资相同的员工信息。
              select * from emp where (job, salary) in (select Job, salary from emp where name = 'a' aor name = 'b';);

事务

  • 简介

  事务是一组操作的集合, 他会把所有的操作作为一个整体提交或撤销造作请求,即这些操作要么同事成功,要么同事失败。

  • 事务操作

    • 查看/设置事务调教方式

      • select @@autocommit; 查看事务提交方式
        set @@autocommit = 0; 修改事务提交方式
        0为自动,1为自动。
    • 提交事务

      • commit;
    • 回滚事务

      • rollback;
    • 开启事务

      • start transaction 或者 begin
  • 事务四大特性

    • 原子性

事务最小操作单元,要么全部成功, 要么全部失败

    • 一致性

事务完成时,必须是所有的数据都保持一致状态。

    • 隔离性

数据库系统提供的隔离机制,保证室外在不受外界并发操作影响的独立环境下运行。

    • 持久性

事务一旦提交或回滚, 他对数据库中数据的操作是永久的。

  • 并发事务问题

    • 脏读

      • 一个事务读到另一个事务还没有提交的数据
    • 不可重复

      • 一个事务先后读取同一条记录,但是两次读取的数据不同。
    • 幻读

      • 一个事务按照条件查询数据时,没有对应的数据行,但是在插入前又发现数据已经存在, 好像出现了幻影。

 

  • 事务隔离级别

    • 隔离级别

      • image

      • read uncommit
      • read commit
      • repeatable read(默认)
      • serializable 
    • 查看事务级别

      • select @@transaction_isolation
    • 设置事务的隔离级别

 

      • set [session | globle] transaction isolation leveal {read uncommit | read commit | repeatable read | serializable};
        例如:
        set session  transaction isolation level repeatable read ;

         

 

posted @ 2025-10-03 21:10  直至成伤  阅读(13)  评论(0)    收藏  举报