MySQL多表查询与常见函数

文章介绍了SQL在数据库jd_base中的基本操作,包括统计部门数量、员工数量,创建和关联表,使用JOIN和LEFTJOIN,以及处理子查询、外键和订单相关查询。
摘要由CSDN通过智能技术生成
-- 根据导入的jd_base数据库中的表进行作业编写
-- 需求1:统计jd的部门数量
    select count(id)  from tb_dept;
-- 需求2:统计每个部门的员工数量,展示部门ID、员工数量值
    select job, count(*) from tb_emp group by job;
-- 需求3:查询tb_emp表,统计入职距今天5年以上的男性员工,并按照入职时间进行降序排列。
    select  count(*) from  tb_emp where gender=1 and DATEDIFF(NOW(), entrydate) >= 1825 order by entrydate desc ;
-- 需求4:设计表关系:
-- 菜品分类表 tb_category(id,分类名称--不能重复,created_time)
-- 菜品表(id,菜品名称,菜品价格,所属分类,菜品图片路径,菜品上架时间)

create table tb_category(
        id int primary key auto_increment,
        name varchar(20),
        created_time datetime
);
create table tb_menu(
        id int primary key auto_increment,
        name varchar(20),
        price decimal(5,2),
        classify varchar(20),
        img varchar(300),
        create_time datetime
);
-- 创建中间表来创建关联
create table tb_category_menu(
        id int primary key auto_increment,
        category_id int,
        menu_id int
);
-- 建完表后,添加外键。
alter table tb_category_menu add constraint  fk_munu_id foreign key (category_id) references tb_menu(id);
alter table tb_category_menu add constraint  fk_category_id foreign key (category_id) references tb_menu(id);



-- 创建完成对表格,进行删除
DROP TABLE IF EXISTS `tb_category`;
DROP TABLE IF EXISTS `menu`;
DROP TABLE IF EXISTS `tb_category_menu`;




create table tb_user(
                            id int primary key auto_increment,
                            name varchar(20),
                            created_time datetime
);
insert into tb_user values (1,'zs',now()),(2,'lisi',now());


create table tb_order(
                        id int primary key auto_increment,
                        name varchar(20),
                        price decimal(5,2),
                        user_id int
);
select * from
 tb_emp,tb_dept
where tb_emp.id=tb_dept.id;

-- select * from tb_emp inner join tb_dept  on tb_emp.id =tb_dept.id;

select * from jd_orders order by jd_orders.member_id  desc ;
select * from jd_address ;

-- 查询会员的订单数据(),并安装会员的ID降序排序。
-- 1.表是哪几个?  2.如何拼接, 3 .如何查询,  4.如何排序
select * from jd_members m,jd_orders o
        where  m.id=o.member_id
order by m.id desc ;
-- 查询所有会员用户的默认地址
select *
from jd_members m inner  join jd_address a on  a.member_id=m.id
where a.`default`=1;
-- 左外连接:查询左表所有数据与B表中的交集部分数据。
-- 右外连接:查询右表所有数据与A表中交集部分的数据。
-- select  字段列表   from   表1  left  [ outer ]  join 表2  on  连接条件 ... ;

-- 查询所有的用户,并关联他们的订单列表(如果没有订单,则不展示订单数据。)
select *
From jd_members m left join jd_address adr on m.id= adr.member_id;

-- 查询用户所购买的商品,(没有购买就只展示用户)
select  m.id,m.nickname,o.id,o.order_no,od.sku_id,od.sku_name,k.name,k.unit_price
from jd_members m
    left join  jd_orders o on m.id=o.member_id
    left join jd_order_detail od  on o.id=od.order_id
    left join jd_sku k on od.sku_id=k.id;

--  作业:统计用户所购买的每种商品的数量!没购买则显示0即可。 (每个人购买的商品的数量)
select  sum(od.num) ,m.nickname
from jd_members m
         left join  jd_orders o on m.id=o.member_id
         left join jd_order_detail od  on o.id=od.order_id
         left join jd_sku k on od.sku_id=k.id

group by m.id,od.sku_name;

