zoukankan      html  css  js  c++  java
  • mysql记录的增删改和单表查询

    1.记录的详细增加方式

    insert into 表名[(字段1,字段2,~)] values (值1,值2,~), (值1,值2,~)

      into可以省略。表名后的字段可选

      如果写了表名后的字段名,后面values 中必须与表名的字段一一对应。

      如果没有写,后面的values中的值必须与表的所有字段一一对应。

      values后面可以给多组值,用逗号隔开。

    2.记录的详细删除方式

    delete from 表名 [where 条件]

    条件不写,是删除所有记录这种删除是一行一行的删除,注意自增id不会归零

    truncate 重建 先记录表结构,删除整个表再新建出表自增id会归零。

    3.更新数据的详细方式

    update 表名 set 字段名 = 值[,字段2 = 值2],[where 条件]

    可以一次性修改多个字段的值逗号隔开

    条件如果不写,修改所有记录。

    4.单表查询

     不带关键字的查询

      select  {1.*|2.字段名|3.四则运行|4.聚合函数} from 表名 [where 条件]

    1.*表示查询所有字段

    2.可以手动要查字段

    3.字段的值可以进行加减乘除

    4.聚合函数,用于统计

    where 是可选的

    concat() 是字符串拼接函数。

    as 起别名

    完整的查询语句语法。

    select [distinct] * from 表名
    [where
    group by
    having
    order by
    limit
    ]

    关键字的执行顺序

    from 打开文件

    where 读取文件并过滤

    group by 对已读取的数据进行分组 

    having 对分组的数据进行过滤

    distinct 去重数据

    order by 排序

    limit  获取指定条数

    where 关键字的用法

    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 * from stu

    查看 英语成绩

     select english from stu;

    查看所有⼈人的数学成绩 并去除项姓名相同的数据

    select distinct name,math from stu;

    统计每个人的总分

    select name,math+english as 总分 from stu;

    为每个为的英语加10分显示

    select name,english+10 from stu;

    需要 在字段的数据前加上字段名:

    name:赵云 english:90 math:30

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

    需求 如果 总分⼩小于150 在名字后⾯面加上shit ⼤大于等于 加上nice

    mysql> select(
        -> case
        -> when english+math>120 then
        -> concat(name,"nice")
        -> when english+math<120 then
        -> concat(name,"shit")
        -> end),
        -> english,math from stu;

    where关键字支持的表达式

    1.查询英语分数在 80-100之间的同学。

    select * from stu where english between 80 and 100;

    2.查询数学分数为89,90,91的同学

    select * from stu where english in (80,90,91);

    3.查询所有姓李的学⽣生成绩。

     select * from stu where name like "李%";

    4.查询所有姓名带有李的学⽣生成绩

    select * from stu where name like "%%";

    5.查询数学分>80并且英语分>80的同学

    select * from stu where math>80 and english >80;

    查询数学分<60并且英语分<60的同学。

    select * from stu where math<60 and english <60;

    where 是如何找到你要的数据的?

    where语句句条件在没有索引的情况下 是挨个遍历判断 效率⾮非常低
    如果有索引 则可以忽略略掉⼤大多数⽆无⽤用数据

    关键字 group by

    什么是分组

      把一个整体 分割为多个部分

    为什么分组

      在数据库中分组为了统计

    分组后 组里的详细记录就被隐藏起来了 不能直接查看 dept 一分组 变成三条记录 每个组中却包含多条记录 没办法显示。
    一定要显示的话 可以使用group_concat(字段名) 可以将多个值拼接成一个字符串。

    注意

      1.只有出现在group by 后面的字段 才可以被显示 其他都被影藏了

      2.聚合函数不能写在where的后面 where最先执行 它的作用硬盘读取数据并过滤 以为数据还没有读取完 此时不能进行统计。

    什么样的字段适合用于分组

       重复性高的字段

    了解:

      在mysql 5.6中 分组后会默认显示 每组的第一条记录 这是没有意义的

      5.7不显示 因为5.7中 sql_mode中自带 ONLY_FULL_GROUP_BY
      group by 后面可以有多个分组与依据 会按照顺序执行

    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);

    1.将数据按照部⻔门分组

    select dept from emp group by dept;

    何为聚合函数?
    将多个数据进行计算 并得到⼀一个结果 称为聚合
    有哪些集合函数?
      sum
      count
      avg
      max/min
    简单测试

    2.查询每个部门有几个人

    select dept ,count(*) from emp group by dept;

    3.计算每个部门的平均⼯工资

    select dept,avg(salary) from emp group by dept;

    4.计算每个岗位的平均⼯工资

     select job,avg(salary) from emp group by job;

    5.计算每个部⻔门每个岗位的平均⼯工资

    select dept,job,avg(salary) from emp group by dept,job;

    6.查询平均⼯工资⼤大于5000的部⻔门

    select dept,avg(salary) from emp group by dept having avg(salary)>5000;

    order by 排序用的

      asc 表示升序 是默认的
      desc 表示降序
      by 后面可以有多个排序依据

    limit 限制显示条数

      limit a,b
      limit 1,5
      从1开始 到5结束 错误
      从1开始 不包含1 取5条

      分页查询
    每页显示3条 共有10条数据
      if 10 % 3 == 0:
        10 / 3
      else:
        10/3 +1
    总页数4

    第一页
    select *from emp limit(0,3)
    第二页
    select *from emp limit(3,3)
    第二页
    select *from emp limit(6,3)

    起始位置的算法
    页数 - 1 * 条数
    1 - 1 = 0 * 3 = 0
    2 - 1 = 1 * 3 = 3

    查看前三⼈人

    select * from emp limit 0,3;

    查看工资最高的那个人信息

     select * from emp order by salary desc limit 0,1;

    查看id为3-6的⼈人

    select * from emp limit 3,3;

    三 正则表达式匹配
    正则表达式⽤用于模糊查询,模糊查询已
    经讲过了了
    like 仅⽀支持 % 和 _ 远没有正则表达式灵

    当然绝⼤大多数情况下 like足够使用

    select * from 表名 where 字段名 regexp "正则表达式”;
  • 相关阅读:
    [模板] 主席树
    [模板] 替罪羊树
    [模板] Treap
    [LUOGU] P4342 [IOI1998]Polygon
    [JOYOI] 1051 选课
    poj 1845 数论(唯一分解定理+分治法求等比数列前n项的和mod m的值)
    poj 2418 bst统计字符串
    hdu 3791 二叉排序树
    hdu 3999 二叉排序树
    toj 3711 水题
  • 原文地址:https://www.cnblogs.com/msj513/p/10003106.html
Copyright © 2011-2022 走看看