day46 数据库学习

  今天学习了数据增删改、单标查询、正则表达式查询、多表查询和子查询

  一、数据增删改

    添加数据:

    1.insert [into] 表名[(可选字段名)] values(一堆值1),(一堆值2),......

    into 可以省略

    表名后的字段可以选

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

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

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

    删除

    delete from 表名[where 条件]

    条件不写 是删除所有记录 是一行一行删除 自增id 不会归零

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

    更新数据 update 表名 set 字段名 = 值[,字段2 = 值2],[where 条件]

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

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

  2.单表查询

    不带关键字的查询

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

    1.*表示查询所有字段

    2.可以手动要查询的字段

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

    4.聚合函数,用于统计

    where 是可选的

  关键字的作用

  distinct 去除重复数据 所有数据全都重复才算重复

  where 在逐行读取数据时的一个判断条件

  group by 对数据分组

  having 对分组后的数据进行过滤

  order by 对结果排序

  limit 指定获取数据条数

  完整的select 语句 语法

  select [distinct] * from 表名

  [where group by having order by limit]

  注意 在书写时 必须按照这个顺序来写

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

  dept 一分组 变成三条记录 每个组中却包含多条记录 没办法显示

  一定要显示的话

  可以使用group_concat(字段名)

  可以将多个值拼接成一个字符串

  

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

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

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

    重复性高的字段

  order by 排序用的

  asc 表示升序 是默认的

  desc 表示降序

  by 后面可以有多个排序依据

  limit 限制显示条数

  limit  a,b

  limit 1,5

  从1开始 不包含1 取5条

  

  三、正则表达式匹配

    由于like只能使用 %和_不太灵活

    可以将like换为 regexp 来使用正则表达式

  四、多表查询

    

create table emp (id int,name
char(10),sex char,dept_id int);
insert emp values(1,"大黄","m",1);
insert emp values(2,"老王","m",2);
insert emp values(3,"老李","w",30);

create table dept (id int,name char(10));
insert dept values(1,"市场");
insert dept values(2,"财务");
insert dept values(3,"行政");

  1.笛卡尔积查询

  select *from 表1,表n

  查询结果是 将坐标中的每条记录 与右表中的每条记录都关联一遍

  因为他不知道什么样的对应关系是正确 只能帮你都对一遍

  a表有m条记录 b表有n条记录

  笛卡尔积结果为m * n 记录

  需要自己筛选出正确的关联关系

  select *from emp,dept where emp.dept_id = dept.id;

  2.内连接查询 就是笛卡尔积查询

  select * from emp inner join dept where emp.dept_id = dept.id;

  3.左外连接查询

  select *from emp left join dept on emp.dept_id = dept.id;

  左表数据全部显示 右表只显示匹配上的

  4.右外连接查询

  select *from emp right join dept on emp.dept_id = dept.id;

  右表数据全部显示 左表只显示匹配上的

  内和外的理解 内指的是匹配上的数据 外指的是没匹配上的数据

  5.全外连接

  union 合并查询结果

  select * from emp left join dept on emp.dept_id = dept.id

  union

  select *from emp right join dept on emp.dept_id = dept.id;

  union 去除重复数据 只能合并字段数量相同的表

  union all 不会去除重复数据

  

  on 关键字 where 都是用于条件过滤  没有本质区别
  在单表中where的作用是筛选过滤条件
  在多表中where 连接多表 满足条件就连接 不满足就不连接
  为了区分是单表还是多表 搞个新的名字 就是 on
  只要是连接多表的条件 就使用on

  五、子查询

    条件当一个查询的结果是另一个查询的结果时 这个查询称之为子查询(内层查询)

  

    什么时候使用子查询

    当一次查询无法得到想要结果时 需要多次查询

    解决问题的思路

    是把一个复杂的问题 拆分为多个简单的问题

    是把一个复杂的查询 拆分为多个简单的查询

猜你喜欢

转载自www.cnblogs.com/xiaocaiyang/p/10004184.html