数据库(多表查询,子查询)

1、笛卡尔集

1、什么是笛卡尔集

假设集合A={a,b},集合B={0,1,2},
则两个集合的笛卡尔集为 {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
可以拓展到多个集合的情况

  • 2、同时查询两个表(使用一个SQL语句),出现的就是笛卡尔集结果

SELECT *
FROM students,score;

  • 3、查询时给表起别名

SELECT * FROM stu st,score sc;

  • 4、(去除笛卡尔集)在查询时要把主键和外键保持一致

SELECT *
FROM students,score
WHERE students.id = score.sid;

  • 5、连接方式分类


    image.png

2、内连接划分

  • 1、99写法

SELECT * FROM
students st,score sc
WHERE st.id = sc.sid;

  • 2、内连接写法

SELECT * FROM students st INNER JOIN score sc ON st.id = sc.sid

  • 3、方法:
2.多表联查约束主外键一样,只是写法改变了
3. ON后面只写主外键
4. (对于结果)如果还有条件直接在后面写WHERE5. 多表联查后还有条件就直接写AND
image.png

3、左外连

  • 1、定义

就是左边表数据全部查询出来,右边表只查询满足条件的

  • 2、例子

SELECT *
FROM students st
LEFT OUTER JOIN score sc
ON st.id = sc.sid;


you

4、右外联

  • 定义

就是右边表数据全部查询出来,左边表只查询满足条件的

  • 例子

SELECT * FROM students st RIGHT OUTER JOIN score sc ON st.id = sc.sid;


image.png

5、多表连接

  • 1、建立学生,分数,科目表(多对多)
  • 多个学生可以去考同一个学科,同一个学生可以考多个科目
  • 2、使用99连接法

SELECT st.name,sc.score,co.name
FROM students st,score sc,course co
WHERE st.id = sc.sid AND sc.cid = co.id

  • 3、使用内联查询

SELECT *
FROM students st
JOIN score sc
ON st.id = sc.sid
JOIN course co
ON sc.cid = co.id;

6、非等值连接

1、非等值查询实现

  • 查询所有员工的姓名,工资,所在部门的名称以及工资的等级.

SELECT e.ename,e.salary,d.dname
FROM emp e,dept d,salgrade g
WHERE e.deptno = d.deptno
AND e.salary >= g.lowSalary
AND e.salary <= g.highSalary;

SELECT e.ename,e.salary,d.dname
FROM emp e,dept d,salgrade g
WHERE e.deptno = d.deptno
BETWEEN g.lowSalary AND g.highSalary;

SELECT * FROM emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade g ON e.salary BETWEEN g.lowSalary AND g.highSalary;

7、自连接

  • 注意

自然连接 还是笛卡尔集现象:两张连接的表中列名称和类型完全一致的列作为条件

  • 1、两张连接的表中列名称和类型完全一致的列作为条件
  • 2、 会去除相同的列

CREATE TABLE students( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20)
);CREATE TABLE score( sid INT PRIMARY KEY AUTO_INCREMENT,
score INT
);

  • 随意添加数据后
  • 99查询(隐式内连接)

SELECT * FROM students,score;

SELECT * FROM students,score WHERE students.id = score.sid;

  • 内连接(显示内连接)

SELECT * FROM students JOIN score ON students.id = score.sid;

  • 自然连接 还是笛卡尔集现象:两张连接的表中列名称和类型完全一致的列作为条件

SELECT * FROM students NATURAL JOIN score;

8、子查询

1、什么是子查询

    1. 一个select语句中包含另外一个完整的select语句
    1. 或者说两个以上select,那么就是子查询语句了

2、子查询出现的位置

    1. where后,把select查询出的结果当做另外一个select的条件值
    1. from后,把查询出的结果当作一个新表

3、例子:

  • 1、查询与项羽同一个部门人员工

(1)先查出项羽所在的部门编号

SELECT deptno FROM emp WHERE ename = '项羽';

(2)再根据编号查询同一部门的员工

SELECT ename FROM emp WHERE deptno = 20;

(3)把第1条查出来的结果当第2条语句的条件

SELECT ename,deptno FROM empWHERE deptno = (SELECT deptno FROM emp WHERE ename = '项羽')

  • 2、查询30号以内大于2000的薪水的人(放在from,是把这个语句当成一个表)

SELECT ename,salary,deptno FROM empWHERE deptno = 30;

SELECT ename FROM (SELECT ename,salary,deptno FROM emp WHERE deptno=30) AS s WHERE s.salary > 2000;
;

  • 3、查询工资高于程咬金的员工

SELECT salary FROM emp WHERE ename = '程咬金';

SELECT ename,salary FROM emp WHERE salary > (SELECT salary FROM emp WHERE ename = '程咬金')

  • 4、工资高于30号部门所有人的员工信息

(1)先查出30号部门工资最高的那个人

SELECT MAX(salary) FROM emp WHERE deptno=30;

(2)再到整个表中查询大于30号部门工资最高的那个人

SELECT ename,salary FROM emp WHERE salary > (SELECT MAX(salary) FROM emp WHERE deptno=30);

  • 5、查询工作和工资与妲己已完全相同的员工信息

SELECT job,salary FROM emp WHERE ename='妲己';

SELECT * FROM emp WHERE (job,salary) in (SELECT job,salary FROM emp WHERE ename='妲己');

SELECT * FROM emp e,(SELECT job,salary FROM emp WHERE ename='妲己') AS rWHERE e.job = r.job AND e.salary = r.salary;

  • 6、有2个以上直接下属的员工信息

SELECT mgr,GROUP_CONCAT(mgr),COUNT(mgr) FROM empGROUP BY mgr HAVING COUNT(mgr) >= 2;

SELECT * FROM emp WHERE
empno in (SELECT mgr,GROUP_CONCAT(mgr),COUNT(mgr) FROM empGROUP BY mgr HAVING COUNT(mgr) >= 2);

  • 7、查询员工编号为7788的员工名称、员工工资、部门名称、部门地址

SELECT e.ename,e.salary,d.dname,d.local FROM emp e,dept dWHERE e.deptno = d.deptno AND e.empno = 7788;

自连接
例: 求7369员工编号、姓名、经理编号和经理姓名

SELECT mgr FROM emp WHERE empno = 7369;

SELECT * FROM emp WHERE empno = (SELECT mgr FROM emp WHERE empno = 7369)

  • 所以要用到自连接

SELECT * FROM emp e1,emp e2WHERE e1.empno = e2.empno;

SELECT e1.empno,e1.ename,e2.ename FROM emp e1, emp e2WHERE e1.mgr = e2.empno;
AND e1.empno = 7369;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容