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 =nullor math =98or math =85or math =59or 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|+-----------+---------+2rowsinset(0.00 sec)
mysql>select name, english from exam_result where name like'鸢_';+--------+---------+| name | english |+--------+---------+| 鸢也 |99.5|+--------+---------+1rowinset(0.00 sec)
where查询筛选在sql充当的是“过滤器”;sql中最核心的就是 select,select最核心的就是where。
三、分页查询(limit)
我们在网页中看到的论坛,评论,他们的最下面会出现,1,2,3…的按钮,这些按钮就对应到了分页查询。
select*from exam_result limit4,3;-- 不直观,不推荐select*from exam_result limit3offset4;
这俩是等价的操作,但是我们以搭配
offset
来写,比较直观,不容易出错
四、修改 (update)
修改操作是会真正的修改数据库服务器里面的数据,
update
里面的“=”就是赋值的意思。(而不是等于)
- 格式
mysql>update 表名
->set 列名 = 值,列名 = 值...->where 条件
写
update
语句可以分开写,这样不会写错,思路清晰。(老手写一长串亦可以)
-- 修改某个同学的中文成绩变更为60.
mysql>update exam_result
->set chinese =60->where name ='yuanye';
Query OK,1row affected (0.00 sec)Rowsmatched: 1 Changed: 1Warnings: 0
4.1 修改语句一次改多个列
-- 将某个同学的数学成绩改为70分,英语成绩改为65分update exam_result set math =70, english =65where name ='yuanye';
Query OK,1row affected (0.00 sec)Rowsmatched: 1 Changed: 1Warnings: 0
4.2 update可以搭配其他字句使用
update
可以搭配 limit,order by 等的字句一起使用
-- 将总成绩倒数三位同学英语成绩加20分
mysql>update exam_result
->set english = english +20->orderby chinese + math +english limit3;
Query OK,3rows affected (0.00 sec)Rowsmatched: 3 Changed: 3Warnings: 0
这里的使用是总分倒数三位同学,那么总分升序排序找出前三位同学,然后英语成绩分别都加20分。
如果里面有null ,那么null进行运算,还是等于null。
如果 update 没有指定条件语句,修改就会针对所有的记录生效。
update exam_result set english = english -10;
Query OK,9rows affected (0.00 sec)Rowsmatched: 9 Changed: 9Warnings: 0
这里他会针对所有 英语那一列 进行 - 10 操作。
五、删除操作
deletefrom 表名 where 条件;
-- 删除某位同学的考试成绩deletefrom exam_result where name ='yuanye';
Query OK,1row affected (0.00 sec)
如果没有 条件筛选条件语句,就会删除整张表 的记录,但是表名还是存在的。
deletefrom exam_result;
Query OK,8rows 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>insertinto student values(1,'zhangsan');
Query OK,1row affected (0.00 sec)
mysql>insertinto student values(1,'lisi');
ERROR 1062(23000): Duplicate entry '1'forkey'id'
党有 unique 约束的时候,进行插入之前,就会先去检测当且的列是否有重复的,有就会报错。
6.3 default
指定列的默认值。当指定的列插入的时候,如果这个列没有被指定特定的值,mysql就会给他设置一个默认值,默认的默认值就是null。
mysql>createtable student (id int, name varchar(20)default'321');
Query OK,0rows affected (0.01 sec)
mysql>insertinto student (id)values(1);
Query OK,1row affected (0.00 sec)
mysql>select*from student;+------+------+| id | name |+------+------+|1|321|+------+------+1rowinset(0.00 sec)
这里我们把默认值修改为了 ‘321’,默认值可以我们自己灵活修改参数。
6.4 primary key
primary key 表示了一个记录(行)的身份标识。(相当于唯一 && not null)
mysql>insertinto student values(1,'yuanye');
ERROR 1062(23000): Duplicate entry '1'forkey'PRIMARY'
mysql>insertinto student values(null,'zhangsan');
ERROR 1048(23000): Column'id' cannot be null
从报错结果就可以看出,指定的列不能是null,指定的列是唯一的,不能重复。
一张表只能有一个主键:
mysql>createtable student (id intprimarykey, name varchar(20)primarykey);
ERROR 1068(42000): Multiple primarykey defined
设定了两个主键会报错误提示。
但是我们可以让多个列作为一个“联合主键”
主键的要求就是不能为null,也不能重复,在很多的场景下,主键都是设定在 id 上的单纯的整数。
我们可以借助 mqysql 提供的“自增主键”来解决这个问题,每次插入数据的售后不需要用户手动指定 id 的值 (1,2,3…),mysql会自动分配一个合适的值,这个值就是通过自增得到的。
自增主键: auto_increment
student 这张表有了
自增主键
的约束,那么他就会直接依次往前递增。
自增主键也可以用户手动指定值。
mysql>insertinto student values(5,'yuanye');
Query OK,1row affected (0.00 sec)
mysql>select*from student;+----+--------+| id | name |+----+--------+|1| yuanye ||2| yuanye ||3| yuanye ||5| yuanye |+----+--------+4rowsinset(0.00 sec)
当再次插入一条mysql自增语句的时候,那么下一条记录就是6,二不是4.
mysql>insertinto student values(null,'yuanye');
Query OK,1row affected (0.00 sec)
mysql>select*from student;+----+--------+| id | name |+----+--------+|1| yuanye ||2| yuanye ||3| yuanye ||5| yuanye ||6| yuanye |+----+--------+5rowsinset(0.00 sec)
6.5 foreign key (外键约束)
外键约束设计两张表,
一张是父表,一张是字表
- 子表
mysql>select*from student;+----+----------+---------+| id | name | classId |+----+----------+---------+|1| zhangsan |1||2| lisi |2|+----+----------+---------+2rowsinset(0.00 sec)
- 父表
mysql>select*from classes;+----+------+| id | name |+----+------+|1|100||2|101||3|102|+----+------+3rowsinset(0.00 sec)
显然父表里面对应的是三行,经过某一列的外键约束,那么子表里面插入了父表里面 那个列 不存在的 元素,就会报错。
mysql>createtable student
->(id intprimarykeyauto_increment,-> name varchar(20),-> classId int,->foreignkey(classId)references classes(id)->);
这段sql语句里面外键约束的就是student表中
classId
这一列,和classes表中
id
这一列,如果子表插入的元素
> 3
就会报错。
当前表列里面的内容个必须被 references 另外那个表的列里的内容包含。
mysql>insertinto student values(null,'123',4);
ERROR 1452(23000): Cannot addorupdate a child row: a foreignkeyconstraint fails (`aaa`.`student`,CONSTRAINT`student_ibfk_1`FOREIGNKEY(`classId`)REFERENCES`classes`(`id`))
外键约束就是把两张表绑在了一起,子表你不能随便乱改,父表你也不能随表乱改。
mysql>deletefrom classes where id =1;
ERROR 1451(23000): Cannot deleteorupdate a parent row: a foreignkeyconstraint fails (`aaa`.`student`,CONSTRAINT`student_ibfk_1`FOREIGNKEY(`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中的
多条记录
。
例如:学生和课程,学生和老师之间的关系…
这种关系,两个表之间存在需要引入一个中间表
站在学生表的角度,张三选择了语文和数学;
站在了课程表的角度,数学被张三和李四选了。
这样子的表就形成了
多对多
的关系
铁汁们,觉得笔者写的不错的可以点个赞哟❤🧡💛💚💙💜🤎🖤🤍💟,收藏关注呗,你们支持就是我写博客最大的动力.
版权归原作者 鸢也 所有, 如有侵权,请联系我们删除。