广州物流网站建设,网站做的题不小心关闭了,彩票娱乐网站建设开发,网站设计专业公司价格✨个人主页#xff1a;bit me#x1f447; ✨当前专栏#xff1a;MySQL数据库#x1f447; ✨算法专栏#xff1a;算法基础#x1f447; ✨每日一语#xff1a;生命久如暗室#xff0c;不碍朝歌暮诗 目 录#x1f513;一. CRUD#x1f512;二. 新增#xff08;Creat… ✨个人主页bit me ✨当前专栏MySQL数据库 ✨算法专栏算法基础 ✨每日一语生命久如暗室不碍朝歌暮诗 目 录一. CRUD二. 新增Create如何修改MySQL配置三. 查询Retrieve1. 全列查询2. 指定列查询3. 查询带有表达式4. 起别名查询5. 去重查询6. 排序查询7. 条件查询8. 分页查询四. 修改Update五. 删除Delete一. CRUD
CRUD : CreateRetrieveUpdateDelete新增数据查询数据修改数据删除数据
MySQL的工作就是组织管理数据先保存保存好了后好进行增删改查
增删改查的前提是已经把数据库创建好并且选中了表也创建就绪
注释在SQL中可以使用“–空格描述”来表示注释说明CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写 二. 新增Create insert into 表名 values(值值值…); 注意此处的值的个数要和表的列数匹配值的类型也要和列的类型匹配不匹配就会报错
所以也更好的体现出关系型数据库的一个优势对数据进行更严格的校验检查更容易发现问题!
我们先在库里创建一个学生表
mysql create table student(id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)查看表的结构
mysql desc student;
-----------------------------------------------
| Field | Type | Null | Key | Default | Extra |
-----------------------------------------------
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
-----------------------------------------------
2 rows in set (0.00 sec)新增
mysql insert into student values (1,zhangsan);
Query OK, 1 row affected (0.00 sec)注意在SQL中表示字符串可以使用单引号也可以使用双引号他们两个是等价关系在SQL中没有 字符类型 只有字符串类型所以单引号就可以表示字符串。
在这里无论我们表的列数不匹配还是类型不匹配都是会报错的
mysql insert into student values(2);
ERROR 1136 (21S01): Column count doesnt match value count at row 1
mysql insert into student values (zhangsan,3);
ERROR 1366 (HY000): Incorrect integer value: zhangsan for column id at row 1注意出现ERROR意味着当前的操作是不生效的
拓展
我们在这里还可以插入中文数据
mysql insert into student values (2,张三);
Query OK, 1 row affected (0.00 sec)在这块我们还需知道数据库表示中文需要明确字符编码MySQL默认的字符集叫做拉丁文不支持中文为了可以存储就需要把字符集改为UTF-8。在这里我们介绍一种一劳永逸的方法来修改字符集 -- 修改MySQL的配置文件 如何修改MySQL配置
先确认当前数据库的字符集 show variables like ‘character%’; mysql show variables like character%;
-----------------------------------------------------------------------------------
| Variable_name | Value |
-----------------------------------------------------------------------------------
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
-----------------------------------------------------------------------------------
8 rows in set, 1 warning (0.00 sec)可以看到我的数据库就是UTF-8字符集 找到配置文件 – my.ini
①可以使用软件Everything来寻找 搜索框里输入my.ini即可找到但是可能会出现多个my.ini导致无法辨别哪一个才是我们要找的所以不推荐 ②在我们的系统找到MySQL并且完成这一系列操作 右键快捷键进入属性 拷贝出目标里面的内容这里就是MySQL的可执行程序路径和配置文件路径 把MySQL配置文件的位置复制过来 这就是我们要找的配置文件 修改配置文件
①修改配置文件之前一定要先备份复制粘贴到旁边一份保存着以免改错还原不回去了
②编辑ini文件用记事本打开即可找到下面没有#的地方有#号的地方是注释 ini文件中有一些 [ ] 每个 [ ] 称为是一个selection相当于把一组功能有联系的配置放到了一起构成了一个selection。具体在[mysql]加入的那句话那个配置项是按照键值对的方式来组织的注意这里的键值对单词拼写等于号俩边不要有空格。 修改完成后记得保存Ctrl s就可以退出了
配置文件不是修改完了就立即生效还需要额外进行一些操作
①重启MySQL服务器不重启就不会生效
重启服务器不是关闭黑框框是客户端
在我们的搜索里搜索服务找到MySQL然后右键进行重启即可 最后状态栏显示 正在运行 说明是重启成功的如果是其他内容启动中…则是重启失败最大的原因就是配置文件修改错误 ②修改配置文件对已经创建好的数据库是没有影响的必须要删除旧的数据库重建数据库表。
至此MySQL配置修改就彻底结束了继续insert的探讨
insert插入的时候可以指定列进行插入不一定非得把这一行的所有列都插入数据可以想插入几列就插入几列
mysql insert into student (name) values (lisi);
Query OK, 1 row affected (0.00 sec)如上我们在学生名字这一列插入list其他未被插入id填入的值就是默认值默认的默认值就是啥都不填也就是NULL。
insert语句还可以一次插入多条记录在values后面带有多组每个之间使用 , 来分割
mysql insert into student values(1,zhangsan),(2,lisi),(3,wangwu);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0在MySQL中一次插入一条记录分多次插入 比 一次插入多条记录慢的很多原因是MySQL是一个客户端/服务器结构的程序每次在客户端里输入的命令sql都是通过网络来进行传输的。 数据库服务器需要解析请求获取到其中的sql解析sql执行相关操作并且把操作结果返回给客户端如果要是一次插入一条分成多次插入就会有多个请求/相应如果要是一次插入多条就一次请求/相应就够了 结语插入是SQL中最简单的一个操作也是最常用的一个操作 三. 查询Retrieve
查询是SQL中最最重要也最复杂的操作此处先介绍一下最简单的查询
1. 全列查询
直接把整个表里面的数据都查询出来。 select * from 表名; 其中*是通配符表示匹配任意的列所有的列
mysql select * from student;
----------------
| id | name |
----------------
| 1 | zhangsan |
| 2 | 张三 |
| NULL | list |
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
----------------
6 rows in set (0.00 sec)注意理解这里的执行过程牢记客户端和服务器之间通过网络进行通信
这一组结果是通过网络返回的最终呈现在客户端上这些数据是服务器筛选得到的数据结果客户端也是以表格的形式进行呈现但是大家不要把客户端显示的这个表格视为是服务器上数据的本体这个客户端上显示的表格是个“临时表”。
问题如果当前数据库的数据特别多执行上述select*会发生什么情况呢
服务器要先读取磁盘把这些数据都查询出来再通过网卡把数据传输给客户端由于数据量非常大极有可能就把磁盘IOinput output吃满或者把网络带宽吃满。最直观的感受就是会感受到卡顿至于卡多久不明确
在执行一些SQL的时候如果执行的时间比较长随时可以按 Ctrl c 来中断以免造成不必要的损失 2. 指定列查询 select 列名列名列名… from 表名; mysql select id from student;
------
| id |
------
| 1 |
| 2 |
| NULL |
| 1 |
| 2 |
| 3 |
------
6 rows in set (0.00 sec)当我们省略掉一些不必要的列的时候就可以节省大量的磁盘IO和网络带宽了
MySQL是客户端服务器结构的程序在此处看到的这个表结果也同样是 临时表 只是在客户端这里显示成这个样子而不是说服务器上就真有一个这样的表里面只存了id列。
select所有的操作结果都是临时表都不会影响到数据库服务器原有的数据
3. 查询带有表达式
让查询结果进行一些计算 select 表达式 from 表名; 创建一个新的表格
mysql create table exam_result (id int, name varchar(20), chinese decimal(3,1),math decimal(3,1), english decimal(3,1));
Query OK, 0 rows affected (0.01 sec)decimal(3,1)表示的是三个数字长度保留一位小时如90.133.4 查看表格
mysql desc exam_result;
--------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
--------------------------------------------------
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| chinese | decimal(3,1) | YES | | NULL | |
| math | decimal(3,1) | YES | | NULL | |
| english | decimal(3,1) | YES | | NULL | |
--------------------------------------------------
5 rows in set (0.00 sec)插入数据
mysql INSERT INTO exam_result (id,name, chinese, math, english) VALUES- (1,唐三藏, 67, 98, 56),- (2,孙悟空, 87.5, 78, 77),- (3,猪悟能, 88, 98.5, 90),- (4,曹孟德, 82, 84, 67),- (5,刘玄德, 55.5, 85, 45),- (6,孙权, 70, 73, 78.5),- (7,宋公明, 75, 65, 30);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0再次查询表格
mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
7 rows in set (0.00 sec)让每个人的语文成绩都加10分
mysql select name,chinese 10 from exam_result;
-------------------------
| name | chinese 10 |
-------------------------
| 唐三藏 | 77.0 |
| 孙悟空 | 97.5 |
| 猪悟能 | 98.0 |
| 曹孟德 | 92.0 |
| 刘玄德 | 65.5 |
| 孙权 | 80.0 |
| 宋公明 | 85.0 |
-------------------------
7 rows in set (0.00 sec)但是需要注意的是这里得到的结果都是 临时表 对数据库服务器上面的数据是没有任何影响的
再度查看表结构
mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
7 rows in set (0.00 sec)如果数据变化超过了decimal(3,1)就是出现了多位数结果的情况临时表依旧会保证显示的结果是正确的但是尝试往原始表中插入一个超出范围的数据就是不行的 临时表当中的列完全取决于select指定的列名 4. 起别名查询 select 表达式 as 别名 from 表名; 如求语数英三科总分
mysql select name, chinese math english from exam_result;
-------------------------------------
| name | chinese math english |
-------------------------------------
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.5 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
-------------------------------------
7 rows in set (0.00 sec)如上我们看到的总分表达不是很合理不直观我们可以对它起个别名
mysql select name, chinese english math as total from exam_result;
------------------
| name | total |
------------------
| 唐三藏 | 221.0 |
| 孙悟空 | 242.5 |
| 猪悟能 | 276.5 |
| 曹孟德 | 233.0 |
| 刘玄德 | 185.5 |
| 孙权 | 221.5 |
| 宋公明 | 170.0 |
------------------
7 rows in set (0.00 sec)这样我们的表达就清晰明了 可以通过as指定别名as也可以省略但是个人建议写上 还有一些奇奇怪怪的表达式查询如
mysql select 10 from exam_result;
----
| 10 |
----
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
| 10 |
----
7 rows in set (0.00 sec)这样的SQL语句也可以执行因为把10也当作是一个表达式语法上没错实际上没啥意义 表达式查询这里进行的计算都是列和列之间的计算而不是行和行之间的计算行和行之间的计算有另外的方法 5. 去重查询
把查询结果相同的行合并成一个 select distinct 列名 from 表名; 比如他们各自数学成绩有一个98.0重合的上面数据没有重合此处假设进行去重查询之后就只剩下一个98.0
mysql select distinct math from exam_result;
------
| math |
------
| 98.0 |
| 78.0 |
| 84.0 |
| 85.0 |
| 73.0 |
| 65.0 |
------
6 rows in set (0.00 sec)distinct 也可也以指定多个列必须是多个列值完全相同的时候才会视为相同才会去重
我们在上面继续添加相同信息
mysql insert into exam_result (name, math) values (唐三藏, 98.0);
Query OK, 1 row affected (0.00 sec)mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)对名字和数学列相同进行去重
mysql select distinct name, math from exam_result;
-----------------
| name | math |
-----------------
| 唐三藏 | 98.0 |
| 孙悟空 | 78.0 |
| 猪悟能 | 98.5 |
| 曹孟德 | 84.0 |
| 刘玄德 | 85.0 |
| 孙权 | 73.0 |
| 宋公明 | 65.0 |
-----------------
7 rows in set (0.00 sec)6. 排序查询
查询过程中对于查询到的结果进行排序针对临时表排序对于数据库上原来存的数据没有影响 select 列名 from 表名 order by 列名; 按照语文成绩升序排序
mysql select * from exam_result order by chinese;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| NULL | 唐三藏 | NULL | 98.0 | NULL |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
-----------------------------------------
8 rows in set (0.00 sec)按照语文成绩降序排序
mysql select * from exam_result order by chinese desc;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)降序排序只需要在末尾加个 desc 即可升序末尾是asc但是升序是默认的可以省略 order by 也可以针对带有别名的表达式进行排序
总成绩降序排序
mysql select name, chinese math english as total from exam_result order by total desc;
------------------
| name | total |
------------------
| 猪悟能 | 276.5 |
| 孙悟空 | 242.5 |
| 曹孟德 | 233.0 |
| 孙权 | 221.5 |
| 唐三藏 | 221.0 |
| 刘玄德 | 185.5 |
| 宋公明 | 170.0 |
| 唐三藏 | NULL |
------------------
8 rows in set (0.00 sec)SQL中如果拿 NULL 和其他类型进行混合运算结果仍然是NULL
order by 进行排序的时候还可以指定多个列进行排序
当指定多个列排序的时候就相当于先以第一个列为标准进行比较如果第一列不分胜负那么继续按照第二列进行比较以此类推…
mysql select * from exam_result order by math desc,chinese;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
8 rows in set (0.00 sec)select 操作中如果没有使用 order by 那么查询结果顺序是不确定的没有具体的标准进行排序 7. 条件查询
指定条件对于查询结果进行筛选 select * from 表名 where 条件; 引入where字句针对查询结果进行筛选。筛选可以简单理解成对于查询结果依次遍历把对应的查询结果带入到条件中条件成立则把这个记录放到最终查询结果里条件不成立则直接舍弃不作为最终结果。 比较运算符
运算符说明,,,大于大于等于小于小于等于等于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是 NULLIS NOT NULL不是 NULLLIKE模糊匹配。% 表示任意多个包括 0 个任意字符_ 表示任意一个字符表示 不是赋值了SQL中没有 SQL中NULL NULL 执行结果还是NULL相当于FALSE。NULL NULL 执行结果就是TRUELIKE能进行模糊匹配匹配的过程中可以带上通配符 逻辑运算符
运算符说明AND多个条件必须都为 TRUE(1)结果才是 TRUE(1)OR任意一个条件为 TRUE(1), 结果为 TRUE(1)NOT条件为 TRUE(1)结果为 FALSE(0)
注
WHERE条件可以使用表达式但不能使用别名。AND的优先级高于OR在同时使用时需要使用小括号()包裹优先执行的部分
进行条件查询的时候就是通过上述运算符组合最终完成的
①基本查询
查询英语成绩不及格的人
mysql select * from exam_result where english 60;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
3 rows in set (0.00 sec)条件查询就是把表里的记录挨个往条件中带入 查询语文成绩比英语成绩好的同学
mysql select * from exam_result where chinese english;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
5 rows in set (0.00 sec)查询总分在200分以下的同学
mysql select name, chinese english math as total from exam_result where chinese math english 200;
------------------
| name | total |
------------------
| 刘玄德 | 185.5 |
| 宋公明 | 170.0 |
------------------
2 rows in set (0.00 sec)错误示例
mysql select name, chinese english math as total from exam_result where total 200;
ERROR 1054 (42S22): Unknown column total in where clausewhere 中别名并不能作为筛选条件 ②and 与 or
查询语文大于80分并且英语也大于80分的同学
mysql select * from exam_result where chinese 80 and english 80;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
-----------------------------------------
1 row in set (0.00 sec)查询语文大于80分或者英语大于80分的同学
mysql select * from exam_result where chinese 80 or english 80;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
-----------------------------------------
3 rows in set (0.00 sec)如果一个条件中同时有 and 和 or 先算 and 后算 or
mysql select * from exam_result where chinese 80 or english 70 and math 70;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
-----------------------------------------
4 rows in set (0.00 sec)加上括号之后就是先算括号里的 ③范围查询
查询语文成绩在80到90之间的同学
mysql select * from exam_result where chinese 80 and chinese 90;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
-----------------------------------------
3 rows in set (0.00 sec)mysql select * from exam_result where chinese between 80 and 90;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
-----------------------------------------
3 rows in set (0.00 sec)SQL进行条件查询的时候需要遍历数据带入条件遍历操作在数据集合非常大的时候是比较低效的数据库内部会做出一些优化手段尽可能避免遍历在进行优化的时候MySQL自身实现的一些行为相比于上述直接使用 and 来说between and 是更好进行优化的 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
mysql select * from exam_result where math in (58,59,98,99);
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| NULL | bit me | NULL | 98.0 | NULL |
-----------------------------------------
2 rows in set (0.00 sec)mysql select * from exam_result where math 58 or math 59 or math 98 or math 99;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| NULL | bit me | NULL | 98.0 | NULL |
-----------------------------------------
2 rows in set (0.00 sec)④模糊查询LIKE 通过 like 来完成模糊查询不一定完全相等只要有一部分匹配即可 mysql select * from exam_result where name like 孙%;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
-----------------------------------------
2 rows in set (0.00 sec)%孙–匹配以孙结尾的数据 %孙%–匹配含孙的数据 %–匹配任意数据 模糊查询中需要用到通配符%可以替代任意个字符_可以用来替代任意一个字符俩个下划线就代表俩个任意字符
虽然数据库支持模糊匹配但是使用中也要慎重使用模糊匹配。模糊匹配本身其实是非常低效的如果做成正则表达式这样效率就会更低。
⑤NULL的查询
mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)mysql select * from exam_result where chinese NULL;
Empty set (0.00 sec)mysql select * from exam_result where chinese NULL;
--------------------------------------
| id | name | chinese | math | english |
--------------------------------------
| NULL | 唐三藏 | NULL | 98.0 | NULL |
--------------------------------------
1 row in set (0.00 sec)mysql select * from exam_result where chinese is NULL;
--------------------------------------
| id | name | chinese | math | english |
--------------------------------------
| NULL | 唐三藏 | NULL | 98.0 | NULL |
--------------------------------------
1 row in set (0.00 sec)从上面三个式子查询 NULL 中可以看出 直接使用 来进行匹配是不能正确进行筛选的使用 可以正确和 NULL 进行匹配使用 is NULL 也是可以进行比较的 8. 分页查询
使用 limit 关键字来进行限制返回的结果条数使用 offset 来确定从第几条开始进行返回 select 列名 from 表名 limit N offset M; select 列名 from 表名 limit M, N 从第 M 条开始查询最多返回 N 条记录
mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)mysql select * from exam_result limit 3;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
-----------------------------------------
3 rows in set (0.00 sec)mysql select * from exam_result limit 3 offset 3;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
-----------------------------------------
3 rows in set (0.00 sec)mysql select * from exam_result limit 3 offset 6;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
2 rows in set (0.00 sec)查询总分前三成绩的同学
mysql select name, chinese english math as total from exam_result order by total desc limit 3;
------------------
| name | total |
------------------
| 猪悟能 | 276.5 |
| 孙悟空 | 242.5 |
| 曹孟德 | 233.0 |
------------------
3 rows in set (0.00 sec)select * 这样的操作容易把数据库弄挂了除了 select * 之外只要你返回的记录足够多哪怕用了其他方式查询也是同样有风险的即使你加上 where 条件筛选万一筛选的结果很多还是会弄坏服务器最稳妥的办法就是加上 limit 。 四. 修改Update
此处的修改是针对数据库服务器进行的这里的修改是持续有效的 update 表名 set 列名 值… where 子句 核心信息针对哪个表的哪些行的哪些列改成啥样的值。
把孙悟空数学成绩修改为80分
mysql update exam_result set math 80 where name 孙悟空;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 80.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)将曹孟德同学的数学成绩变更为 60 分语文成绩变更为 70 分
mysql update exam_result set chinese 70, math 60 where name 曹孟德;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 2 | 孙悟空 | 87.5 | 80.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 70.0 | 60.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| NULL | 唐三藏 | NULL | 98.0 | NULL |
-----------------------------------------
8 rows in set (0.00 sec)将总成绩倒数前三的 3 位同学的数学成绩加上 30 分先查明成绩总单 mysql select name, chinese english math as total from exam_result order by total;
------------------
| name | total |
------------------
| 唐三藏 | NULL |
| 宋公明 | 170.0 |
| 刘玄德 | 185.5 |
| 曹孟德 | 197.0 |
| 唐三藏 | 221.0 |
| 孙权 | 221.5 |
| 孙悟空 | 244.5 |
| 猪悟能 | 276.5 |
------------------
8 rows in set (0.00 sec)mysql update exam_result set math math 30 order by chinese english math limit 3;
ERROR 1264 (22003): Out of range value for column math at row 1发现出现了错误原因就是有数学加30超出了合理范围但是可以减去30不能写成 math 30 update 后面的条件很重要修改操作是针对条件筛选之后对剩下的数据进行的修改如果没写条件意味着就是对所以行都进行修改
update 也是一种比较危险的操作除了提前备份就基本无法还原改前数据 五. 删除Delete
删除符合条件的行 delete from 表名 where 条件; delete from 表名; -- 把表里的记录都删除了表只剩下一个空的表了
删除唐三藏的信息
mysql delete from exam_result where name 唐三藏;
Query OK, 1 row affected (0.00 sec)mysql select * from exam_result;
-----------------------------------------
| id | name | chinese | math | english |
-----------------------------------------
| 2 | 孙悟空 | 87.5 | 80.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.5 | 90.0 |
| 4 | 曹孟德 | 70.0 | 60.0 | 67.0 |
| 5 | 刘玄德 | 55.5 | 85.0 | 45.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.5 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
-----------------------------------------
6 rows in set (0.00 sec)删除表里的内容表还存在
mysql delete from exam_result;
Query OK, 7 rows affected (0.00 sec)mysql select * from exam_result;
Empty set (0.00 sec)drop table 是把整个表都干掉了