MySQL数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)
一、插入数据(insert)
1. 插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); # 后面的值必须与字段一一对应 语法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n); 2. 指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); # 后面的值必须与指定的字段一一匹配 3. 插入多条记录
语法:
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n); 4. 插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …;
二、更新数据(update)
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION; # where 有则根据条件修改,若是没有,则叫表中的对应字段的值全部修改 示例:
UPDATE mysql.user SET password=password(‘123’)
where user=’root’ and host=’localhost’;
三、删除数据(delete)
删除数据时,如果设置过主键自动增长:
- 部分删除,会保留行号,先修改主键的值,再添加新的数据
- 全部删除,会保留行号,先修改主键的值,在添加新的数据 =====> 全部修改可以用 truncate table 表名 来清空表中数据
修改添加数据时的自动增长的起始位置: alter table 表名 auto_increment = 位置(整型数字)
语法:
DELETE FROM 表名
WHERE CONITION; 示例:
DELETE FROM mysql.user
WHERE password=’’;
四、查询数据
1、单表查询
(1)单表查询的语法
SELECT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
(2)关键字的优先级(重点)
重点中的重点:关键字的执行优先级
from # 1.找到表
where # 2.根据where指定的约束条件,去表中取出一条条记录
group by # 3.将取出的一条条记录分组,若没分组,则视为一个整体
having # 4.将分组后的结果进行过滤
select # 5.执行select
distinct # 6.去重
order by # 7.排序,默认是升序
limit # 8.限制结果的显示条数
(2.1)关键字定义顺序
SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
(2.2)关键字的执行顺序
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
(2.3)执行顺序详解
SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果
- 执行FROM语句,知道最开始从哪个表开始的
- 执行ON语句,根据ON后面指定的条件筛选出符合条件的
- 添加外部行,只有在连接OUTER JOIN类型时才执行,RIGHT OUTER JOIN、LEFT OUTER JOIN、FULL OUTER JOIN (详细见多表查询)
- 执行WHERE语句 注意:由于数据还没有分组,因此现在还不能在WHERE过滤器中使用
where_condition=MIN(col)这类对分组统计的过滤; - 执行GROUP BY分组,对使用
WHERE子句得到的虚拟表进行分组操作,默认只显示组内第一条 - 执行HAVING过滤,对分组后的虚拟表进行过滤
- 执行SELECT,从虚拟表中筛选出需要的信息
- 执行DISTINCT语句 去掉重复的内容
- 执行ORDER BY语句,对去重后的虚拟表进行排序
- 执行LIMIT[m,]n 语句,从m行(不包括m)开始显示n行数据
具体过程可参考博客:http://www.cnblogs.com/linhaifeng/articles/7372774.html
注意点:
# where
1.where是从硬盘众读取数据到内存
2.比较运算符:> < >= <= <> !=
2.between 80 and 100 # 值在10到20之间
3.in(80,90,100) # 值是10或20或30
4.like 'e%' # 模糊查询
5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not 强调:
where是一条一条读取数据到内存,根据后面的条件判断是符合,因此不能同聚合函数来对数据进行处理
# group by
1.在MySQL中,如果没有设置sql_mode为 ONLY_FULL_GROUP_BY ,那么结果就会只显示每一组的一条,别的被隐藏
2.可以利用聚合函数,按照统计结果进行分组
3.分组是在where之后得到的记录进行的
4.大前提:可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
5. 注意 ONLY_FULL_GROUP_BY
小窍门:‘每’这个字后面的字段,就是我们分组的依据
6.ONLY_FULL_GROUP_BY作用:
没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的,因此设置sql_mode为ONLY_FULL_GROUP_BY
设置命令:set global sql_mode = 'ONLY_FULL_GROUP_BY'
# having
1.对分组之后的数据进行筛选,必须是分组了以后,才能进行having 筛选。
2.并且是在从硬盘中读取完数据以后,才能进行分组,再开始筛选。
3.筛选可以利用聚合函数,根据统计结果进行筛选
4.Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
#order by
对记录进行排序
select * fron t order by salary desc; # desc 降序排序
select * from t order by salary asc ; # asc 升序排序 如果不写明 desc / asc ,默认为asc升序排序
# limit
1.限制显示的条数
select * from emp limit 3; # 显示前三条数据
select * from emp limit 2,3; # 显示从第3条开始的3条数据
2.常用于数据的分页显示
例如:
select *from emp limit 0,10; # 第一页 # 页数 减1 乘以条数 得到起始位置
select *from emp limit 10,10; # 第2页
select *from emp limit 20,10; # 第3页
(3)聚合函数
聚合函数聚合的是 组 的内容,若是没有分组,则默认一组
sum() #求和
avg() #求平均数
max()/min() #求最大值 / 最小值
count() # 统计个数 示例:
SELECT COUNT(sex='男') 男,COUNT(sex='女') 女 FROM employee;
SELECT COUNT(*) FROM employee WHERE depart_id=1;
SELECT MAX(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE depart_id=3;
(4)使用正则表达式查询
SELECT * FROM employee WHERE name REGEXP '^ale';
SELECT * FROM employee WHERE name REGEXP 'on$';
SELECT * FROM employee WHERE name REGEXP 'm{2}';
小结:对字符串匹配的方式
WHERE name = 'Tom';
WHERE name LIKE 'yua%';
WHERE name REGEXP 'on$';
2、多表查询
create table emp (id int,name char(10),sex char,dept_id int);
insert emp values(1,"大黄","m",1);
insert emp values(2,"老王","m",2);
insert emp values(3,"老李","w",30); create table dept (id int,name char(10));
insert dept values(1,"市场");
insert dept values(2,"财务");
insert dept values(3,"行政");
建表
(1)什么是多表查询
多表查询是在多个表中查询数据
(2)查询方式
1. 交叉连接:不适用任何匹配条件。只是用于生成笛卡尔积
2. 内连接:只连接匹配的行
3. 外链接之左连接:优先显示左表全部记录
4. 外链接之右连接:优先显示右表全部记录
5. 全外连接:显示左右两个表全部记录
6. 子查询:上一次查询的结果,作为本次查询的原始数据
(3)交叉查询
# 交叉查询只是用来生成笛卡尔积,不适用于任何匹配 select *from emp,dept;
mysql> select *from emp,dept ;
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黄 | m | 1 | 1 | 市场 |
| 2 | 老王 | m | 2 | 1 | 市场 |
| 3 | 老李 | w | 30 | 1 | 市场 |
| 1 | 大黄 | m | 1 | 2 | 财务 |
| 2 | 老王 | m | 2 | 2 | 财务 |
| 3 | 老李 | w | 30 | 2 | 财务 |
| 1 | 大黄 | m | 1 | 3 | 行政 |
| 2 | 老王 | m | 2 | 3 | 行政 |
| 3 | 老李 | w | 30 | 3 | 行政 |
+------+--------+------+---------+------+--------+
(4)内连接查询(inner join)
# 找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果 select *from emp inner join dept on emp.dept_id = dept.id;
等同于:
select *from emp,dept where emp.dept_id = dept.id;
mysql> select *from emp inner join dept on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黄 | m | 1 | 1 | 市场 |
| 2 | 老王 | m | 2 | 2 | 财务 |
+------+--------+------+---------+------+--------+
(5)外连接查询之左连接(left join <===> left outer join)
#以左表为准,左表中记录完全显示,右边匹配才显示
#本质就是:在内连接的基础上增加左边有右边没有的结果 select *from emp left join dept on emp.dept_id = dept.id;
mysql> select * from emp left join dept on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黄 | m | 1 | 1 | 市场 |
| 2 | 老王 | m | 2 | 2 | 财务 |
| 3 | 老李 | w | 30 | NULL | NULL |
+------+--------+------+---------+------+--------+
(6)外连接查询之右连接(right join <===> right outer join)
#以右表为准,右表中记录完全显示,左边匹配才显示
#本质就是:在内连接的基础上增加右边有左边没有的结果 select *from emp right join dept on emp.dept_id = dept.id;
mysql> select *from emp right join dept on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黄 | m | 1 | 1 | 市场 |
| 2 | 老王 | m | 2 | 2 | 财务 |
| NULL | NULL | NULL | NULL | 3 | 行政 |
+------+--------+------+---------+------+--------+
(7)全外连接(union间接连接)
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果,也就是把多个查询结果合并在一起显示
#注意:mysql不支持全外连接 full JOIN
#强调:mysql可以使用此种方式间接实现全外连接 union select *from emp right join dept on emp.dept_id = dept.id
union
select *from emp left join dept on emp.dept_id = dept.id; 注意:
union与union all的区别:union会去掉相同的纪录
mysql> select *from emp right join dept on emp.dept_id = dept.id
-> union
-> select *from emp left join dept on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id | name | sex | dept_id | id | name |
+------+--------+------+---------+------+--------+
| 1 | 大黄 | m | 1 | 1 | 市场 |
| 2 | 老王 | m | 2 | 2 | 财务 |
| NULL | NULL | NULL | NULL | 3 | 行政 |
| 3 | 老李 | w | 30 | NULL | NULL |
+------+--------+------+---------+------+--------+
3、子查询
当一次无法查询到所要的数据,可以利用子查询实现,子查询能实现的,也可以通过多表查询实现
#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等
select * from emp where salary = (select max(salary) from emp);
取别名:给就近一个字段名或者是一个表去别名,as可以省略
select dep_id,avg(age) avg_age from emp group by dep_id t2;
这个语句相当于:select dep_id,avg(age) as avg_age from emp group by dep_id as t2;
MySQL数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)的更多相关文章
- Swift3.0服务端开发(四) MySQL数据库的连接与操作
本篇博客我们来聊聊MySQL数据库的连接与操作.如果你本地没有MySQL数据库的话,需要你先安装MySQL数据库.在Mac OS中使用brew包管理器进行MySQL的安装是及其方便的.安装MySQL的 ...
- [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]
[MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...
- mysql增删改查相关操作
mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...
- 我的MYSQL学习心得(八) 插入 更新 删除
我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...
- oracle插入,更新,删除数据
插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...
- sqlserver 插入 更新 删除 语句中的 output子句
官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...
- MySQL数据库---记录相关操作
序 表中记录的相关操作一共四种:插入,更新,删除.查询.其中使用最多,也是最难的就是查询. 记录的插入 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3… ...
- MySQL之记录相关操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- python、第四篇:记录相关操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
随机推荐
- JavaScript中的回调函数(callback)
什么是回调函数 In computer programming, a callback is a piece of executable code that is passed as an argum ...
- 10.webpack学习使用
1.什么是Webpack Webpack 是当下最热门的前端资源模块化管理和打包工具,它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分离,等到 ...
- ESP8266 LUA脚本语言开发: 准备工作-LUA开发是怎么来的
前言 当前8266有各种开发 1.在官方已经封装好的C库上开发(SDK开发) 2.官方在SDK的基础上封装的AT指令程序(AT指令开发) 3.在SDK的基础上嵌入脚本语言(Lua,Python等开发方 ...
- <Random>382 380
382. Linked List Random Node class Solution { ListNode node; Random random; /** @param head The link ...
- 题解 P3620 【[APIO/CTSC 2007]数据备份】
直接贪心(每次选最小)的话显然不对...样例都过不了... 选两个办公楼的时候,显然不能跨越另一个楼,这样不优... 于是 先把原数列处理成n-1个的数(每一个办公楼和上一个的距离),存在a[]中 题 ...
- [LeetCode] 37. Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- @JsonView的使用
1.使用场景 在某一些请求返回的JSON中,我们并不希望返回某些字段.而在另一些请求中需要返回某些字段. 例如: 在查询列表请求中,不返回password字段 在获取用户详情中,返回password字 ...
- SpringBoot第四篇:整合JDBCTemplate
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10868954.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前面几篇文 ...
- golang语言特性
1. 垃圾回收 a. 内存⾃动回收,再也不需要开发⼈员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,不需要释放 2. 天然并发 a. 从语⾔层面⽀持并发,⾮常简 ...
- history路由模式下的nginx配置
路由模式 众所周知,浏览器下的单页面应用的路由模式有下面两种: hash 模式和 history 模式.hash 模式通用性好,而且不依赖服务器的配置,省心省力,但是缺点是不够优雅.相比于 hash ...