一、插入数据(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语句的执行结果

  1. 执行FROM语句,知道最开始从哪个表开始的
  2. 执行ON语句,根据ON后面指定的条件筛选出符合条件的
  3. 添加外部行,只有在连接OUTER JOIN类型时才执行,RIGHT OUTER JOIN、LEFT OUTER JOIN、FULL OUTER JOIN  (详细见多表查询)
  4. 执行WHERE语句            注意:由于数据还没有分组,因此现在还不能在WHERE过滤器中使用where_condition=MIN(col)这类对分组统计的过滤;
  5. 执行GROUP BY分组,对使用WHERE子句得到的虚拟表进行分组操作,默认只显示组内第一条
  6. 执行HAVING过滤,对分组后的虚拟表进行过滤
  7. 执行SELECT,从虚拟表中筛选出需要的信息
  8. 执行DISTINCT语句  去掉重复的内容
  9. 执行ORDER BY语句,对去重后的虚拟表进行排序
  10. 执行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数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)的更多相关文章

  1. Swift3.0服务端开发(四) MySQL数据库的连接与操作

    本篇博客我们来聊聊MySQL数据库的连接与操作.如果你本地没有MySQL数据库的话,需要你先安装MySQL数据库.在Mac OS中使用brew包管理器进行MySQL的安装是及其方便的.安装MySQL的 ...

  2. [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]

    [MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...

  3. mysql增删改查相关操作

    mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...

  4. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  5. oracle插入,更新,删除数据

    插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...

  6. sqlserver 插入 更新 删除 语句中的 output子句

    官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...

  7. MySQL数据库---记录相关操作

    序 表中记录的相关操作一共四种:插入,更新,删除.查询.其中使用最多,也是最难的就是查询. 记录的插入 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3… ...

  8. MySQL之记录相关操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  9. python、第四篇:记录相关操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

随机推荐

  1. VMware虚拟机安装使用及系统安装教程

    虚拟机是利用软件来模拟出完整计算机系统的工具.具有完整硬件系统功能的.运行在一个完全隔离环境中.虚拟机的使用范围很广,如未知软件评测.运行可疑型工具等,即使这些程序中带有病毒,它能做到的只有破坏您的虚 ...

  2. Spring 常用配置、Bean

    spring模块 Spring-Core: Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能. Spring-Context:(Spring ...

  3. 后来,我发现,要想用好WIMBuilder2你必须具有以下能力:

    后来,我发现,要想用好WIMBuilder2你必须具有以下能力:1.一定的中文语言阅读能力,两个帖子1500楼层中主要的功能要弄明白,包括wimbuilder2的架构.补丁的制作.2.一定的英文语言阅 ...

  4. [LeetCode] 662. Maximum Width of Binary Tree 二叉树的最大宽度

    Given a binary tree, write a function to get the maximum width of the given tree. The width of a tre ...

  5. [LeetCode] 379. Design Phone Directory 设计电话目录

    Design a Phone Directory which supports the following operations: get: Provide a number which is not ...

  6. [LeetCode] 141. Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...

  7. IDEA中SonarLint的安装与使用

    一.SonarLint插件的安装 1.1在线安装 (1)在IDEA菜单栏选择File->Settings,左边栏选择Plugins (2)在线安装选择Browse repositories,搜索 ...

  8. android 完全退出实现

    实现方法是在application中定义一个集合存储所有的Activity对象,在Activity创建时添加进集合中,在程序退出时,finish掉所有的Activity即可. 步骤如下: 1.自定义A ...

  9. oracle--sqlplus格式化输出

    01,日期格式化输出 SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:mi:ss'; SQL> select sysdate ...

  10. 【报名中】【5G探索】深度揭秘5G核心技术与挑战,云+社区开发者大会北京站等你来!

    报名渠道(扫描下方二维码) 开发者专属福利 限量手办 现场幸运签到开发者即可获得,早到获奖几率更大 幸运抽奖 一等奖:1名 JBL LIVE650 BTNC无线主动降噪智能耳机 二等奖:3名 JBL ...