MySQL学习02

本文深入探讨SQL的基础知识,包括字段类型、表的创建、数据的增删改查,以及复杂的条件查询和数据仓库概念。通过实例讲解如何进行条件筛选、排序、限制结果、聚合操作、联接不同表以及使用union进行数据整合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、复习

        字段类型

        create table 模板

        insert

        update

        delete

        where 

2、条件查询

select * from hbinzdata where XXX;

(1)查询name为HBinz以及id为3的数据:

(2)查询name为HBinz或者id为5的数据:

(3)查询name为HBinz或id为5的数据,再做“且”运算,查询HBinz以及id为3的数据

3、数据仓库 

事实表 :确实存在的表

维表(维度表):决策分析的维度的表

--部门员工表

create table emp (
    empno numeric(4) not null,
    ename varchar(10),
    job varchar(9),
    mgr numeric(4),
    hiredate datetime,
    sal numeric(7, 2),
    comm numeric(7, 2),
    deptno numeric(2)
);
--部门表
create table dept (
    deptno numeric(2),
    dname varchar(14),
    loc varchar(13)
);
--工资等级表
create table salgrade ( grade numeric, losal numeric, hisal numeric );

数据:


insert into dept values (10, 'ACCOUNTING', 'NEW YORK'); insert into dept values (20, 'RESEARCH', 'DALLAS'); insert into dept values (30, 'SALES', 'CHICAGO'); insert into dept values (40, 'OPERATIONS', 'BOSTON'); insert into salgrade values (1, 700, 1200); insert into salgrade values (2, 1201, 1400); insert into salgrade values (3, 1401, 2000); insert into salgrade values (4, 2001, 3000); insert into salgrade values (5, 3001, 9999); insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20); insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30); insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20); insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

(1)查询工资大于3000的数据:

select * from emp where emp.sal > 3000

(2)查询工资不等于3000的数据:

select * from emp where emp.sal <> 3000

(3)模糊查询 like查询名字带s的数据,位置不详:

select * from emp where emp.ename like '%s%'

(4)查询名字首位带s的:

select * from emp where emp.ename like 's%'

(5)查询名字末尾带s的:

select * from emp where emp.ename like '%s'

(6)查询名字第二位带o的,_为占位符:

select * from emp where emp.ename like '_o%' 

(4)排序 order by 默认升序

select * from emp order by sal

=

select * from emp order by sal asc

降序:

select * from emp order by sal desc

(5)限制多少行返回

只看前三行:

select * from emp limit 3

工资前三行:

select * from emp order by sal desc limit 3 

(5)聚合

count():多少行,求数量

sum():数值求和

思路:先拆解问题,再聚合

select ? from tableA

问题1:各个部门的薪酬和

select emp.deptno,sum(emp.sal) from emp group by emp.deptno 

问题2:各个部门的岗位的薪酬和

select emp.deptno,emp.job,sum(emp.sal) from emp group by emp.deptno,emp.job

注意:

group by 后面的字段要出现在select后面

问题3:各个部门的各个岗位薪酬和大于5000的数据

select emp.deptno,emp.job,sum(emp.sal) from emp group by emp.deptno,emp.job having sum(emp.sal) > 5000

(6)常用组合:where  order limit

select emp.deptno,emp.job,sum(emp.sal) from emp 

where emp.job = 'SALESMAN'-------先

group by emp.deptno,emp.job -----其次

having sum(emp.sal) > 5000------接着

order by  sum(emp.sal) desc------再次

limit 1------最后

(7)join (left join ,right join ,inner join, join

重新创建表

create table a (aid int,aname varchar(40))

create table b (bid int,bname varchar(40),age int)

构建数据


insert into a values(1,'xiaoming');

insert into a values(2,'LY');

insert into a values(3,'KUN');

insert into a values(4,'ZIDONG');

insert into a values(5,'HB');


insert into b values(1,'xiaoming',10);

insert into b values(2,'LY',101);

insert into b values(3,'KUN',102);

insert into b values(4,'ZIDONG',105);

insert into b values(6,'niu',106);

insert into b values(7,'meng',343);

insert into b values(8,'cindy',435);


(8)left join:

select 

a.aid,a.aname,b.bid,b.bname,b.age

from a a left join b b

on a.aid = b.bid

左表为主表,左表a有的值,对应右表b有的话会补全,没有就不显示(A全,B匹配A表,匹配不到的为NULL)

注意:

a left join b on a.id = b.id left join c on b.id =c.id

此时仍旧a表是b表的主表,但b表也是c表的主表,即c表匹配b表,b表匹配a表

(9)right join:

select 

a.aid,a.aname,b.bid,b.bname,b.age

from a a right join b b

on a.aid = b.bid

与left join相反

(10)inner join(join):

select 

a.aid,a.aname,b.bid,b.bname,b.age

from a a inner join b b

on a.aid = b.bid

取交集,共同有的数据。

(11)union

业务需求:

将现有的数据膨胀起来构造新表。

将表a7月的数据以及8月的数据都在一个表里出现,构建新表,此处使用union的能力:

select '2018-07-12'date,a.aid,a.aname from a

union 

select '2018-08-13'date,a.aid,a.aname from a

1)union案例

构造一个新表,包含所有人的出勤记录


create table c (cid int,cretime timestamp);

insert into c values(1,'2018-07-12 08:23:11');

insert into c values(1,'2018-07-12 18:23:11');

insert into c values(1,'2018-07-13 08:13:11');

insert into c values(1,'2018-07-13 18:23:11');

 

insert into c values(2,'2018-07-12 02:23:11');

insert into c values(2,'2018-07-12 16:23:11');

insert into c values(2,'2018-07-13 07:13:11');

insert into c values(2,'2018-07-13 08:23:11');

 

insert into c values(3,'2018-07-12 07:13:11');

insert into c values(4,'2018-07-13 08:23:11');


2)查出没用出勤的人的id和名字

这里引申出子表的概念。

(select '2018-07' mouth,a.aid,a.aname from a

union 

select '2018-08' mouth,a.aid,a.aname from a)

3)由于构造的子表数据最全,因此应作为left join的左表

4)补全表的数据

select 

testa.date,testa.aid,testa.aname,c.cid,c.cretime from --------补全考勤的日期、id、名字、出勤id,出勤时间

(select '2018-07-12' date,aid,aname from a

union 

select '2018-07-13' date,aid,aname from a) testa--------------总表

left join c on testa.date = date_format(c.cretime,'%Y-%m-%d') -------由于date是年月日,因此匹配的C表的出勤时间也要是年月日的格式

--  Y:年(4位) m:月 d:日

and testa.aid = c.cid --------id匹配

where c.cid is null  -----没出勤id即为没出勤

9、union 与 union all的区别

union:

select a.aid from a

union 

select b.bid from b

union不补全,取两表id的交集。

union all:

全部补全,不去重。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值