• MySQL数据库:基础部分


    文章目录

    前言

    学完了MySQL基础部分,然后进行复习巩固,就写了这篇博客(好累!!),jdbc部分还没写完,就先发这么多吧!

    MySQL的数据类型

    MySQL 是一个 “关系数据库”,通过表的形式来组织数据;

    表的特点是"特别整齐",
    每一行,列数都是一样的;
    每一列,数据都是同类的(数据类型相同).

    数据类型:
    一方面能够方便我们对数据进行处理;
    一方面也能够针对数据进行校验和检查.

    一、数字类型(整数+小数)

    数据类型大小说明对应的Java类型对应的C类型
    BIT[(M)]M指定位数,默认为1二进制数,M:1 ~ 64,存储范围,0 ~ 2M-1常用Boolean对应BIT,此时默认为1位,即只能存储0和1char[]
    TINYINT1字节Bytesigned char
    SMALLINT2字节Shortshort int
    INT4字节integerint
    BIGINT8字节Longlong long int
    FLOAT(M,D)4字节单精度,M指定长度,D指定精度位数,会发生精度丢失Floatfloat
    DOUBLE(M,D)8字节Doubledouble
    DECIMAL(M,D)M+2双精度,M指定长度,D指定小数点位数,精确数值BigDecimalchar[]
    NUMERIC(M,D)M+2同上BigDecimalchar[]

    二、字符串类型

    数据类型大小说明对应的Java类型对应的C类型
    VARCHAR(SIZE)0 ~ 65 535字节可变长度字符串Stringchar[]
    TEXT0 ~ 65 535字节长文本数据Stringchar[]
    MEDIUMTEXT0 ~ 16 777 215字节中等长度文本数据Stringchar[]
    BLOB0 ~ 65 535字节二进制形式的长文本数据Byte[]char[]

    1、VARCHAR

    VARCHAR(SIZE)所对应的数据所占用的字节数为实际长度加1;
    例如:
    输入"abcd",用 VARCHAR(3) 存储,则为 “abc” ,4个字节.

    三、时间日期类型

    数据类型大小说明对应的Java类型对应的C类型
    DATETIME8字节(1000-01-01 00:00:00~9999-12-31 23:59:59),不会进行时区的检索和转换java.util.Data、java.sql.TimestampMYSQL TIME
    TIMESTAMP4字节(1970-01-01 00:00:01~2038-01-19 03:14:07),自动检索当前时区进行转换java.util.Data、java.sql.TimestampMYSQL TIME

    1、DATETIME

    DATETIME 类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,
    其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。

    • 可以用’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,YY表示年,取值范围为’00’—‘99’。‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。
    • NOW:输人当前系统的日期和时间。

    2、TIMESTAMP

    TIMESTAMP 类型用于表示日期和时间,它的显示形式与 DATETIME 相同但取值范围比 DATETIME 小。

    • CURRENT_TIMESTAMP:输人系统当前日期和时间。

    数据库的基本操作

    一、创建数据库

    1、语法

    create database 数据库名称;
    
    • 1

    2、举例

    成功案例:
    在这里插入图片描述
    错误案例:
    在这里插入图片描述

    3、注意

    • 不要拼写错误;
    • 关键字不区分大小写;
    • 不要遗忘分号(英文);

    二、显示数据库

    1、语法

    show databases;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • "databases"为复数,不要拼错;

    三、选中数据库

    1、语法

    use 数据库名称;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • 注意分号,大部分 SQL 如果不带分号会出现问题,但有少数 SQL 可以不带分号,一般都带上分号;

    四、删除数据库

    1、语法

    drop database 数据库名称;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • 数据库删除操作,非常危险:程序员和代码,有一个能跑就行!
    • 不要轻易的操作!

    4、原理

    逻辑删除:
    操作系统为了方便进行管理,把整个硬盘分成了若干个"盘块";
    每个盘块都可以保存一定的数据;
    每个文件,实际上可能是由一个或者多个盘快上面的数据来构成的;

    当操作系统删除文件的时候,为了提高删除动作的效率,在删除的时候并不是真的把硬盘上之前保存的数据删除掉,而只是把该文件对应的盘块标记为“无效”。

    一旦出现误删库的情况,就要尽快让主机断电!!!
    这样可以避免操作系统把这些被标记成无效的盘块给分配出去!!!

    数据表的基本操作

    一、创建表

    1、语法

     create table 表名(
             字段1 字段类型,
             字段2 字段类型,
             …
             字段n 字段类型
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、举例

    在这里插入图片描述

    3、注意

    • 变量名写在前,类型写在后;
    • 要想创建表,首先得选中数据库;
    • 同一个数据库中,不能有两个名字相同的表;
    • 创建表的时候,表名或者列名,不能和 SQL 的关键字冲突,但可以使用反引号 ` 引起来;

    二、查看表

    1、语法

    show tables;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • 注意 “tables” 为复数;

    三、查看表结构

    1、语法

    desc 表名;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • Field:每一列都是一个字段,Field(表示表这里有几列);
    • int(11):11表示的是打印数字的时候,显示数据的宽度最大是11位数,只是影响在客户端中的显示,不影响数据的存储和计算;
    • Null:这一列是否可以为空(不填,选填项);
    • Key:约束;
    • Default:默认值约束,默认的默认值是 NULL(不填),也能手动修改;
    • Extra:其他约束;

    四、删除表

    1、语法

    drop table 表名;
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • 删表操作非常危险!!!危害比删库只多不少!

    MySQL的增删改查

    一、新增元素(Create)

    1、语法

    ①所有字段插入数据

    insert into 表名 values (1,2,...);
    
    • 1

    ②指定字段插入数据
    (字段名1,字段名2,…):用于指定插人的字段名;

    insert into 表名 (字段名1,字段名2,...) values (1,2,...);
    
    • 1

    ③同时插入多条数据
    (值 1,值 2,…),(值 1,值 2,…):表示要插人的数据,以逗号 “ , ” 分割;

    insert into 表名 [(字段名1,字段名2,...)]values (1,2,),(1,2,),...;
    
    • 1

    2、举例

    ①所有字段插入数据
    在这里插入图片描述
    ②指定字段插入数据
    在这里插入图片描述
    ③同时插入多条数据
    在这里插入图片描述

    3、注意

    • 此处的值的个数要和表的列数匹配,值的类型也要和列的类型匹配;
    • “一次插一条,插多次” 比 “一次插多条,插一次”速度慢的多;

    二、查询元素(Retrieve)

    1、查询所有字段

    ①语法

    select * from 表名;
    
    • 1

    ②举例

    在这里插入图片描述

    ③注意

    • 星号 “ * ” 是 通配符,表示匹配任意的列。(所有的列)
    • MySQL是客户端服务器结构的程序,在此处看到的这个表(临时表)只是在客户端这样显示,并不是在服务器上存了这样一个表;
    • 查询的列越多,意味着需要传输的数据量越大;
    • 可能会影响到索引的使用 ;

    2、指定列查找

    ①语法

    select 列名1,列名2,... from 表名;
    
    • 1

    ②举例

    在这里插入图片描述

    ③注意

    • 临时表显示的列名,完全取决于 select 指定的列名,临时表会尽可能的保证显示结果正确;
    • 指定列的顺序不需要按定义表的顺序来;

    3、表达式查找

    ①语法

    select 表达式 from 表名;
    select 表达式 as 别名 from 表名;
    
    • 1
    • 2

    ②举例

    在这里插入图片描述

    ③注意

    • 在 SQL 中,如果 NULL 和其他类型进行混合运算,结果仍为 NULL

    4、过滤重复数据

    ①语法

    select distinct 列名 from 表名;
    
    • 1

    ②举例

    在这里插入图片描述

    5、排序查询

    ①语法

    -- 升序
    select 列名 from 表名 order by 列名;
    select 列名 from 表名 order by 列名 asc;
    -- 降序
    select 列名 from 表名 order by 列名 desc;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ②举例

    在这里插入图片描述

    ③注意

    • 指定多个列排序:先以第一列为标准进行排序;如果相同,再按照第二列进行比较;以此类推;
    • 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序;
    • NULL 数据排序,视为比任何值都小,升序出现在最上面降序出现在最下面
    • 查询过程中,表达式查找以及排序查找,仅仅针对临时表,对于数据库上的数据没有影响
    • 排序查找中,降序排列的 desc“descending” 的缩写;而查看表结构的 desc“describe” 的缩写;

    6、条件查询

    比较运算符

    运算符说明
    >,>=,<,<=大于,大于等于,小于,小于等于
    =等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
    <=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
    !=,<>不等于
    BETWEEN a0 AND a1范围匹配,[a0,a1],如果 a0 <= value <= a1,则返回 TRUE(1)
    IN (option,…)如果是 option 中的任意一个,返回 TRUE(1)
    IS NULL是 NULL
    IS NOT NULL不是 NULL
    LIKE模糊匹配,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

    逻辑运算符

    运算符说明
    AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
    OR任意一个条件为 TRUE(1),结果为 TRUE(1)
    NOT条件为 TRUE(1),结果为 FALSE(0)

    ①语法

    引入 where 字句,针对查询结果进行筛选:
    对查询结果进行依次遍历,把对应的查询结果带入到条件中;
    条件成立,则把这个记录放到最终查询结果里;反正,则不作为最终结果。

    select 列名 from 表名 where 条件;
    
    • 1

    ②举例

    • 样本
      在这里插入图片描述

    • 基本查询
      在这里插入图片描述

    • AND 和 OR
      在这里插入图片描述

    • 范围查询
      在这里插入图片描述

    • 模糊查询
      在这里插入图片描述

    ③注意

    • WHERE 条件可以使用表达式,但不能使用别名。
    • AND 的优先级高于 OR,在同时使用时,需要使用小括号()包裹优先执行的部分

    7、分页查询

    ①语法

    -- 从 s 开始,筛选 n 条结果
    select 列名 from 表名 [where ...] [order by ...] limit n offset s;
    
    • 1
    • 2

    ②举例

    在这里插入图片描述

    三、修改元素(Update)

    1、语法

    update 表名 set 列名 =[, column = expr ...] [where ...] [order by ...] [limit ...]
    
    • 1

    2、举例

    在这里插入图片描述

    3、注意

    • 修改操作,是针对条件筛选之后,剩下的数据进行修改;
    • 如果没写条件,则针对所有行都进行修改;

    四、删除元素(Delete)

    1、语法

     -- 删除如何条件的行
    delete from 表名 where 条件;
     -- 删除表中的记录,全删了
    delete from 表名;
    
    • 1
    • 2
    • 3
    • 4

    2、举例

    在这里插入图片描述

    3、注意

    • delete from 表名; 是清空表的内容;
    • drop table 表名; 是把表也删了;

    五、重点总结

    • 新增
    -- 单行插入
    insert into(字段1, ..., 字段N) values (value1, ..., value N);
    -- 多行插入
    insert into(字段1, ..., 字段N) values
    (value1, ...),
    (value2, ...),
    (value3, ...);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 查询
    -- 全列查询
    select * from-- 指定列查询
    select 字段1,字段2... from-- 查询表达式字段
    select 字段1+100,字段2+字段3 from-- 别名
    select 字段1 别名1, 字段2 别名2 from-- 去重DISTINCT
    select distinct 字段 from-- 排序ORDER BY
    select * fromorder by 排序字段
    -- 条件查询WHERE:
    -- (1)比较运算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR (8)NOT
    select * fromwhere 条件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 修改
    updateset 字段1=value1, 字段2=value2... where 条件
    
    • 1
    • 删除
    delete fromwhere 条件
    
    • 1

    MySQL的增删改查(进阶)

    一、数据库的约束

    数据库可以让程序员定义一些对数据的强制规则,数据库会在插入/修改数据的时候按照这些规则对数据进行校验,如果校验不通过,就直接报错。

    约束的本质是让我们及时发现数据中的错误,更好的保证数据的正确性!

    1、约束类型

    • NOT NULL - 指示某列不能存储 NULL 值。
    • UNIQUE - 保证某列的每行必须有唯一的值。
    • DEFAULT - 规定没有给列赋值时的默认值。
    • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
    • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
    • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。

    2、NOT NULL:非空约束

    ①语法

    字段名 数据类型 NOT NULL;
    
    • 1

    ②举例

    初始情况下,一个表允许为NULL。
    在这里插入图片描述
    加上 NOT NULL 约束后,就不允许插入空值。
    在这里插入图片描述

    3、UNIQUE:唯一约束

    ①语法

    字段名 数据类型 UNIQUE;
    
    • 1

    ②举例

    初始情况下,表中数据允许重复出现。
    在这里插入图片描述
    加上 UNIQUE 约束后,表中字段的值不能重复出现。
    在这里插入图片描述

    4、DEFAULT:默认值约束

    ①语法

    字段名 数据类型 DEFAULT 默认值;
    
    • 1

    ②举例

    默认的默认值是 NULL,可以通过 default 约束来修改默认值的取值。
    对表进行指定列插入的时候,会涉及到默认值;
    在这里插入图片描述
    加上 UNIQUE 约束后,就可以修改默认值。
    在这里插入图片描述

    5、PRIMARY KEY:主键约束

    ①语法

    字段名 数据类型 primary key;
    -- 自增主键
    字段名 数据类型 primary key auto_increment
    • 1
    • 2
    • 3

    主键表示一条记录的 身份标识,是用来区分这条记录和别的记录的:

    • 不能为空;
    • 不能重复;
    • 主键唯一;

    MySQL 为了方便大家填写主键,内置了一个功能,“自增主键”,帮助我们自动生成主键的值。
    自增主键

    • 从 1 开始依次进行累加;
    • 如果写的是具体数值,就是手动指定;如果写的是 null,就是让 MySQL 按照自增规则自动生成。
    • MySQL 记录当前 自增主键 列里的最大值,在最大值的基础上依次自增;

    扩展
    如果数据库是分布式部署的,自增主键就要带来问题;
    解决思路:分布式唯一 id 生成算法
    唯一 id = 时间戳(ms)+ 机房编号/主机编号 + 随机因子(字符串拼接)

    ②举例

    在这里插入图片描述
    自增主键
    在这里插入图片描述

    6、FOREIGN KEY:外键约束

    ①语法

    外键用于关联其他表的主键唯一键

    foreign key (字段名) references 主表(列)
    
    • 1

    ②举例

    1. 创建班级表 classclassId为主键;
    2. 创建学生表 student,一个学生对应一个班级,一个班级对应多个学生。使用 studentId 为主键,classId 为外键,关联班级表 classId;此时,班级表为 父表,学生表为 子表
      在这里插入图片描述
    3. 父表 为空的情况下,直接往 子表 插入,就会报错!
      在这里插入图片描述
    4. 在外键约束下,每次插入/修改操作,都会先触发在 父表 中的查询,存在才能插入/修改成功!
      在这里插入图片描述
    5. 子表 对于 父表 的限制是不能随意修改/删除
      在这里插入图片描述

    7、CHECK 约束(了解即可)

    ①语法

     check (条件)
    
    • 1

    ②举例

    create table test_user (
       id int,
       name varchar(20),
       sex varchar(1),
       check (sex ='男' or sex='女')
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    二、表的设计

    根据一些实际的业务场景,来设计表,主要是确定有几个表,每个表的作用是什么,每个表有哪些字段;

    1. 明确需求场景
      提取出需求中的 “实体”,实体可以认为是 “关键性的名词”;
    2. 除了实体之外,还需要理清楚,实体和实体之间的关系
      ①一对一;②一对多;③多对多;④没关系。

    1、三大范式

    ①一对一

    一个同学只能有一个账号,一个账户只能分配给一个同学;

    方法1:把学生和账号,直接放到一个表里!(下策)

    student(id,name,account,password...)
    
    • 1

    方法2:把学生和账号各自放到一个表里,使用一额外 id 来关联!

    -- 1
    student(studentid,name,accountid)
    account(accountid,password)
    -- 2
    student(studentid,name)
    account(accountid,password,studentid)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ②一对多

    一个同学只能属于一个班级,一个班级可以包含多个同学;

    方法1

    student(id,name)
    --      1   张三
    --      2   李四
    --      3   王五
    class(classid,className,studentList)
    --      1      mysql101      1,2
    --      2      mysql102       3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    由于 MySQL 中没有 “数组” 这样的类型,所以方法1 是无法实现的。

    方法2

    class(classid,className)
    --      1      mysql101
    --      2      mysql102
    student(id,name,classid)
    --      1   张三    1
    --      2   李四    1
    --      3   王五    2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ③多对多

    一个同学可以选择多门课程,一个课程可以包含多个同学;

    一般是 采用一个中间表,来表示多对多的关系!

    student(studentid,name)
    --         1      张三
    --         2      李四
    --         3      王五
    course(courseid,courseName)
    --         1      语文
    --         2      数学
    --         3      英语
    student_course(studentid,courseid)
    --                 1         1          张三选了语文
    --                 1         2          张三选了数学
    --                 2         1          李四选了语文
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三、新增

    1、语法

    插入查询结果
    先执行查询操作,查询出来的结果,插入到另外一个表里。

    • 保证查询结果的临时表的列和要插入的表的列得匹配!!
    insert into 表名 select 列名 from 表名;
    
    • 1

    2、举例

    在这里插入图片描述

    四、查询

    1、聚合查询

    • 表达式查询:把列和列之间进行一些运算处理;
    • 聚合查询:把行和行进行这样的运算处理;

    ①聚合函数

    常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

    函数说明
    COUNT([DISTINCT] expr)返回查询到的数据的 数量
    SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
    AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
    MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
    MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

    原表:
    在这里插入图片描述

    Ⅰ.count 函数

    在这里插入图片描述

    • count(*) 把 NULL 值也记录到行数当中了;
    • count(指定列) 对于 NULL 不会计数;
    • count(指定列),count 后不能有空格;
    Ⅱ.sum 函数

    在这里插入图片描述

    • 可以指定查询条件,对于带有条件的聚合查询,会先按照条件筛选,然后再进行聚合;
      在这里插入图片描述
    • 求和操作一定要是数字
      在这里插入图片描述
    Ⅲ.avg 函数

    在这里插入图片描述

    • 计算平均分时,不计算 NULL 值!!!
    Ⅳ.max 函数

    在这里插入图片描述

    Ⅴ.min 函数

    在这里插入图片描述

    ②GROUP BY子句:分组查询

    Ⅰ语法

    select 中使用 group by 子句可以对指定列进行分组查询。

    select1, sum(2), ... from 表名 group by1,3;
    
    • 1
    Ⅱ举例

    在这里插入图片描述

    • 分组规则,是把记录的值相同的行分为一组;

    ③HAVING

    在进行聚合查询的时候,也能指定条件筛选:

    1. 在聚合之前,进行筛选,针对筛选后的结果,再聚合;(where 子句)
    2. 在聚合之后,进行筛选;(having 子句)

    group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where 语句,而需要用 having;

    select1, sum(2), ... from 表名 group by1,3 having 条件;
    
    • 1

    2、联合查询

    实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积。

    单纯的笛卡尔积,里边包含了大量的无效数据,指定了合理的过滤条件,把有效的数据筛选出来,得到一个有用的数据表。

    这个过程,称为 “联合查询”,筛选的条件称为 “连接条件”。

    多表查询的一般步骤

    1. 先根据需求理清楚想要的数据都在哪些表中;
    2. 【核心操作】先针对多个表进行笛卡尔积;
    3. 根据连接条件,筛选出合法数据,过滤掉非法数据;
    4. 进一步增加条件,根据需求做更精细的筛选;
    5. 去掉不必要的列,保留最关注的信息;

    ①内连接

    Ⅰ语法
    select 字段 from1 别名1 [inner] join2 别名2 on 连接条件 and 其他条件;
    select 字段 from1 别名1,2 别名2 where 连接条件 and 其他条件;
    
    • 1
    • 2
    Ⅱ举例

    测试数据:

    drop table if exists classes;
    drop table if exists student;
    drop table if exists course;
    drop table if exists score;
    
    create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));
    
    create table student (id int primary key auto_increment, sn varchar(20), name varchar(20), qq_mail varchar(20), classes_id int);
    
    create table course (id int primary key auto_increment, name varchar(20));
    
    create table score (score decimal(3,1), student_id int, course_id int);
    
    insert into classes(name, `desc`) values
    ('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
    ('中文系2019级3班','学习了中国传统文学'),
    ('自动化2019级5班','学习了机械自动化');
    
    insert into student(sn, name, qq_mail, classes_id) values
    ('09982','黑旋风李逵','xuanfeng@qq.com',1),
    ('00835','菩提老祖',null,1),
    ('00391','白素贞',null,1),
    ('00031','许仙','xuxian@qq.com',1),
    ('00054','不想毕业',null,1),
    ('51234','好好说话','say@qq.com',2),
    ('83223','tellme',null,2),
    ('09527','老外学中文','foreigner@qq.com',2);
    
    insert into course(name) values
    ('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');
    
    insert into score(score, student_id, course_id) values
    -- 黑旋风李逵
    (70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
    -- 菩提老祖
    (60, 2, 1),(59.5, 2, 5),
    -- 白素贞
    (33, 3, 1),(68, 3, 3),(99, 3, 5),
    -- 许仙
    (67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
    -- 不想毕业
    (81, 5, 1),(37, 5, 5),
    -- 好好说话
    (56, 6, 2),(43, 6, 4),(79, 6, 6),
    -- tellme
    (80, 7, 2),(92, 7, 6);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    (1)查询“许仙”同学的 成绩

    select stu.name,sco.course_id,sco.score from student stu inner join score sco on stu.id=sco.student_id and stu.name='许仙';
    -- 或者
    select stu.name,sco.course_id,sco.score from student stu, score sco where stu.id=sco.student_id and stu.name='许 仙';
    
    • 1
    • 2
    • 3

    (2)查询所有同学的总成绩,及同学的个人信息

    select stu.name,sum(sco.score) from student stu, score sco where stu.id=sco.student_id group by id;
    
    • 1

    (3)查询所有同学的成绩,及同学的个人信息

    select stu.name, cou.name, sco.score from student stu, course cou, score sco where stu.id = sco.student_id and cou.id = sco.course_id;
    
    • 1

    ②外连接

    外连接分为左外连接和右外连接。

    如果联合查询,

    • 左侧的表完全显示我们就说是左外连接;
    • 右侧的表完全显示我们就说是右外连接。
    Ⅰ语法
    -- 左外连接,表1完全显示
    select 字段名 from 表名1 left join 表名2 on 连接条件;
    -- 右外连接,表2完全显示
    select 字段名 from 表名1 right join 表名2 on 连接条件;
    
    • 1
    • 2
    • 3
    • 4
    Ⅱ举例

    测试数据1:所连接的表一一对应

    drop table if exists student;
    drop table if exists score;
    
    create table student (id int, name varchar(20));
    
    create table score (id int, score int);
    
    insert into student values (1, '张三'), (2,'李四'), (3,'王五');
    
    insert into score values (1, 90), (2, 80), (3, 70);
    
    -- 内连接
    select name, score from student join score on student.id = score.id;
    -- 左外连接
    select name, score from student left join score on student.id = score.id;
    -- 右外连接
    select name, score from student right join score on student.id = score.id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 内连接:
      在这里插入图片描述
    2. 外连接:
      在这里插入图片描述
      测试数据2:所连接的表没有一一对应
    drop table if exists student;
    drop table if exists score;
    
    create table student (id int, name varchar(20));
    
    create table score (id int, score int);
    
    insert into student values (1, '张三'), (2,'李四'), (3,'王五');
    
    insert into score values (1, 90), (2, 80), (4, 70);
    
    -- 内连接
    select name, score from student join score on student.id = score.id;
    -- 左外连接
    select name, score from student left join score on student.id = score.id;
    -- 右外连接
    select name, score from student right join score on student.id = score.id;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 内连接:
      在这里插入图片描述
    2. 外连接:
      在这里插入图片描述

    ③自连接

    自连接是指在同一张表连接自身进行查询。

    一般很少会用到自连接,属于是特殊问题下的特定解决方案;

    Ⅰ语法
    select 列名 from 表名 as 别名1, 表名 as 别名2 where 条件;
    
    • 1
    Ⅱ举例

    测试数据采用内连接时的数据:
    (1)哪个同学的课程1成绩比课程3高;

    select s1.student_id from score as s1, score as s2 where s1.student_id = s2.student_id and s1.course_id = 3 and s2.course_id = 1 and s1.score > s2.score;
    
    • 1

    在这里插入图片描述

    ④子查询

    子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询;

    Ⅰ单行子查询

    单行子查询:返回一行记录的子查询。

    查询与“不想毕业” 同学的同班同学:

    select name from student where classes_id = (select classes_id from student where name = '不想毕业');
    
    • 1

    在这里插入图片描述

    Ⅱ多行子查询

    多行子查询:返回多行记录的子查询。

    查询“语文”或“英文”课程的成绩信息:

    ⒈[NOT] IN
    select * from score where course_id in (select id from course where name =  '语文' or name = '英文');
    
    • 1

    在这里插入图片描述

    ⒉[NOT] EXISTS
    select * from score where exists (select score.student_id from course where (name='语文' or name='英文') and course.id = score.course_id);
    
    • 1

    在这里插入图片描述

    ⑤合并查询

    在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用 UNION 和 UNION ALL 时,前后查询的结果集中,字段需要一致。

    Ⅰunion

    该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

    (1)查询id小于3,或者名字为“英文”的课程

    select * from course where id < 3 union  select * from course where name = '英文';
    
    • 1

    在这里插入图片描述

    Ⅱunion all

    该操作符用于取得两个结果集的并集。当使用该操作符时,不会自动去掉结果集中的重复行。

    (1)查询id小于3,或者名字为“Java”的课程

    select * from course where id < 3 union all select * from course where name = 'Java';
    
    • 1

    在这里插入图片描述

    MySQL索引事务

    一、索引

    1、概念

    索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。

    2、作用

    • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
    • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
    • 索引对于提高数据库的性能有很大的帮助。

    3、使用场景

    要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

    • 数据量较大,且经常对这些列进行条件查询。
    • 该数据库表的插入操作,及对这些列的修改操作频率较低。
    • 索引会占用额外的磁盘空间。

    满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。

    反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

    4、使用

    ①查看索引

    • 一个表的 主键 列会自动带上索引!
    • unique 以及 外键约束 的列,也会自动带上索引!
    show index from 表名;
    
    • 1

    ②创建索引

    create index 索引名 on 表名(字段名);
    
    • 1

    ①删除索引

    drop index 索引名 on 表名;
    
    • 1

    二、事务

    1、为什么使用事务

    准备测试表:

    drop table if exists accout;
    create table accout(
     id int primary key auto_increment,
     name varchar(20) comment '账户名称',
     money decimal(11,2) comment '金额'
    );
    insert into accout(name, money) values
    ('阿里巴巴', 5000),
    ('四十大盗', 1000);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    比如说:四十大盗偷了2000元

    -- 阿里巴巴账户减少2000
    update accout set money=money-2000 where name = '阿里巴巴';
    -- 四十大盗账户增加2000
    update accout set money=money+2000 where name = '四十大盗';
    
    • 1
    • 2
    • 3
    • 4

    假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是四十大盗的账户上就没有了增加的金额。

    解决方案:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

    2、概念

    事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
    在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

    3、使用

    (1)开启事务:start transaction;
    (2)执行多条SQL语句
    (3)回滚或提交:rollback/commit;

    说明:rollback即是全部失败,commit即是全部成功。

    start transaction;
    -- 阿里巴巴账户减少2000
    update accout set money=money-2000 where name = '阿里巴巴';
    -- 四十大盗账户增加2000
    update accout set money=money+2000 where name = '四十大盗';
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、基本特性

    • 原子性:最核心的特性;
    • 一致性:一致数据是对的;
    • 持久性:(存储在磁盘上)事务进行的操作都会写磁盘,只要事务执行成功,造成的修改,就是持久化的保存了,哪怕重启主机,这样的改变也仍然存在。
    • 隔离性:描述多个事务并发执行的时候,所产生的情况;

    总结

    MySQL基础部分东西还是挺多的,不过都很简单,敲了2w字,总算是结束了,还蛮有成就感的,加油加油!

  • 相关阅读:
    来自从事Java十年的老架构师给大家的一些经验,Java工程师必看
    浅谈根号分治
    【store商城项目03】修改密码的开发
    C++11(包装器)
    轻松入门自然语言处理系列 专题7 基于FastText的文本分类
    go语法入门2
    代码审计——任意文件下载详解(二)
    css3的attr函数使用,加载unicode矢量图标
    基于 Vite + Vue3 + TS + sass + router + element-plus 的项目搭建
    vue基于promise可以用于浏览器和node.js的网络请求库【axios封装-收藏版】
  • 原文地址:https://blog.csdn.net/WZRbeliever/article/details/125810619