• 【MySQL 数据库 基础 Ⅱ】基础sql语句 Ⅱ


    MySQL基础语法 Ⅱ


    前言:

    这篇是基础语法 Ⅱ,第一篇 请跳转 【MySQL 数据库 基础】基础sql语句

    一、in 离散查询

    条件查询中:

    1、between and 表示的是一个连续的闭区间;

    2、in 表示的是一个 离散的区间。

    具体可以 看这篇帖子来回顾 条件查询 的一些运算符 【MySQL 数据库 基础】基础sql语句

     select name, math from exam_result where math in (null, 98, 85, 59, 58);
     
     select name, math from exam_result where math = null or math = 98 or math = 85 or math =59 or math = 58;
    
    • 1
    • 2
    • 3

    他们两个是等价的。

    二、like 模糊查询

    模糊查询会用的一些通配符;

    1、% 代表任意多个的任意字符。(0个,也可以是任意个)

    2、_ 代表任意一个的任意字符。

    mysql> select name, english from exam_result where english like '7%';
    +-----------+---------+
    | name      | english |
    +-----------+---------+
    | xxx       |    77.0 |
    | xx        |    78.5 |
    +-----------+---------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    mysql> select name, english from exam_result where name like '鸢_';
    +--------+---------+
    | name   | english |
    +--------+---------+
    | 鸢也   |    99.5 |
    +--------+---------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    where查询筛选在sql充当的是“过滤器”;sql中最核心的就是 select,select最核心的就是where。

    三、分页查询(limit)

    我们在网页中看到的论坛,评论,他们的最下面会出现,1,2,3…的按钮,这些按钮就对应到了分页查询。

    在这里插入图片描述

    select * from exam_result limit 4, 3; -- 不直观,不推荐
    
    select * from exam_result limit 3 offset 4;
    
    • 1
    • 2
    • 3

    这俩是等价的操作,但是我们以搭配offset来写,比较直观,不容易出错

    四、修改 (update)

    修改操作是会真正的修改数据库服务器里面的数据update里面的“=”就是赋值的意思。(而不是等于)

    • 格式
    mysql> update 表名
        -> set 列名 = 值,列名 =...
        -> where 条件
    
    • 1
    • 2
    • 3

    update 语句可以分开写,这样不会写错,思路清晰。(老手写一长串亦可以)

    -- 修改某个同学的中文成绩变更为60.
    mysql> update exam_result
        -> set chinese = 60
        -> where name = 'yuanye';
        
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.1 修改语句一次改多个列

    -- 将某个同学的数学成绩改为70分,英语成绩改为65分
    update exam_result set math = 70 , english = 65 where name = 'yuanye';
    
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 update可以搭配其他字句使用

    update可以搭配 limit,order by 等的字句一起使用

    -- 将总成绩倒数三位同学英语成绩加20分
    mysql> update exam_result
        -> set english = english + 20
        -> order by chinese + math +english limit 3;
    Query OK, 3 rows affected (0.00 sec)
    
    Rows matched: 3  Changed: 3  Warnings: 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里的使用是总分倒数三位同学,那么总分升序排序找出前三位同学,然后英语成绩分别都加20分。

    如果里面有null ,那么null进行运算,还是等于null。

    如果 update 没有指定条件语句,修改就会针对所有的记录生效。

    update exam_result set english = english - 10;
    
    Query OK, 9 rows affected (0.00 sec)
    Rows matched: 9  Changed: 9  Warnings: 0
    
    • 1
    • 2
    • 3
    • 4

    这里他会针对所有 英语那一列 进行 - 10 操作。

    五、删除操作

    delete from 表名 where 条件;
    
    • 1
    -- 删除某位同学的考试成绩
    delete from exam_result where name = 'yuanye';
    
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4

    如果没有 条件筛选条件语句,就会删除整张表 的记录,但是表名还是存在的。

    delete from exam_result;
    
    Query OK, 8 rows affected (0.00 sec)
    
    • 1
    • 2
    • 3

    六、约束

    “约束”是数据库中重要的机制,保证数据的“完整性”,数据类型本身能进行一部分的数据校验工作。除此之外,“约束”也能进行一部分的数据校验工作,通过这些数据校验,就可以尽量避免出现一些“非法的数据”。

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

    6.1 not null

    在这里插入图片描述

    当你插入/修改的数据不符合约束的要求,那么这种操作就会被报错,避免了问题进一步的扩大。

    6.2 unique

    默认情况下的表,列都是可以重复的,但是使用 unique 就会保证这个列没有重复的值。(唯一)

    在这里插入图片描述

    mysql> insert into student values (1,'zhangsan');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into student values (1,'lisi');
    ERROR 1062 (23000): Duplicate entry '1' for key 'id'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    党有 unique 约束的时候,进行插入之前,就会先去检测当且的列是否有重复的,有就会报错。

    6.3 default

    指定列的默认值。当指定的列插入的时候,如果这个列没有被指定特定的值,mysql就会给他设置一个默认值,默认的默认值就是null。

    mysql> create table student (id int, name varchar(20) default '321');
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into student (id) values (1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from student;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | 321  |
    +------+------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这里我们把默认值修改为了 ‘321’,默认值可以我们自己灵活修改参数。

    6.4 primary key

    primary key 表示了一个记录(行)的身份标识。(相当于唯一 && not null)

    在这里插入图片描述

    mysql> insert into student values (1,'yuanye');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    
    mysql> insert into student values (null,'zhangsan');
    ERROR 1048 (23000): Column 'id' cannot be null
    
    • 1
    • 2
    • 3
    • 4
    • 5

    从报错结果就可以看出,指定的列不能是null,指定的列是唯一的,不能重复。

    一张表只能有一个主键:

    mysql> create table student (id int primary key, name varchar(20) primary key);
    
    ERROR 1068 (42000): Multiple primary key defined
    
    • 1
    • 2
    • 3

    设定了两个主键会报错误提示。

    但是我们可以让多个列作为一个“联合主键”

    主键的要求就是不能为null,也不能重复,在很多的场景下,主键都是设定在 id 上的单纯的整数。

    我们可以借助 mqysql 提供的“自增主键”来解决这个问题,每次插入数据的售后不需要用户手动指定 id 的值 (1,2,3…),mysql会自动分配一个合适的值,这个值就是通过自增得到的。

    自增主键: auto_increment

    在这里插入图片描述

    student 这张表有了自增主键的约束,那么他就会直接依次往前递增。

    自增主键也可以用户手动指定值。

    mysql> insert into student values (5,'yuanye');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from student;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | yuanye |
    |  2 | yuanye |
    |  3 | yuanye |
    |  5 | yuanye |
    +----+--------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    当再次插入一条mysql自增语句的时候,那么下一条记录就是6,二不是4.

    mysql> insert into student values (null,'yuanye');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from student;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | yuanye |
    |  2 | yuanye |
    |  3 | yuanye |
    |  5 | yuanye |
    |  6 | yuanye |
    +----+--------+
    5 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6.5 foreign key (外键约束)

    外键约束设计两张表,

    一张是父表,一张是字表

    • 子表
    mysql> select * from student;
    +----+----------+---------+
    | id | name     | classId |
    +----+----------+---------+
    |  1 | zhangsan |       1 |
    |  2 | lisi     |       2 |
    +----+----------+---------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 父表
    mysql> select * from classes;
    +----+------+
    | id | name |
    +----+------+
    |  1 | 100  |
    |  2 | 101  |
    |  3 | 102  |
    +----+------+
    3 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    显然父表里面对应的是三行,经过某一列的外键约束,那么子表里面插入了父表里面 那个列 不存在的 元素,就会报错。

    mysql> create table student
        -> (id int primary key auto_increment,
        -> name varchar(20),
        -> classId int,
        ->  foreign key (classId) references classes(id)
        ->  );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这段sql语句里面外键约束的就是student表中 classId这一列,和classes表中 id 这一列,如果子表插入的元素 > 3 就会报错。

    在这里插入图片描述

    当前表列里面的内容个必须被 references 另外那个表的列里的内容包含。

    mysql> insert into student values (null,'123',4);
    
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`aaa`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `classes` (`id`))
    
    • 1
    • 2
    • 3

    外键约束就是把两张表绑在了一起,子表你不能随便乱改,父表你也不能随表乱改。

    mysql> delete from classes where id = 1;
    
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`aaa`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `classes` (`id`))
    
    • 1
    • 2
    • 3

    七、表的设计

    一种表的通用设计手段,首先我们要抓住实体 和 关系。

    关系:就是多个实体之间对应的关系是什么样。

    实体:问题场景中的一些“关键性“的名词。

    找到了实体,实体和实体之间可能存在一些联系,这些联系就会影响到表的最终设计。

    联系指的又是,”关系与关系之间的关系“,类似于一张二维表和另一张二维表之间的关系。

    类型:

    7.1、一对一

    关系A中的一条记录对应关系B中的一条记录,关系B中的一条记录也对应关系A中的一条记录。

    例如:学生表 和 用户表 …

    7.2、一对多

    关系A中的一条记录对应着关系B中的多条记录,关系B中的一条记录只对应关系A中的一条记录,这样的关系称为“从A到B的一对多关系“。

    (班级对学生的关系是一对多)

    在这里插入图片描述

    7.3、多对一

    关系A中的一条记录对应关系B中的一条记录,关系B中的一条记录对应关系A中的多条记录,这样称之为“从A到B的多对一的关系“。(学生对班级的关系是多对一)

    在这里插入图片描述

    7.4、多对多

    关系A中的一条记录对应着关系B中的多条记录,关系B中的一条记录对应关系A中的多条记录

    例如:学生和课程,学生和老师之间的关系…

    这种关系,两个表之间存在需要引入一个中间表

    在这里插入图片描述

    站在学生表的角度,张三选择了语文和数学;

    站在了课程表的角度,数学被张三和李四选了。

    这样子的表就形成了多对多的关系


    铁汁们,觉得笔者写的不错的可以点个赞哟❤🧡💛💚💙💜🤎🖤🤍💟,收藏关注呗,你们支持就是我写博客最大的动力.

  • 相关阅读:
    spring、springboot原理(未完待续)
    算法通关村第十一关|白银|位运算高频算法题【持续更新】
    vue开发h5页面不能滑动的坑
    计算机竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR
    4.基于NIO的群聊系统
    启动 Tomcat 日志乱码问题
    【AI视野·今日CV 计算机视觉论文速览 第255期】Wed, 27 Sep 2023
    Spring概述
    macvlan 用于 Docker 网络
    实验七:定时/计数器8253、8254
  • 原文地址:https://blog.csdn.net/qq_54219272/article/details/126530031