SQL语言之查询

SQL语言之查询(二)

前言

本章我们将学习SQL查询中的高级部分,如内连接、外连接和子查询,通过这些查询技术我们将能够解决项目中复杂的查询问题。

外键约束

MySQL属于关系型的数据库,表之间可以建立关系,如:学生表和成绩表,在成绩表中添加学生编号引用学生表中的学生编号,这样在成绩表中就不用添加重复的学生信息了,这种关系也叫主外键关系,可以通过设置外键约束实现。

可以在创建表时,添加外键约束来保证表和表之间引用完整性,添加外键后:

在插入外键表数据前,必须先插入主表数据

在删除主表数据前,必须先删除外键表数据

语法:

create table 表名

(

字段名 类型 约束,

... ,

constraint 外键名称 foreign key (外键列) references 主表(主键)

);

代码示例:

use mysql_db;

-- 创建成绩表

drop table if exists tb_score;

create table tb_score

(

score_id int primary key auto_increment,

score_stu_id int,

score int,

score_course varchar(20),

constraint fk_score_stu_id foreign key(score_stu_id) references tb_student(stu_id)

);

内连接查询

在查询时我们经常要把相关的多张表的字段,一起查询出来,如查询学生成绩时,要显示分数和学生姓名。这个时候我们就需要连接查询了,连接查询分为内连接和外连接,我们先学习内连接查询。

内连接查询的特点是:会查询出相关表中都存在的数据。

语法有两种实现方法:

1)select 字段..... from 表1 inner join 表2

on 表1.主键 = 表2.外键;

注意:这里假设表1是主表,内连接表的前后顺序无关

2)select 字段..... from 表1 , 表2

where 表1.主键 = 表2.外键;

代码示例:

-- 查询学生姓名和成绩 方式1

select s.stu_id ,s.stu_name,c.score_course,c.score from tb_score c inner join tb_student s on s.stu_id = c.score_stu_id;

-- 方式2

select s.stu_id ,s.stu_name,c.score_course,c.score from tb_score c , tb_student s where s.stu_id = c.score_stu_id;

效果相同:

外连接查询

外连接分为左外连接和右外连接:

1) 左外连接

连接查询多张表的数据,显示所有左表的数据,右表存在不相符的数据补null。

语法:

select 字段... from 左表 left join 右表

on 主表.主键 = 子表.外键;

代码示例:

-- 左外连接,查询学生姓名和成绩

select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id;

-- 查询所有参加过考试的同学

select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id where c.score is not null;

-- 查询所有没参加过考试的同学

select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id where c.score is null;

2)右外连接

与左连接相反,显示所有右表数据,左表中不相符的数据补null。

语法:

select 字段... from 左表 right join 右表

on 主表.主键 = 子表.外键;

代码示例:

select s.stu_id,s.stu_name,c.score_course,c.score from tb_score c right join tb_student s on s.stu_id = c.score_stu_id;

子查询

在查询语句中还可以嵌入查询语句,嵌入的查询也叫子查询,子查询将先执行,查询到结果后,父查询可以将此结果作为查询条件再进行一次查询,这样可以解决比较复杂的查询问题。

语法:

select ... from 表 where 字段 比较运算符 (select ... from 表 where 条件);

代码示例:

-- 查询年龄比李四大的学生

select * from tb_student where stu_age > (select stu_age from tb_student where stu_name = '李四');

-- 查询李四的老乡

select * from tb_student where stu_address = (select stu_address from tb_student where stu_name = '李四');

子查询之IN

有时候当子查询中查询结果不止一个的情况下,使用比较运算符会出现错误,这时候我们就需要使用一些关键字来帮助筛选结果。

in关键字的作用是在字段和数据列表中任意一个相等,条件就成立。

代码示例:

-- 查询语文分数考相同的学生,先用子查询查语文的成绩,在用内连接查考过语文的学生姓名和成绩,把成绩进行比较

select stu_name,score_course,score from tb_student inner join tb_score on tb_student.stu_id = tb_score.score_stu_id where score_course='语文' and score in(select score from tb_score where score_course = '语文');

子查询之ALL

all和比较运算符配合使用,如果字段和所有的查询结果都比较成立,结果才成立。

语法:

字段 比较运算 all(查询结果)

代码示例:

-- 查询比所有男学生小的女学生,先查所有男学生的年龄,如果女学生年龄比所有这些年龄大,就查出来

select stu_name,stu_age,stu_gender from tb_student where stu_gender = '女' and stu_age < all(select stu_age from tb_student where stu_gender = '男');

子查询之ANY

any和比较运算符配合使用,如果字段和任意一个查询结果比较成立,则结果成立。

语法:

字段 比较运算 any(查询结果)

代码示例:

-- 查询只要比一个南京学生大的武汉学生

select stu_name,stu_address from tb_student where stu_address = '武汉'

and stu_age > any(select stu_age from tb_student where stu_address='南京');

子查询之Exists

exists表示是否有查询结果,如果没有结果,返回false,有结果则返回true

语法:

exists(查询结果)

-- 查询考过英语的同学,在子查询中需要判断父查询中的学生id是否在子查询中存在

select * from tb_student where

exists(select score_stu_id from tb_score where tb_student.stu_id = tb_score.score_stu_id and score_course = '英语');

总结

本章我们学习了内连接、外连接、子查询等高级查询方法,有时候这些查询方法需要综合运用起来,当我们熟悉了它们后,查询数据就不是难事了。

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

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,231评论 0 7
  • Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 S...
    忘了呼吸的那只猫阅读 2,864评论 0 8
  • 花了3天时间学习MySql,考了个二级MySql 书籍参考:高等教育出版社《全国计算机等级考试二级教程-MySQL...
    如果仲有听日阅读 1,276评论 4 4
  • Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 S...
    望l阅读 315评论 0 0
  • 最后一个人独自坐在飞船的房间里,突然,响起了敲门声,他打开飞船门,一个机器人走了进来, “长官,您可以回地球...
    兰海粟阅读 482评论 0 1