四、操作数据表中的记录
4-2插入记录INSERT
INSERT [INTO] table_name [(column_name,...)] {VALUES|VALUE} ({expr|DEFAULT},...),(...),...;
/*
column_name 表示列名
expr 表示表达式
DEFAULT 可直接书写,表示默认值 当字段有自动增加的属性后,在插入表的所有字段的数据时,可以填写 NULL 或 DEFAULT 这两个关键字,表示按照原先默认自动增长的属性
插入多行数据时,可以用逗号隔开
*/
Eg:
INSERT INTO table_name VALUES(DEFAULT,'BeforeDayBreak',md5('123'),DEFAULT,0),(NULL,'Superman',md5('123'),DEFAULT,0);
4-3插入记录INSERT SET-SELECT
前面说的
insert [column_name]values(...)[,(...),(....)];
比较常用,可以一次性插入多条记录,并且可以输入表达式甚至是函数 但是无法进行子查询
insert tb_name set column_name={expr|default}
可以进行子查询,但是只能插入一条记录
第三种
insert方法 insert table_name [(colname...)] select.....
这种方法就是把查询到的结果插入到指定数据表中
4-4单表更新记录UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={exp1|DEFAULT}[,col_name2=...][WHERE where_condition]
/*一般来说要用WHERE指定位置,不然所有数据都会被更新*/
例:
不指定记录:UPDATE users set age = age + 5,sex = 0; 使表里所有记录的age加5
指定记录: UPDATE users set age = age+ + 10 WHERE id % 2=0; 取id为偶数的位置
4-5单表删除记录
DELETE FROM tbl_name [WHERE where_conditon];
若不添加WHERE则删除【全部记录】 删除后再插入,插入的id号从最大的往上加,而不是填补删除的。(自动编号)
4-6查询表达式解析
- 每一个表达式表示想要的一列,必须至少有一个
- 多个列之间以英文逗号分隔
- 星号(*)表示所以列 tbl_name.*可以表示命名表的所有列
- 查询表达式可以使用[As]alias_name为其赋予别名
- 别名可用于GROUP BY,ORDRE BY或HAVING子句
- SELECT 字段出现顺序影响结果集出现顺序,字段别名也影响结果集字段别名。
查找记录
- 语法:
SELECT select_expr [,select expr2...] 只查找某一个函数或表达式
[
FROM table_references 查询表名
[WHERE where_conditon] 查询条件
[GROUP BY {col_name|position} [ASC|DESC],...] 按某个字段进行分组,相同的只显示第一个
[HAVING where_conditon] 分组时,给出显示条件
[ORDER BY {col_name|expr|position} [ASC|DESC],...] 排序
[LIMIT {[offset,]row_count|row_count OFFSET offset}] 限制返回数量
}
- 查询表达式的顺序会影响结果顺序
- 使用tbl_name.col_name来表示列记录,这多表查询时可以区别开同名的列
- 使用[AS] alias_name为其赋予别名,别名可以用于GROUP BY、ORDER BY或HAVING子句,
例如SELECT id AS userId,username AS uname FROM users; 这样查询出来的结果会用别名表示
4-7WHERE语句进行条件查询
where 后各种根据条件(>、<、=、>=、<=、!=、<>、IS NOT NULL),根据逻辑(and,or),根据结合方式left join、right join等,根据模式匹配(IN、NOT IN、like、not like、regexp),使用各种MySQL函数和表达式,从表集合中筛选记录。
4-8GROUP BY语句对查询结果分组
[GROUP BY {col_name|position} [ASC|DESC],...]
ASC:升序,默认
DESC:降序
position:SELECT语句中列的序号
eg. SELECT sex FROM users GROUP BY sex;
对users中的sex按sex进行分组
eg. SELECT * FROM users GROUP BY 1;
(这里的1表示查询的第一个字段,这里查询所有字段信息,第一个字段就是id,所以会按照id字段进行分组)
1表示SELECT语句中第一个出现的字段,即位置。
- 建议BY后写列名称,不写位置,因为位置还要人为数。
- 注意:如果存在相同的值(例如上面的age可能有多个相同的值),只会保留一个。但使用ORDER BY 就不会省略。
4-9HAVING语句设置分组条件
having 语句分组,用在group by后面追加条件,判断式中的字段是必须出现在前面select中的 或者是可以包含没有出现在前面查询中的字段的一个聚合函数count(),max()等等
[HAVING when where_condition]
SELECT sex FROM users GROUP BY 1 HAVING age > 35; //有错
SELECT sex, age FROM users GROUP BY 1 HAVING age > 35;
SELECT sex FROM users GROUP BY 1 HAVING count(id) >= 2; (
这条指令,指按照sex分组,分成了两组sex=0和sex=NULL,条件id数大于2的留下显示,显然sex=0个数有8>2故留下,而sex=NULL个数为1,不满足条件,故不显示。如果条件改成count(id)>=1,则会显示sex为0和NULL两个分组。)
聚合函数永远只有一个返回结果 count是记录个数的,
4-10ORDER BY语句对查询结果排序
对查询结果进行排序,默认是升序
order by{col_name}
select * from users order by id desc; //对一个字段排序
select * from users order by age,id desc; //两个字段同时排序
desc是降序
1、对查询结果进行排序:
[ORDER BY [col_name | expr | position } [ASC|DESC],...]elect * from user order by id desc;
2、可以同时按多条字段进行排序,规则是先按前面的字段排,在基础上再按后面字段排。
3、如:SELECT * FROM users ORDER BY age,id DESC; 先按照age排序,如果age有重复的,重复的字段里按id排序
4-11LIMIT语句限制查询数量
LIMIT:限制查询结果返回的数量
[LIMIT {[offset,] row_count|row_count OFFSET offset}]
SELECT语句从0开始编号
offset:偏移量
row_count:返回结果的数目
eg. SELECT * FROM users LIMIT 2; // 从第一条开始(第一个为0),返回两条
SELECT * FROM users LIMIT 2,3 ;//从第三条开始(第一个为0),返回三条
第三种insert,数据从一个表插入到另一个表 将查询结果写入到另一个数据表中:
INSERT table_name(column_name) SELECT ...
eg: INSERT test SELECT username FROM users WHERE age >=30; // 字段不匹配提示
INSERT test(username) SELECT username FROM users WHERE age >=30;
{
对比分组: SELECT sex, age FROM users GROUP BY 1 HAVING age > 35;
分组用的是HAVING要求HAVING后的条件要么是聚合函数,要么字段在前面出现;
而插入用的是WHERE 没有以上提到的两个限制
}
- limit分页查询 limit (pageNo-1)*pageSize , pageSize