-- 查询订单列表,关联每个订单的商品名称  展示订单号和商品名称。
select  o.order_no,od.sku_name
from jd_members m
         left join  jd_orders o on m.id=o.member_id
         left join jd_order_detail od  on o.id=od.order_id
         left join jd_sku k on od.sku_id=k.id;

-- 左外连接:
-- 查询所有的部门以及每个部门的员工内容:展示 部门名称,员工名。

select de.id,de.name,em.name
from tb_emp em  left join  tb_dept de on de.id=em.dept_id;

-- 统计每个部门的人数,如果没有则填写0  (用分组)
select de.name,count(*)  --
from tb_emp em  left join  tb_dept de on de.id=em.dept_id
group by de.name;
-- ↓ 用下面这个。
select de.name,count(em.id) -- 聚合函数不计算null值。 en.id是null的会是0
from tb_emp em  left join  tb_dept de on de.id=em.dept_id
group by de.name;


-- 子查询
-- from 后的子查询
select * from
(select de.id,de.name
from tb_emp em  left join  tb_dept de on de.id=em.dept_id) tmp;


-- 1)查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息
--   拆解步骤一:统计员工数据
--   拆解步骤二:根据from子查询结果进行多表关联查询(当然只用多表关联或者in等where子查询也能实现--实现方式有很多,掌握思想后灵活运用即可)
select * from
(select *
from tb_emp em where entrydate>'2006-01-01') em left join tb_dept de on de.id=em.dept_id;

-- 2)统计下单日期在2023-01-01之后的订单,并展示其用户信息
select * from
    (select id,order_no,member_id
     from jd_orders where create_time>'2023-01-01') em
  left join jd_members m on em.member_id=m.id;

-- 3)订单派发需要默认地址,所有,现在统计有默认地址的用户的订单数据。
select * from (select * from jd_address ad left join jd_orders o on o.member_id= ad.member_id)  em
    left join jd_order_detail de on em.id=de.order_id;



-- 3.2 where后(常用)

-- 统计在 "方东白" 入职之后的员工信息
select * from tb_emp where entrydate>(select  entrydate from tb_emp where name='方东白');

-- 查询"教研部"的所有员工信息

select * from tb_emp where tb_emp.dept_id=(select id from tb_dept where name='教研部');

-- 查询"教研部"和'学工部'的所有员工信息

select * from tb_emp where tb_emp.dept_id=(select id from tb_dept where name='教研部')
or(tb_emp.dept_id=(select id from tb_dept where name='学工部'));

-- 方法二:
select  id from tb_dept where name in('教研部','学工部');
select * from tb_emp where dept_id in(select  id from tb_dept where name in('教研部','学工部')) order by dept_id;


-- 子查询的结果为一行多列
--

-- 查询与"韦一笑"的入职日期及职位都相同的员工信息
-- select * from tb_emp where tb_emp.entrydate=(select entrydate from tb_emp where name='韦一笑');

select *
from tb_emp
where (entrydate,job) = (select entrydate , job from tb_emp where name = '韦一笑');


select if(job is null ,0,job) from tb_emp;
select ifnull(job,0) from tb_emp;

select name,
       case job
        when 1 then '班主任'
        when 2 then '讲师'
        when 3 then '学工主管'
        when 4 then '教研主任'
        when 5 then '咨询师'
        else 'BOSS'
        end
from tb_emp;

-- 入职时间<2001:"老员工"
-- >=2015  骨干员工
-- 否则新员工。
select  name,
        case
            when entrydate<'2001-01-01' then '老员工'
            when entrydate<'2015-01-01' then '骨干员工'
            else '新员工'
         end
from tb_emp;



SQL语句



use jd_base; -- 使用数据库,可以切换数据库。
show databases ;  --  查询所有数据库
select database(); -- 查询当前数据库
create database if not exists database_name ;  -- 创建名字为database_name数据库
drop database  if exists database_name;   -- 删除数据库

show tables ;   -- 查询当前数据库所有表
desc jd_address;   -- 查询表结构
show create table jd_address;  --  查询建表语句

-- CONCAT(s1,s2...,sn)将s1,s2...,sn连接成字符串
-- CONCAT_WS(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔
select concat_ws(':',username,name)
from tb_emp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值