美文网首页
mysql高级增删改查

mysql高级增删改查

作者: 老衲灬 | 来源:发表于2018-06-25 23:22 被阅读2次

    一、高级查询

    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 多条件分组并排序示例
    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、总体上来说就是:可以来控制按某个顺序来更新多少行数据

    相关文章

      网友评论

          本文标题:mysql高级增删改查

          本文链接:https://www.haomeiwen.com/subject/osysyftx.html