SQL语言基础(4)

连接查询

内连接

把两张表相同的地方查询出来

左连接

包括了内连接,同时还查询左表特有的内容

右连接

包括了内连接,同时还查询了右表独有的内容

内连接

语法:select * from 表1 inner join 表2 on 表1.字段 = 表2.字段

内连接最重要的是,找出两张表要关联的字段

显式内连接

查询a表和b表共有的数据

select * from a inner jion b on a.id = b.id;


通过内连接会把两张表共有的部分展示出来,而不同的部分不会不展示

查询students和scores共有的数据

select * from stundets inner join scores on students.studnetNo = scores.studentNo;

隐式内连接

语法:select * from 表1,表2 where 两个表的连接条件

select * from students,scores where students.studentNo = scores.studnetNo;


内连接查询显示指定的字段

students表与scores内连接,只显示姓名,课程号,成绩

select name,courseNo,score from studnets inner join scores students.studentNo = scores.studentNo;

表的别名在查询中的使用(当使用表别名可以缩短SQL语句)

select name,coursenNo,score from students st inner join scores cson st.studentsNo = sc.studnetNo;

查询成绩表信息,同时显示成绩对应的课程名称

select * from scores sc inner join course co on sc.courseNo = co.courseNo;

带有where条件的内连接

    语法select * from 表1 inner join 表2 on 表1.字段 = 表2.字段 where条件

查询王昭君的信息,要求只显示姓名、课程号、成绩

select name,coursenNo,score from students st inner join scores sc on st.studentNo = sc.studentNo where name = '王昭君'

带有and逻辑运算符的内连接查询

查询姓名为王昭君,并且成绩小于90的信息,要求只显示姓名、成绩

select name,score from students st inner join scores sc on st.studentNo = sc.studentNo where st.name = '王昭君' and sc.score < 90;

多表内连接

查询学生信息和成绩以及成绩对应的课程名称(三张表关联)

select * from students inner join scores on students.studnetNo = scores.studentNo 

inner join courses on scores.courseNo = courses.courseNo;


三张表内连接

写SQL三步法

搭框架

    基本的select语句框架搭建起来,如果有多表,把相应的多表也联合进来

看条件

    决定where后面具体的条件

显示的字段

    select后面到底要显示什么字段

查询所有学生的linux的课程成绩,要求只显示姓名、成绩、课程名

第一步:搭框架

select * from students inner join scores on students.studentNo = scores.studentNo inner join courses on scores.courseNo = courses.courseNo;

第二步:看条件

select * from students inner join scores on students.studentNo = scores.studentNo inner join courses on scores.courseNo = courses.courseNo where coursename = 'linux';

第三步:返回字段名

select name,score,coursename from students inner join scores on students.studentNo = scores.studentNo inner join courses on scores.courseNo = courses.courseNo where coursename = 'linux';

带有order by 排序的内连接查询

查询成绩最高的男生信息,要求显示姓名、课程名、成绩

select name,score,coursename from 

students inner join scores on students.studentNo = scores.studentNo 

inner join courses on scores.courseNo = courses.courseNo 

order by score desc limit 0,1;

左连接

语法:select * from 表1 left join 表2 表1.字段=表2.字段

查询所有学生的信息以及成绩,包括没有成绩的学生

select * from students inner left join scores on studnets,studentNo = scores.studentNo;


两张表左连接

右连接

语法:select * from 表1 right join 表2 表1.字段=表2.字段

查询所有的课程信息,包括没有成绩的课程

select * from student right join courses on scores.courseNo = courses.courseNo;

多表联合查询,同名字段的处理方式(如果多表查询出现重名字段时,一定要在所查字段前加上指定的表名)

如果一条select要用到多个表,表中有同名字段,就需要 表名.字段名 加以区分

select students.studentNo form students inner join scores on students.studentNo = scores.studentNo;

自关联


自关联表

查询一共有多少省(因为省的没有上级,我们用NULL数据填充)

select count(*) from areas where is null;

查询一共有多少市

select count(*) from areas where is not null;

自关联是同一张表做连接查询

自关联下,一定找到同一张表可关联的不同字段

查询广东省所有城市 (当要用到自关联的时候,需要给表起别名)

select count(*) from areas a1 inner join  areas a2 on a1.id = a2.pid where a1.name = '广东';

子查询

子查询是嵌套到主查询里面的

子查询作为主查询的数据源或者条件

子查询是独立可以单独运行的查询语句

主查询不能独立运行,依赖子查询的结果

查询大于平均年龄的学生记录

    用子查询实现(子查询就是把一张表的结果作为另外一张表的条件)

select * from studnets where age > (select avg(age) from students); 

标量子查询: 子查询返回结果只有一行,一列

查询30岁的学生的成绩

1.查询30岁学生的studentNo

select studentNo from students where age = 30;

select * from scores where studentNo in ('001','003','011');

用子查询实现

select * from scores where studentNo in (select * from scores where age = 30);

列子查询:子查询返回一列多行

用内连接实现

select * from student st inner join scores sc on st.studentNo = sc.studentNo where sex = '女';

用子查询实现

用子查询,查询所有女生的信息和成绩 (把表的查询结果作为另外一个表然后在做内连接)

select * from (select * from students where sex ='女') stu inner join scores sc on stu.studentsNo = sc.studentsNo;

表级子查询--子查询返回结果为多行,多列

练习


多表关系

1.列出男职工的总数和女职工的总数

select sex,count(*) from employess group by sex;

2.列出非党员职工的总数

select count(*) from employess where politicalstatus ! = '党员';

3.列出所有职工工号,姓名以及所在部门的名称

select empid,empname,deptname from departments d inner join employees e on d.deptid = e.deptid;

4.列出所有职工工号,姓名和对应工资

select e.empid,empname,salary from employees e inner join salary on e.empid = s.empid;

5.列出领导岗的姓名以及所在部门名称

select empname,deptname from departments d inner join employees e on d.deptid = e.deptid where leader is null;

6.列出职工人数大于4的部门号和总人数

select deptid,count(*) from employees group by deptid having count(*) > 4;

7.列出职工总人数大于4的部门号和部门名称

select e.deptid,deptname count(*) from departments d inner join employees e on d.deptid = e.deptid group by e.deptid having count(*) > 4;

8.列出开发部和测试部的职工号,姓名

select empid,empname from departments d inner join employees e on d.deptid = e.deptid where deptname in ('测试部','开发部');

select e.empid,e.empname from (select * from departments where deptname in ('测试部','开发部')) d inner join employees e on d.depid = e.depid;

9.列出市场部所有女职工的姓名和政治面貌

select empname,politicalsta from departments d inner join employees e on d.deptid = e.deptid where deptname ='市场部' and sex ='女';

10.显示所有职工姓名和工资,包括没有工资的职工姓名

select empname,salary from employess e left join salary s on e.empid = s.empid;

11.求不姓孙的所有职工工资

select empname,sum(salary) from employees e left join salary s on e.empid = s.empid where empname not like '孙%';

select empname,salary from (select * from employess where not like '孙%') e inner join salary s on e.empid = s.empid;

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

推荐阅读更多精彩内容