sql中表和表之间基础的关系以及,多种连接查询和select的字句

1,表与表之间的关系

  一对一   网上购买商品 一个订单是不是只能有一个地址
  一对多   一个老师 可以教多个学生 但是 一个学生一个科目只能对应一个老师
  多对多   一个学生在学校可以选修多门课程  一门课程可以被多个学生选择

数据准备

CREATE table h_employee(
`eid` int PRIMARY KEY auto_increment,
`name` VARCHAR(50) not null,
`sex` enum('男','女','保密'),
`dep_id` int
);

INSERT INTO h_employee VALUES (null,'张三1','男',1);
INSERT INTO h_employee VALUES (null,'张三2','男',1);
INSERT INTO h_employee VALUES (null,'张三3','女',5);
INSERT INTO h_employee VALUES (null,'张三4','男',3);
INSERT INTO h_employee VALUES (null,'张三5','男',3);
INSERT INTO h_employee VALUES (null,'张三6','男',4);
INSERT INTO h_employee VALUES (null,'张三7','男',2);
INSERT INTO h_employee VALUES (null,'张三8','男',2);
INSERT INTO h_employee VALUES (null,'张三9','男',3);
INSERT INTO h_employee VALUES (null,'张三10','男',1);
INSERT INTO h_employee VALUES (null,'张三11','女',5);
INSERT INTO h_employee VALUES (null,'张三12','男',null);

CREATE table h_department(
`did` int PRIMARY KEY auto_increment,
`dname` VARCHAR(50) not null
);

INSERT into h_department VALUES (null,'前端');
INSERT into h_department VALUES (null,'后台');
INSERT into h_department VALUES (null,'测试');
INSERT into h_department VALUES (null,'运维');
INSERT into h_department VALUES (null,'项目经理');
INSERT into h_department VALUES (null,'CEO');

2,连接查询

全连接(效率最低 最好不要用)

可以适当限制条件来减少查询重复的值,这里不做演示(因为查询效率最低工作基本不用)

-- SELECT 列名 from 左表 [连接方式] JOIN 右表 [on 连接条件]
-- 12 * 6 = 72
-- 全连接 笛卡尔乘积 (没有连接条件 开发不能用)
SELECT * from h_employee CROSS JOIN h_department;

左外连接(查询效率最高)

特点保留左表的全部数据,右表选出符合条件的值,如果值为空用null来填充

-- 左外连接
SELECT * from h_employee LEFT JOIN h_department on dep_id = did 

SELECT * from h_employee LEFT JOIN h_department on dep_id = did 
WHERE dep_id is null

 

右外连接

特点保留右表的全部数据,左表选出符合条件的值,如果值为空用null来填充

-- 右外连接

SELECT * from h_employee RIGHT JOIN h_department on dep_id = did;


SELECT * from h_employee RIGHT JOIN h_department on dep_id = did
WHERE dep_id is null


全连接(注意mysql数据库中不支持但是可以依靠union来达到实现全连接的效果)

-- mysql 不支持  其他的数据库语言支持

-- 数据合并 union

SELECT * from h_employee LEFT JOIN h_department on dep_id = did 
union
SELECT * from h_employee RIGHT JOIN h_department on dep_id = did;



SELECT * from h_employee LEFT JOIN h_department on dep_id = did 
WHERE dep_id is null
union  -- and
SELECT * from h_employee RIGHT JOIN h_department on dep_id = did
WHERE dep_id is null;

3,select的七大字句

1,from:从什么表中筛选

2,,on:多表联查条件限制

3,where:从表中筛选条件

4,group by:通常用与聚合函数的分组查询,作用是根据什么来分组

5,having:在统计结果上再次筛选

6,order by:排序

7,limit:分页

1-3太常用了不做演示

根据年龄分组

SELECT sex,COUNT(eid) from h_employee GROUP BY sex;
SELECT sex '性别',CONCAT(COUNT(eid),'个') as '个数'
FROM h_employee 
GROUP BY sex;

having 过滤后

SELECT  sex '性别',COUNT(eid)as '个数'
FROM h_employee 
-- where eid is not null
GROUP BY sex
HAVING sex='男'

order by排序根据部门id排序
 

-- ORDER by 排序
-- desc 倒序   asc 正序
SELECT *
FROM h_employee ORDER BY dep_id asc

limit分页

注意一点分页后面的二个参数,第一个是起始位置,第二个查几个

SELECT * from h_employee LIMIT 0,4;
SELECT * from h_employee LIMIT 4,4;
SELECT * from h_employee LIMIT 8,4;
SELECT * from h_employee LIMIT 12,4;

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值