这篇是基础语法 Ⅱ,第一篇 请跳转 【MySQL 数据库 基础】基础sql语句
在条件查询中:
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、% 代表任意多个的任意字符。(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。
我们在网页中看到的论坛,评论,他们的最下面会出现,1,2,3…的按钮,这些按钮就对应到了分页查询。
select * from exam_result limit 4, 3; -- 不直观,不推荐
select * from exam_result limit 3 offset 4;
这俩是等价的操作,但是我们以搭配offset
来写,比较直观,不容易出错
修改操作是会真正的修改数据库服务器里面的数据,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
-- 将某个同学的数学成绩改为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
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)
“约束”是数据库中重要的机制,保证数据的“完整性”,数据类型本身能进行一部分的数据校验工作。除此之外,“约束”也能进行一部分的数据校验工作,通过这些数据校验,就可以尽量避免出现一些“非法的数据”。
当你插入/修改的数据不符合约束的要求,那么这种操作就会被报错,避免了问题进一步的扩大。
默认情况下的表,列都是可以重复的,但是使用 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 约束的时候,进行插入之前,就会先去检测当且的列是否有重复的,有就会报错。
指定列的默认值。当指定的列插入的时候,如果这个列没有被指定特定的值,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’,默认值可以我们自己灵活修改参数。
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)
外键约束设计两张表,
一张是父表,一张是字表
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`))
一种表的通用设计手段,首先我们要抓住实体 和 关系。
关系:就是多个实体之间对应的关系是什么样。
实体:问题场景中的一些“关键性“的名词。
找到了实体,实体和实体之间可能存在一些联系,这些联系就会影响到表的最终设计。
联系指的又是,”关系与关系之间的关系“,类似于一张二维表和另一张二维表之间的关系。
类型:
关系A中的一条记录
对应关系B中的一条记录
,关系B中的一条记录也对应关系A中的一条记录。
例如:学生表 和 用户表 …
关系A中的一条记录
对应着关系B中的多条记录
,关系B中的一条记录
只对应关系A中的一条记录
,这样的关系称为“从A到B的一对多关系“。
(班级对学生的关系是一对多)
关系A中的一条记录
对应关系B中的一条记录
,关系B中的一条记录
对应关系A中的多条记录
,这样称之为“从A到B的多对一的关系“。(学生对班级的关系是多对一)
关系A中的一条记录
对应着关系B中的多条记录
,关系B中的一条记录
对应关系A中的多条记录
。
例如:学生和课程,学生和老师之间的关系…
这种关系,两个表之间存在需要引入一个中间表
站在学生表的角度,张三选择了语文和数学;
站在了课程表的角度,数学被张三和李四选了。
这样子的表就形成了多对多
的关系
铁汁们,觉得笔者写的不错的可以点个赞哟❤,收藏关注呗,你们支持就是我写博客最大的动力.