多表查询——where中一张字段不为null,并且不在另外一张表中被指向(不被外键指了)

9 篇文章 0 订阅
3 篇文章 0 订阅

我想要知道父表中的记录,有没有被子表中的外键指向。

父表建表语句:

CREATE TABLE tb_super_specialist(super_id integer primary key, super_name varchar(10), super_hospital integer, super_infor TEXT,  foreign key(super_hospital) references tb_hospital(hospital_id) on delete cascade )

子表建表语句:

CREATE TABLE tb_specialist(specialist_id integer primary key, specialist_name varchar(10), specialist_super integer, specialist_infor TEXT)


初始化父表:

insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(1,"内科",1,"我是内科的infor");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(2,"内科",1,"null");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(3,"外科",1,"我是外科");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(4,"外科",1,"我是外科");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(5,"内科",1,"我是内科的infor");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(6,"外科",1,"null");

初始化子表:

insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(1,"神经内科",3,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(2,"神经内科",5,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(3,"神经内科",2,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(4,"神经内科",6,"神经内科的infor");

 


接下来,我想要知道,在父表中没有被子表外键关系的,且super_infor字段不为null的记录,查询语句:

select super_id,super_hospital,super_infor,super_name from tb_super_specialist 
where super_infor != "null"  and super_id not in  (select distinct specialist_super from tb_specialist);!这才是重点

主要是not in关键字的使用



参考:http://www.w3school.com.cn/sql/sql_distinct.asp

参考:http://www.w3school.com.cn/sql/sql_in.asp

参考:http://www.iteao.com/html/webkaifa/Sql/1178819.html


In:等值连接,用来查找多表相同字段的记录

Not In:非等值连接,用来查找不存在的记录

Inner join:内连接,主要用来查找都符合条件的记录

Left join:左连接,主要用来查找左边有,右边没有的用空值表达

Right join:右连接,主要用来查找右边有,左边没有的用空值表达

Order By:升序 Asc 降序 Desc

Group By:分组排序 按字段分组(如按班级分),使用的都要有集合函数存在

Having:对分组条件进行判断,使用都要确保每个字段都要用集合函数

COMPUTE BY:子句使您得以用同一 SELECT 语句既查看明细行,又查看汇总行,可以计算子组的汇总值,也可以计算整个结果集的汇总值,行聚合函数名称;例如,SUM、AVG、MIN、MAX 或 COUNT


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现表之间关联的方式有很多种,其一种方式是通过建立间关联表实现。下面我以一个具体的例子来说明。 假设我们有两个表:用户表(User)和角色表(Role),一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。我们可以通过建立间关联表(User_Role)来实现表之间的关联。 间关联表(User_Role)通常包含两个字段:用户ID(user_id)和角色ID(role_id),并且将这两个字段作为联合主键。这样,当一个用户拥有多个角色时,就可以在间关联表中添加多条记录,每条记录对应一个用户和一个角色的关系。 具体的实现步骤如下: 1. 创建用户表(User)和角色表(Role): ``` CREATE TABLE User ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); CREATE TABLE Role ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); ``` 2. 创建间关联表(User_Role): ``` CREATE TABLE User_Role ( user_id INT NOT NULL, role_id INT NOT NULL, PRIMARY KEY (user_id, role_id) ); ``` 3. 将间关联表(User_Role)与用户表(User)和角色表(Role)建立关联: ``` ALTER TABLE User_Role ADD CONSTRAINT fk_user_role_user FOREIGN KEY (user_id) REFERENCES User(id); ALTER TABLE User_Role ADD CONSTRAINT fk_user_role_role FOREIGN KEY (role_id) REFERENCES Role(id); ``` 这样,当我们需要查询一个用户的所有角色时,可以通过以下 SQL 语句实现: ``` SELECT Role.* FROM Role JOIN User_Role ON Role.id = User_Role.role_id WHERE User_Role.user_id = <user_id>; ``` 以上就是通过建立间关联表实现表之间关联的具体步骤。需要注意的是,如果不添加外键,可能会存在数据不一致的风险,因此建议在建立间关联表时添加外键
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值