数据库 SQL 外键约束 多表查询

多表设计与多表查询

1.外键约束

       表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,像这种约束就叫做外键约束。  

       定义外键约束  foreign key(本表的列名 ordersid) references orders(id)(引用的表明及列名)

    create table dept(

        id int primary key auto_increment,

        name varchar(20)

    );

    create table emp(

        id int primary key auto_increment,

        name varchar(20),

        dept_id int,

        foreign key(dept_id) references dept(id)

    );

2.多表设计     一对多:在多的一方保存一的一方的主键做为外键     一对一:在任意一方保存另一方的主键作为外键     多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系 3.多表查询     3.1笛卡尔积查询:将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用         select * from dept,emp;     3.2内连接查询:查询的是左边表和右边表都能找到对应记录的记录         select * from dept,emp where dept.id = emp.dept_id;         select * from dept inner join emp on dept.id=emp.dept_id;     3.3外连接查询         a.左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录             select * from dept left join emp on dept.id=emp.dept_id;         b.右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录             select * from dept right join emp on dept.id=emp.dept_id;         c.全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录             select * from dept full join emp on dept.id=emp.dept_id;         d.但是mysql不支持全外连接,不过我们可以使用union关键字模拟全外连接             select * from dept left join emp on dept.id = emp.dept_id             union             select * from dept right join emp on dept.id = emp.dept_id;

多表查询实例

create table a(id int primary key,job varchar(20));
insert into a values(1,‘AA‘), (2,‘BB‘), (3,‘CC‘);

select * from a;

 

create table b(id int ,name varchar(20) ,foreign key(id) references a(id)); 一对多:在多的一方(b)保存一的一方(a)的主键做为外键; 多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系 注意:被参照的a(id)必须定义为unique才可以被参照,否则报错(逻辑错误)。 insert into b values(1,‘bqt‘), (2,‘bqt2‘), (2,‘bqt3‘); 注意:插入数据的id必须在被参照的表中已经存在,否则报错(逻辑错误)。 select * from b;  
select * from a,b;   将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用.
select * from a,b where a.id = b.id; 或 select * from a inner join b on a.id=b.id;   内连接查询:查询的是左边表和右边表都能找到对应记录的记录。
select * from a left join b on a.id=b.id;   左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录
select * from a right join b on a.id=b.id;   右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录 备注:由于右边表参照左边表,所以不存在右边表有而左边表没有的记录。
select * from a left  join b on a.id = b.id union select * from a right join b on a.id = b.id;   全外连接查询:在内连接的基础上增加左边表有而右边表没有,和右边表有而左表表没有的记录 select * from a full join b on a.id=b.id; -- 某些数据库支持,但mysql不支持!

来自为知笔记(Wiz)

时间: 2024-10-22 04:11:45

数据库 SQL 外键约束 多表查询的相关文章

mysql数据库,外键约束和表关系

E-R 图 (实体关系模型) E-R图也称实体-联系图(Entity Relationship Diagram), 提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 它是描述现实世界关系概念模型的有效方法. 是表示概念关系模型的一种方式. 用"矩形框"表示实体型,矩形框内写明实体名称: 用"椭圆图框"表示实体的属性,并用"实心线段"将其与相应关系的"实体型"连接起来: 用"菱形框"表示实体

sql server解决无法删除修改拥有外键约束的表或表的记录字段

sql server解决无法删除修改拥有外键约束的表或表的记录字段 问题如下: or 解决步骤: 1.找出该表的所有外键约束 select * from sys.foreign_keys where referenced_object_id=object_id('订单') order by 1 2.删除所有外键约束(注意外键的名字和表的名字分别是哪个!) alter table 订货项目 drop constraint FK__订货项目__订单编号__412EB0B6; 到这就可以把表删掉了~

吃货眼中的sqlalchemy外键和连表查询

前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就这两个问题简单解释. 建表 俗话说巧妇难为无米之炊,连表查询肯定要有表,有数据库啊.那有没有数据库是你见了垂涎三尺的呢?中国文化博大精深,饮食文化更是璀璨的明珠.我们就以中国菜系为话题,讲一讲好吃的,顺便再说一说外键和连表查询. 鲁菜  山东菜系,而且在明清两代,宫廷御膳是以鲁菜为主,鲁菜味道浓厚,

mysql数据库导入外键约束问题

在网站搬迁过程中,很重要一点是数据的迁移.你的数据库可能已经包含了一个设计良好的数据表集合,并且在网站运营过程中,产生了重要的数据.这时你必须做好包含数据表schema以及数据本身的迁移. 完成上述数据库的迁移,最方便的方法是导出和导入.但是问题是,在导入时,由于数据表本身之间的foreign key外键约束,而导致创建数据无法成功. 临时的解决办法是: mysql> set @@global.foreign_key_checks = 0; 在导入完毕后 mysql> set @@global

MySQL 如何删除有外键约束的表数据

-- 禁用外键约束 SET FOREIGN_KEY_CHECKS=0; -- 删除数据 truncate table stockTBL; -- 启动外键约束 SET FOREIGN_KEY_CHECKS=1; -- 查看当前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;

Oracle 外键约束子表、父表

CREATE TABLE employees( employee_id      NUMBER(6), last_name        VARCHAR2(25) NOT NULL, email            VARCHAR2(25), salary           NUMBER(8,2), commission_pct   NUMBER(2,2), hire_date        DATE NOT NULL, ... department_id    NUMBER(4), CON

删除或清空具有外键约束的表数据报-ERROR 1701 (42000)

OS:  centos 6.3 DB:5.5.14 mysql> select database();+------------+| database() |+------------+| sakila     |+------------+1 row in set (0.00 sec) mysql> delete from actor;ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constra

数据库使用truncate清理非常多表时碰到外键约束时怎么高速解决

问题处理思路: 1. 先将数据库中涉及到外键约束的表置为无效状态 2.待清除全然部表数据后再将外键约束的表置为可用状态 详细实现脚本: declare begin for vv_sql in (SELECT 'ALTER TABLE '|| table_name ||' DISABLE CONSTRAINT ' || CONSTRAINT_NAME alter_sql FROM USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R') loop execute

MySQL数据库 : 查询语句,连接查询及外键约束

查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2... from 表名 比较运算符(< > != = )            select * from 表名 where id>4 逻辑运算符(and or not in)            select * from 表名 where id>4(条件1) and gender=1