一、高级查询
select 子句 [from 子句] [where 子句] [group by子句] [having子句] [order by子句] [limit 子句];
(各项书写的顺序也按照如上顺序)
1、查询"固定数据"
2、selcet中可以进行计算
3、查询出的字段可以使用别名
4、使用distinct消除查询结果重复行
语法形式:select distinct 字段1, 字段2, ... from 表名;
5、where子句
语法形式:select .... from 表名 where 查询条件;
6、mysql运算符
①算术运算符
+
-
*
/
%
%
:取余,它能够对“小数”取余,跟php不同。
比如: 8.5 % 2.5 >>> 1
, 8.6 % 2.5 >>> 1.1
②比较运算符
相等: =
不相等: <> 或 !=
大于: >
大于等于: >=
小于: <
小于等于: <=
③逻辑运算符
逻辑与: and 或 &&
逻辑或: or 或 ||
逻辑非: not 或 !
④其它运算符
<1>like模糊查找运算符:
用于判断某个字符型字段的值是否包含给定的字符。
语法形式:
xxx字段 like '%关键字%'
其中:%
表示"任意个数的任意字符"。
还可以使用"_"
(下杠),表示"任意一个字符"。
如果%
只在前:"%内容"
,代表以匹配"内容"结尾的数据,只在后则相反
如果不使用"%"
或"_"
,则 like 相当于等于(=)。比如:
xxx字段 like '关键字'
相当于:
xxx字段 = '关键字'
<2>between范围限定运算符:
用于判断某个字段的值是否在给定的两个数据范围之间——通常只适用于数字和时间类的字段。
语法形式:
xxx字段 between 值1 and 值2
其含义相当于: xxx字段 >= 值1 and xxx字段 <= 值2
<3>in运算符:
用于判断某个字段的值是否在给出的若干个"可选值"范围。
语法形式:
xxx字段 in (值1, 值2, ...... )
其含义是:该字段的值等于所列出的任意一个值,就算满足条件,比如:
籍贯 in ('北京','山东','河北', '江西');
//则某人籍贯为上述4个之一就ok。
<4>is运算符:
用于判断一个字段中的是"是否存在"(即有没有),只有两个写法,如下所示:
where content is null;
//不能写成: content = null;
where content is not null;
//不能写成: content != null;
7、group by(分组)子句
语法形式:
group by 字段1 , 字段2, .... ;
含义:
表示对所取得的数据,以所给定的字段来进行分组。
最后的结果就是将数据分成了若干组,每组作为一个"整体"成为一行数据。
特别注意:
分组查询的结果,要理解为,将"若干行原始数据",分成了若干组,结果是每组为一行数据。
即:一行数据就代表"一组"这个集合概念,而不再是原来的单个(行)数据。
因此:一行中出现的信息,应该是"组的信息",而不是"个体信息"。
于是,对于分组查询(group by),select中出现的信息,通常就只有两种情况的信息了:
①分组本身的字段信息;
②一组的综合统计信息,主要包括:
计数值: count(字段)
, 表示求出一组中原始数据的行数;
最值: max(字段)
,表示求出一组中该字段的最大值;
最小值: min(字段)
,表示求出一组中该字段的最小值;
平均值: avg(字段)
,表示求出一组中该字段的平均值;
总和值: sum(字段)
,表示求出一组中该字段的累加和;
以上几个函数,统称为"聚合函数"。
示例:表名product
group by 字段1 [desc|asc], 字段2 [desc|asc], ...
含义:
按给定的字段依次分组,然后再按给定的"排序方式"进行排序后返回结果。
排序方式只有两个:
asc
(正序,默认值), desc
(倒序)查询各个品牌在各个产地的产品总数及平均价格:
8、having句子
语法形式:
having 筛选条件
含义:
having的含义跟where的含义一样,只是having是用于对group by分组的结果进行的条件筛选。
示例:
查询出品牌平均价超过5000的所有品牌的平均价,最高价,以及产品的数量:
9、order by句子
语法形式:
order by 字段1 [asc或desc], 字段2 [asc或desc], ....
含义:
对前面所取得的数据按给定的字段进行排序。
排序方式有: 正序asc
, 倒序desc
,如果省略不写,就是asc
示例:
①对所有的产品按照价格从高到低进行排序:
代码:select * from product order by price desc;
结果如下:
10、limit句子
语法形式:
limit 起始行号,行数
说明:
①limit表示对前面所取得的数据再进行数量上的筛选:取得从某行开始的多少行。
②行号就是前面所取得数据的"自然顺序号",从0开始算起——注意不是id,或任何其他实际数据。
③起始行号可以省略,此时limit后只用一个数字,表示从第0行开始取出多少行。
④limit子句通常用在"翻页"功能上,用于找出"第n页"的数据,其公式为: limit (n - 1) * pageSize, pageSize;
其中pageSize表示每页显示的条数。
示例:
取出商品表中价格最高的3个商品,并按倒序排列出来:
代码:select * from product order by price desc limit 0,3;
结果如下:
则第二页的代码:
select * from product order by price desc limit 3,3;
结果如下:
二、高级插入
1、同时插入多行数据
语句形式:
insert into 表名(字段1,字段2,...) values (值1,值2,... ), (值1, 值2,... ), ......;
相当于set语法插入数据:
set语句形式:
insert into 表名 set 字段1=值1, 字段2=值2,.... ;
2、插入所查询出的结果数据
语句形式:
insert into 表名(字段1,字段2,...) select (xx1, xx2, ... ) ... ;
要求:
<1>插入语句的字段个数,跟select语句的字段个数相等
<2>插入语句的字段类型,跟select语句的字段类型相符
3、蠕虫复制
所谓蠕虫复制,就是针对一个表的数据,进行快速的复制并插入到所需要的表中,以期在短时间内具备"大量数据",以用于测试或其他特殊场合,比如:
<1>将一个表的"大量"数据,复制到另一个表中
<2>将一个表的数据复制到本身表中以产生大量数据
4、插入时主键冲突的解决办法
所谓主键冲突是指,当插入一条记录的时候,如果插入的记录的主键值,在现有的数据中已经存在,则此时,因为主键不能重复,因此就产生了"主键冲突"——报错
办法1:忽略
——终止插入,数据不改变。
其语法为:
insert ignore into 表名 ( 字段.... ) values (值.....);
办法2:替换
——删除原纪录,插入新纪录。
其语法为:
replace into 表名 ( 字段.... ) values (值.....);
说明:此replace的用法跟insert一样,也可以插入新纪录,只是如果新纪录出现主键冲突,就会删除原纪录后,再插入该新纪录。
办法3:更新
——设置为去更新原有数据(而并不插入)。
语法为:
insert into 表名 ( 字段.... ) values (值.....) on duplicate key update XX字段=新的值;
(如发生主键冲突,则未设置更新的字段会保留原数据不变)
三、高级删除
1、按指定顺序删除指定数量的数据
语法形式:
delete from 表名 where ... [order by 字段名, ...] [limit 数量n];
说明:
<1>order by
用于设定删除数据时的删除顺序,跟select语句中的order by子句道理一样。
<2>limit
用于设定删除数据时要删除的行数,即删除的数据可能少于条件筛选出来的数据。
2、truncate清空数据
语法形式:
truncate 表名;
说明:
表示清空指定表中的所有数据并将表恢复到"初始状态"(就类似刚刚创建一样)。
对比:
无条件删除: delete from 表名;
结果:删除了指定表中的所有数据——但表仍然会被纪录为"已使用过"。
差别:主要是对于"auto_increment"
的字段,会保留使用过的最大值,而trancate
后的表,自增长的序号会完全重新开始(就像新表一样)。
四、高级更新
语法形式:
update 表名 set 字段名1=字段值1, ... where ... [order by 字段名, ...] [limit 数量n];
说明:
1、order by
用于设定更新数据时的更新顺序,跟select语句中的order by子句道理一样。
2、limit
用于设定更新数据时要更新的行数,即更新的数据量可能少于条件筛选出来的数据量。
3、总体上来说就是:可以来控制按某个顺序来更新多少行数据
网友评论