目录
一: Mysql增删改查之插入记录
1.插入基本语法一
类别 | 详细解示 |
---|---|
基本语法 | insert into 表 values(值1,值2,值n); |
示例 | INSERT INTO user values(2,'php中文网','男') |
示例说明 | 向user表中插入值id为2,姓名为李文凯,性别为男 |
2.插入基本语法二
类别 | 详细解示 |
---|---|
基本语法 | insert into 表(字段1,字段2,字段n) values(值1,值2,值n); |
示例 | INSERT INTO user(id,username,sex) values(213,'小沈阳',1); |
示例说明 | 向user表中插入id为213,username为小沈阳,性别为1 |
3.基本语法1和基本语法2的区别是:
1).基本语法1的插入语句,表中有多少个字段就必须要插入多少个值;一个不能多,一个也不能少;若有默认值,不想传,可以写上null。
2).基本语法2中,除非有必填字段必须要写入值外;如果有默认值的不想写可以忽略不写;mysql会自动补填默认值。
3).基本语法2中,以user(id,username,sex)字段顺序为值的顺序。
4.eg: 假设有一张表为user表,我们对字段、字段说明、类型和字段选填和必须状态进行说明,表结构如下:
字段 | id | username | password | sex | |
---|---|---|---|---|---|
中文说明 | 编号 | 用户名 | 邮箱 | 密码 | 性别 |
类型说明 | int | varchar(50) | varchar(60) | varchar(32) | tinyint |
默认值说明 | 自增 | 必填 | 选填字段,默认值为123@php.cn |
1).按照基本语法一写上表中的插入语句:
INSERT INTO user values(null,'php中文网','pig@php.cn',null ,1);
注意
- 可以不指定字段名称,但是 values 后面的顺序应该和表字段的排序一致。
- 有默认值的字段可以不写,则为默认值。
- 如果有默认值或者可空字段不想传入具体值,可写入null。
- 数据格式必须要与表规定的数据格式一致。
2).按照基本语法二写上表中的插入语句:
INSERT INTO user(username,sex) values('php中文网',1);
注意
- ID为自增的自段可以不用传入值,每插入一次这个字段的值会自动向上加1。
- 有默认值和可为空的字段可不传;
- 以表user(username,sex)的插入顺序为准;
- 基本语法二为更常用的用法;
5.基本语法变形:一次插入多条记录;
INSERT INTO user(username,password,sex)
values('黄晓明', 'abcdef', 1),
( 'angelababy', 'bcdeef', 0),
( '陈赫', '123456', 1),
('王宝强', '987654', 1);
二: Mysql增删改查之查询记录
1.创建一个money表
CREATE TABLE money (
id INT NOT NULL AUTO_INCREMENT ,
username VARCHAR(50) NOT NULL ,
balance FLOAT NOT NULL ,
province VARCHAR(20) NOT NULL ,
age TINYINT UNSIGNED NOT NULL ,
sex TINYINT NOT NULL ,
PRIMARY KEY (id)
) ENGINE = InnoDB CHARACTER SET utf8;
2.基础查询
类别 | 详细解示 |
---|---|
基本语法 | select * from 表; |
示例 | select * from money; |
示例说明 | 查询money表中所有字段中的所有结果 |
注:”*” 是一种正则表达式的写法,表示匹配所有;
3.指定字段查询
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表; |
示例 | select id,username, balance from money; |
示例说明 | 查询money表中id,username, balance字段中的所有结果 |
4.查询单个字段不重复记录distinct
类别 | 详细解示 |
---|---|
基本语法 | select distinct 字段 from 表; |
示例 | select distinct age deptno from money; |
示例说明 | 查询money表中年龄唯一的所有结果 |
5.条件查询 where
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 where where条件; |
示例 | select * from money where age = 29; |
示例说明 | 查询money表中年龄为29的所有结果 |
6.where后可接的条件
1).比较运算符结果集中将符合条件的记录列出来;
符号 | 说明 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
= | 等于 |
2).逻辑运算符
多个条件还可以使用 or 、 and 等逻辑运算符进行多条件联合查询
符号 | 说明 |
---|---|
or | 或者 |
and | 并且 |
3).eg:
类型 | 详细内容 |
---|---|
示例 | select * from money where id <10 and province='湖北'; |
说明 | 查询所有字段 要求id小于10 并且province='湖北' |
7.结构集排序
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 order by 字段 排序关键词 |
示例 | select id,username, balance from money order by balance desc; |
示例说明 | 查询money表中的id,username,balance字段,按照余额进行降序排序 |
排序用到的关键词:
关键词 | 说明 |
---|---|
asc | 升序排列,从小到大(默认) |
desc | 降序排列,从大到小 |
在 select 出来之后的结果集中排序使用 order by ,其中 desc 和 asc 是排序顺序中的关键字。desc 表示按照字段进行降序排列,asc 表示升序排列,如果不写关键字默认升序排列。
eg:
select id,username, balance from money order by balance desc;
8.多字段排序
order by 后面可以跟多个不同的字段排序,并且排序字段的不同结果集的顺序也不同,如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 order by 字段1 排序关键词,... ...字段n desc|asc; |
示例 | select id,username, balance from money order by balance desc,age asc; |
示例说明 | 查询money表中的id,username,balance字段,按照余额进行降序排序,若余额全都一样,则再使用age进行升序排序 |
* 注:如果第一个字段已经将结果给排好。第二个字段排序字段不生效。本例中,第二个字段无效。*
9.结果集限制
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 limit 数量; |
示例 | select id,username, balance from money limit 5; |
示例说明 | 显示前五个用户 |
10.限制结果集并排序
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 order by 字段 关键词 limit 数量 |
示例 | select id,username, balance from money order by balance desc limit 5; |
示例说明 | 按照钱来排序,显示前五个最有钱的用户 |
11.结果集区间选择 limit 偏移量,数量
假设我从第0条开始取了3条记录。又想再从第3条开始取3条记录。再想从第6条开始取4条记录怎么办?
这时候就需要使用到结果集区间选择。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 limit 偏移量,数量 |
示例 | select id,username, balance from money limit 0,3; |
示例说明 | 从第一条开始取三条记录 |
从第三条开始再取三条呢?
select id,username, balance from money limit 3,3;
12. 统计类函数使用
函数 | 说明 |
---|---|
sum | 求和 |
count | 统计总数 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
注:当然你知道其他的mysql函数也可以使用。不过,在实际工作中,大公司的很多大中型项上很少使用,他们都有专门的计数服务器。因为,mysql的计算量本身很大,为了减少压力通常我们将实际的计算任务交给业务服务器或其他服务器来完成。
1). count
类别 | 详细解示 |
---|---|
基本语法 | select 函数(字段) from 表 |
示例 | select count(id) from money |
示例说明 | 查询money表的id总数 |
2). as 给字段取别名使用as关键字。
select count(id) as zongshu from money;
3).查询平均金额
select avg(balance) from money;
4).查询总金额
select sum(balance) from money;
5).查询最大金额
select max(balance) from money;
6).查询最小金额
select min(balance) from money;
13.分组 group by
我们拿金额表里面的省份进行分组数据,分组数据后你会发现。有相同的省份会去掉。即,一个省份为一个组。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 |
示例 | select * from money group by province; |
示例说明 | 按照地区进行分组 |
1).统计分组(分类)各总数:
select deptno, count(1) from emp group by deptno;
2).统计省份数量后再进行分组显示
select count(province),province from money group by province;
14.在分组基础上进行统计
它的主要功能是对于分组的数据进行统计后,再进行一次总数统计。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 with rollup |
示例 | select count(province),province from money group by province with rollup; |
示例说明 | 对分组的数再次进行统计 |
15.结果再过滤having
having 是筛选组 而where是筛选记录。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 having 条件 |
示例 | select count(province) as result ,province from money group by province having result >2; |
示例说明 | 对地区分组并统计总数,将分组结果中大于2的分组地区显示出来 |
16.整体使用SQL
1).整体的SQL语句配合使用的语法结构如下:
SELECT
[字段1 [as 别名1],[函数(字段2) ,]......字段n]
FROM 表名
[WHERE where条件]
[GROUP BY 字段]
[HAVING where_contition]
[order 条件]
[limit 条件]
注:上面的语句中可以[] 代表可选。
2).最终的语法总结如下:
关键词 | 说明 |
---|---|
select | 选择的列 |
from | 表 |
where | 查询的条件 |
group by | 分组属性 having 分组过滤的条件 |
order by | 排序属性 |
limit | 起始记录位置,取记录的条数 |
我们进行一次整体的给合使用,查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。
select id,username,balance,province from money
where id > 1 and balance > 50 group by province
order by id desc limit 3;
三: Mysql多表联合查询
1.业务中需要多表联合在一起查询才能有结果,而多表联合查询的本质是:表连接。
2.表连接,当需要查询多个表中的字段时,就可以使用表连接来实现。表联接分为内连接和外连接。
3.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。
4.外连接:会选出其他不匹配的记录,分为外左联结和外右联结。
5.内联接语法一:
类别 | 详细解示 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件; |
示例 | select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user,order_goods where user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
下例中from 表使用到了表别名,由于表名太长,每次写的时候容易写错。我们可以在表后直接跟上一个简写英文字符串。在前面拼接字段时,直接使用简写字符串.字段即可。
select u.uid ,u.username as username,o.oid,o.uid,
o.name as shopname from user u,order_goods o
where u.uid = o.uid;
6.内联接语法二:
类别 | 详细解示 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 INNER JOIN 表n on 条件; |
示例 | select user.uid ,user.username as username,order_goods.oid,order_goods.uid,order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
结果与语法1中一致;
7.左外连接
说明 | 详解 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件; |
示例 | select * from user left join order_goods on user.uid = order_goods.uid; |
示例说明 | 以左边为主,查询哪些用户未购买过商品,并将用户信息显示出来 |
外连接又分为左连接和右链接,具体定义如下。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
8.右外连接
右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
类别 | 详细解示 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件; |
示例 | select * from user right join order_goods on user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
9.子查询
当我们查询的时候,需要的条件是另外一个select语句的结果,这时就需要使用子查询。用于子查询的关键字包括in、not in、=、!=、exists、not exists等。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 where 字段 in(条件) |
示例1 | select * from user where uid in (1,3,4); |
示例1说明 | 按照id 查询指定用户 |
示例2 | select * from user where uid in (select uid from order_goods); |
示例2说明 | 将购买过商品的用户信息显示出来 |
10.记录联合
使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。两者主要的区别是把结果直接合并在一起,而 union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果。
类别 | 详细解示 |
---|---|
基本语法 | select语句1 union[all] select语句2 |
示例 | select * from user where uid in (1,3,4); |
示例说明 | 将商品表中的用户信息和用户表中的用户信息的结果组合在一起 |
select uid from user union select uid from order_goods;
四: Mysql增删改查之更新记录
1.更新记录就是修改内容,使用 update 语句进行记录更新
类别 | 详细解示 |
---|---|
基本语法 | update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件 |
示例 | update money set balance=balance-500 where userid = 15; |
示例说明 | 修改money表,将balance余额减500。要求userid为15 |
2.修改多个字段
update money set balance=balance-500,username='李文凯' where userid = 15;
3.同时对两个表进行更新
类别 | 详细解示 |
---|---|
基本语法 | update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件 |
示例 | update money m,user u m.balance=m.balance*u.age where m.userid=u.id; |
示例说明 | 修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的balance*用户表的age。执行条件是:m.userid = u.id |
【切记】:更新时一定要记住加上where条件,不然会更新掉整个表的记录。
五: Mysql增删改查之删除记录
1.使用 delete 删除记录
类别 | 详细解示 |
---|---|
基本语法 | DELETE FROM 表 [where 条件]; |
示例 | DELETE FROM user where id > 10; |
示例说明 | 删除掉用户表中id大于10的所有用户 |
2.清空表记录
delete和truncate是一样的,但它们有一点不同,那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。
如果一个表中有自增字段,使用truncate table 这个自增字段将起始值恢复成1.
类别 | 说明 |
---|---|
基本语法 | TRUNCATE TABLE 表名; |
示例 | TRUNCATE TABLE user; |
示例说明 | 清空表的数据,并且让自增的id从1开始自增 |
【切记】
- 删除时一定要记住加上where条件,不然会清空掉整个表的记录。
- 删除重要数据前一定要备份、备份、备份。