MySQL 关于记录详细操作

一、记录详细操作

# [] 表示可选的
# {}表示必选的
#
#     insert [into] 表名[字段名] value|values(字段值....);
#     into 可省略
#     [字段名] 可选
#         如果写了 你后面的值 必须与 写的字段匹配
#         不写  后面的值 必须和表的结构完全匹配
#     value 插入一条记录
#     values 插入多条记录
# 
#
#     update 表名 set 字段名 = 新的值[,字段n = 新值n]  [where 条件]
#     可以同时修改多个字段 用逗号隔开   注意最后一个字段不能加逗号
#     where 可选
#         有就 修改满足条件的记录
#         没有就全部修改
#
#     delete from 表名 [where 条件]
#     where 可选
#         有就 删除满足条件的记录
#         没有就全部删除
#         如果你需要全部删除 请使用truncate table 表名
#         delete 是逐行比对  删除 效率低
#         delete删除的行号会保留
# 
# 查询
#     完整的查询语句
#     select  [distinct] {* | 字段名 | 聚合函数 | 表达式} from 表名
#         [where 条件
#         group by 字段名
#         having 条件
#         order by 字段名
#         limit 显示的条数]
# 
#     注意: 关键字的顺序必须与上述语法一致
# 
# 
#     简单查询 ******
# 
#     1.* 表示所有列 都显示
#     2.也可以手动指定要显示的列  可以是多个
#     3.distinct 用于去除重复的记录
#         只取出完全相同的记录
#         当然 你也可以手动指定要显示的列 从而来去重
#    4.表达式  支持四则运算


    # 执行顺序
     def select()
        from() 打开文件
        # where() 读取每一行并判断是否满足条件
        # group() 对数据进行分组
        # having() 再分组之后进行过滤     having不单独出现 仅用于分组之后进行过滤
        # distinct() 去重
        # order() 用于对筛选后的数据 进行排序
        # limit() 限制显示的条数
        # 最后根据select后制定的字段来显示数据

# 准备数据:
create table stu(id int primary key auto_increment,name char(10),math float,english float); insert into stu values(null,"赵云",90,30); insert into stu values(null,"小乔",90,60); insert into stu values(null,"小乔",90,60); insert into stu values(null,"大乔",10,70); insert into stu values(null,"李清照",100,100); insert into stu values(null,"铁拐李",20,55); insert into stu values(null,"小李子",20,55);
    # 查询所有人的总成绩

select name,english+math 总分 from stu;
select name,english+10 英语 from stu;
# 需要 在字段的数据前加上字段名:
#  name:赵云   english:90  math:30
#  需要使用字符串拼接函数
#  concat(字符串)

 # 案列:
 select
 concat("name:",name),
 concat("english:",english),
  concat("math:",math)
  from stu;


# 观光代码 
select
(case
    when english + math < 150 then
        concat(name," shit")
    when english + math >= 150 then
        concat(name," nice")
end) 评语 from stu;
# 对查询后的条件语句详解
# 一、where
#     从硬盘上读取数据时的一个过滤条件
# 
#     where支持的运算符见图1
# 
#     where 的筛选过程
#     在没有索引的情况下  挨个比较  效率低
#     所以我们应该给表添加索引
# 
# 二、group by
#     作用 用于给数据分组
#     为什么要分组?  思考生活为什么要分组
#     1.在生活中是为了方便管理
#     2.在数据库中是为了 方便统计

    # 准备数据
    create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double);
    insert into emp values (1,"刘备","","市场","总监",5800),
     (2,"张飞","","市场","员工",3000),
      (3,"关羽","","市场","员工",4000),
       (4,"孙权","","行政","总监",6000),
        (5,"周瑜","","行政","员工",5000),
         (6,"小乔","","行政","员工",4000),
          (7,"曹操","","财务","总监",10000),
           (8,"司马懿","","财务","员工",6000);

#      按照部门给数据分组
#      错误;select *from emp group by dept;
#      正确;select dept from emp group by dept;
#      有两种情况
#      1.sql_mode中 没有设置 ONLY_FULL_GROUP_BY 显示每个组的第一条记录 没有意义 所以新版中 自带ONLY_FULL_GROUP_BY
#      2.sql_mode中有设置 ONLY_FULL_GROUP_BY  直接报错
#         原因是:  * 表示所有字段都要显示  但是 分组后 记录的细节被隐藏 只留下了
#         这意味着:只有出现在group by 后面的字段才能被显示
#         分组是为了统计分组数据  如何统计?
#         需要使用到聚合函数
# 
# 
# 聚合函数:
#     将一堆数据经过计算,得到一个数据
#     sum() 求和
#     avg() 求平均数
#     max()/min() 求最大值 / 最小值
#     count() 个数


# 2.查询每个部门有几个人
select dept,count(*) from emp group by dept;

# 3.计算每个部门的平均工资
select avg(salary) from emp  group by dept;

# 总结 什么时候需要使用分组   只要你的需求中 带有 每个这样的字眼 就需要分组
#     每个岗位  每个部门  每个性别

# 5.查询平均工资大于5000的部门
    select avg(salary) from emp where avg(salary) > 5000 group by dept;
    # where 语句后面 不能使用聚合函数
    select avg(salary) from emp;

    # 总结where 条件不能用于筛选分组后的数据


    # group_concat 用于分组后 将组中的某些字段拼接成字符串
    select  dept,group_concat(name) from emp group by dept;

#     其实 没啥意义  为啥?  你为什么要分组?是为了统计数据    如果你不需要统计 就没有必要分组
# 三、having
#     用于对分组后的数据进行过滤
#     having不会单独出现 都是和group by 一起出现
# 
#     与where的区别
#         相同点: 都用于过滤数据
#         不同点:
#                 1.where是最先执行   用于读取硬盘数据
#                   having 要等到数据读取完之后 才能进过滤 比where晚执行
#                 2.where中不能使用聚合函数
#                   having中可以
# 
#         需求:
#       5.查询平均⼯工资⼤大于5000的部⻔
      select dept,avg(salary) from emp group by dept h0aving avg(salary) > 500;

      # 6.查询工资最高的人的姓名和他的工资
      #   需要用到子查询
# 四、order by [desc,asc]
#     用于对记录进行 排序
# 
#     desc为降序
#     asc为升序

    # 按照工资的从低到高顺序 显示所有的员工
    select *from emp order by salary;
    # 默认为升序

    # 修改为降序
    select *from emp order by salary desc;

    # 按照每个部门的平均工资 降序排序
    select dept,avg(salary) from emp group by dept order by avg(salary) desc;


# limit  
#     用于限制显示的条数
#     limit [start,]count

    # 看看表里前三条数据
    select *from emp limit 3;

    # 看看表里的3-5条
    select * from emp limit 2,3;

    # 查看工资最高的那个人的信息
    select *from emp order by salary desc limit 1;

    limit 常用于 数据的分页展示  比如腾讯新闻 的上拉加载新的而一页
    select *from emp limit 0,10; #第一页     页数 减1  乘以条数 得到起始位置
    select *from emp limit 10,10;# 第2页
    select *from emp limit 20,10;# 第3页

# 补充:关于拷贝的详解如下:
# 拷贝表 

create table copy_table select *from customer ;
# 拷贝结构 与数据
create table copy_table select *from customer where 0 > 1;
# 仅拷贝结构
# 
# 共同点: 索引 不能拷贝   描述不能拷贝(自增)

猜你喜欢

转载自www.cnblogs.com/ageliu/p/9651649.html