首页 > 数据库技术 > 详细

MySQL数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)

时间:2019-03-21 14:25:21      阅读:299      评论:0      收藏:0      [点我收藏+]

一、插入数据(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$;

 

MySQL数据库(四)—— 记录相关操作之插入、更新、删除、查询(单表、多表)

原文:https://www.cnblogs.com/zhangbingsheng/p/10571246.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!