【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;

他们两个是等价的。

二、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)
mysql> select name, english from exam_result where name like '鸢_';
+--------+---------+
| name   | english |
+--------+---------+
| 鸢也   |    99.5 |
+--------+---------+
1 row in set (0.00 sec)

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;

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

四、修改 (update)

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

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

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

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

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

这里的使用是总分倒数三位同学,那么总分升序排序找出前三位同学,然后英语成绩分别都加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

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

五、删除操作

delete from 表名 where 条件;
-- 删除某位同学的考试成绩
delete from exam_result where name = 'yuanye';

Query OK, 1 row affected (0.00 sec)

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

delete from exam_result;

Query OK, 8 rows affected (0.00 sec)

六、约束

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

  • 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'

党有 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)

这里我们把默认值修改为了 ‘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

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

一张表只能有一个主键:

mysql> create table student (id int primary key, name varchar(20) primary key);

ERROR 1068 (42000): Multiple primary key defined

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

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

主键的要求就是不能为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)

当再次插入一条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)

6.5 foreign key (外键约束)

外键约束设计两张表,

一张是父表,一张是字表

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

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

mysql> create table student
    -> (id int primary key auto_increment,
    -> name varchar(20),
    -> classId int,
    ->  foreign key (classId) references classes(id)
    ->  );

这段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`))

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

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`))

七、表的设计

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

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

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

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

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

类型:

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中的多条记录

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

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

在这里插入图片描述

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

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

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


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

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸢也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值