mysql外键关联查询_MySQL外键约束和多表联查

一.创建外键

#测试数据表

# 教师表,主表

CREATE TABLE teacher(

id INT PRIMARY KEY AUTO_INCREMENT,

name varchar(20),

age INT

)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

#测试数据:

INSERT INTO teacher values

(1,'范冰冰',22),

(2,'周杰棍',30),

(3,'双杰伦',35),

(4,'梁朝伟',25);

--------------------------------分割线----------------------------

#学生表,子表

CREATE TABLE student(

id INT PRIMARY KEY AUTO_INCREMENT,

name varchar(20),

age INT,

teacher_id INT, # 外键要和关联的主键的数据类型一致

FOREIGN KEY (teacher_id) REFERENCES teacher(id) # 添加外键

)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

#测试数据:

INSERT INTO student values

(1,'张三',22, 1),

(2,'李四',30,2),

(4,'王五',29,3),

(5,'韩信',61,4),

(6,'刘备',55,4),

(7,'曹操',21,2),

(8,'爱丽丝',32,1),

(9,'赵6',22,2);

--------------------------------分割线----------------------------

SELECT * FROM student INNER JOIN teacher ON student.teacher_id=teacher.id

2dd2ac8506ec09f084cd7341148e17db.png

--------------------------------分割线----------------------------

增加外键和删除外键:

增加:ALTER TABLE student ADD CONSTRAINT key_name(名字) FOREIGN KEY (teacher_id) REFERENCES teacher(id)

删除:ALTER TABLE student DROP FOREIGN KEY key_name

二.InnoDB数据库引擎的ON语句

InnoDB支持的常用方式:

1.cascade方式:在父表上update或delete记录时,同步update/delete掉子表的匹配记录

FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE # 如果父级表中的记录删除了,则子表中相对应的记录也会自动删除

2.set null方式 在父表update或delete记录时,将子表上的相对于的列设为null

FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE SET NULL

#外键约束对子表的作用:在父表中找不到选键,则不允许在子表上进行 insert/update

#外键约束对父表的作用:

在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句

三.多表连接查询

#创建主测试表

CREATE TABLE role(

role_id int,

role_name varchar(100)

)ENGINE=InnoDB DEFAULT CHARSET=utf8

#测试数据:

INSERT INTO role VALUES (301,'战士'),

(302,'法师'),

(303,'刺客'),

(304,'ADC');

(306,'打野')

----------------------------分割线----------------------------------

#创建子测试表

CREATE TABLE hero

( h_id INT auto_increment PRIMARY KEY NOT NULL,

h_name VARCHAR ( 50 ),

age INT,

role_id INT )ENGINE=InnoDB DEFAULT CHARSET=utf8;

#测试数据:

INSERT INTO hero(h_name,age,role_id) VALUES ('盖伦',22,301),

('流浪法师',23,302),

('布隆',22,303),

('熔岩巨兽',25,301),

('伊泽瑞尔',24,304),

('锤石',26,305),

('琴女',28,305),

('狂战士',27,301),

('稻草人',29,302),

('诡术妖姬',22,303);

内连接

SELECT * FROM hero inner JOIN role on hero.role_id=role.role_id;#笛卡尔积中筛选结果

6ea229d66fe8a0babdec3d82d491379f.png

外连接

1.左连接:在内链接的基础上增加左边有但右边没有的结果

SELECT * FROM hero LEFT JOIN role on hero.role_id=role.role_id;

7c5f5c05dc61418f27a629078c155ffa.png

----------------------------分割线----------------------------------

2.右连接:在内连接的基础上增加右边有但左边没有的结果

SELECT * FROM hero RIGHT JOIN role on hero.role_id=role.role_id;

edcad56d16aadb8779b87544f3ae4c11.png

----------------------------分割线----------------------------------

3.全外连接:在内连接的基础上增加  左边有右边没有 和 右边有左边没有 的结果

SELECT * FROM hero RIGHT JOIN role ON hero.role_id=role.role_id

UNION

SELECT * FROM hero LEFT JOIN role ON hero.role_id=role.role_id;

6ef000f35dd8dd5c1decfbc6e7bae2c5.png

##mysql不支持全外连接的,可以用以上的方式间接实现

四:多表复合条件连接查询

SELECT role.role_name FROM hero,role WHERE hero.age >= 29 AND role.role_id=hero.role_id # 笛卡尔积中筛选年龄大于或等于29岁的英雄的分类

SELECT role.role_name FROM hero INNER JOIN role WHERE hero.age >= 29 AND role.role_id=hero.role_id #内连接查询

五:子查询

#子查询是将一条完整的查询语句嵌套在另外一条查询语句里

#内层查询语句的查询结果,可以为外层查询语句提供查询条件

#子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。

#子查询可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中,同 =、、>=、<=、IN、BETWEEN 等运算符一起使用。

子查询必须括在圆括号中。

子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。

子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。

返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。

SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。

子查询不能直接用在集合函数中。

BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。

#SELECT * from hero WHERE hero.role_id in (SELECT role_id FROM role)

36482945619d2db1e0b6e72f618aa19e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql innodb id_MySQL InnoDB row_id边界溢出验证的方法步骤

背景跟同学聊到row_id一个边界问题&#xff0c;这里详细说明下。InnoDB表若没有定义主键&#xff0c;会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1&#xff0c;到达最大值循环复用。需要注意的是&#xff0c;虽然dict_sys->row_id 被定义…

mysql mysqld.sock_MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题

首先&#xff0c;环境:ubuntu 14.04,采用apt-get的方式安装的&#xff0c;手动安装可能路径设置稍有区别。1、安装MySQL后&#xff0c;用命令行首次启动时发现找不到Mysqld.sock文件&#xff0c;提示&#xff1a;ERROR 2002 (HY000): Cant connect to local MySQL server throu…

plan explorer mysql_plan explorer支持oracle吗

展开全部1.SQL语句的执行62616964757a686964616fe58685e5aeb931333361326365计划使用EXPLAIN PLAN语句来确定Oracle数据库下指定SQL语句的执行计划&#xff0c;这个语句插入每一步执行计划的行描述到指定表中。你也可使用EXPLAIN PLAN语句作为SQL跟踪工具的一部分。EXPLAIN PLA…

python 列表转图结构_Python读取网络(图)边列表数据进而转化为邻接矩阵

import networkx as nxG nx.Graph()path ./edge_list.txtedge_list []node_set set() #集合的特性就是元素不会重复&#xff0c;互异的with open(path, r) as f:for line in f:cols line.strip().split( )y1int(cols[0])y2int(cols[1])node_set.add(y1)node_set.add(y2)ed…

r语言读写word_R语言:在word中插入ggplot

最近CRAN上新了一个叫eoffice的package&#xff0c;并且不时被各路大佬提起。这个包的功能刚好也符合我最近的需求&#xff0c;这次带各位先来试试水。包的官方介绍&#xff1a;1. Introduction​cran.r-project.org这次主要试试在word中用该包插入ggplot。既然要试&#xff0c…

hamburger组件_一个侧边栏导航组件实现思路

翻译&#xff1a;布兰作者&#xff1a;Adam Argyle来源&#xff1a;https://web.dev/building-a-sidenav-component/在这篇文章中&#xff0c;我想和大家分享我是如何为 web 原型化一个 Sidenav 组件的&#xff0c;这个组件是响应式的&#xff0c;有状态的&#xff0c;支持键盘…

centos php mysql 5.6 安装_centos7安装nginx、php5.5、mysql5.6

一、nginx1、安装yum install nginx2、启动systemctl start nginx关闭&#xff1a;systemctl stop nginx 重启&#xff1a;systemctl restart nginx 检查状态&#xff1a;systemctl status nginx3、测试浏览器直接访问http://ip,应该会看到以下界面&#xff1a;4、支持php打开/…

myeclipse怎么导入mysql驱动_myeclipse sql导入数据库驱动包

如何配置strutshibernate&#xff0c;基本使用方法不少童鞋在自学SSH框架的时候&#xff0c;难在创建第一个项目&#xff0c;如何搭建好这些框架&#xff0c;很多书上只是给出了代码但是没有教如何使用&#xff0c;所以在本次博客中将会图文结合来说一下如何使用struts结合hibe…

创建或更改表 tablename 失败_mysql 创建用户

一. 创建用户命令:CREATE USER usernamehost IDENTIFIED BY password;说明&#xff1a;username&#xff1a;你将创建的用户名host&#xff1a;指定该用户在哪个主机上可以登陆&#xff0c;如果是本地用户可用localhost&#xff0c;如果想让该用户可以从任意远程主机登陆&#…

sql2000 mysql 兼容_SQL Server2000如何恢复数据库

以里诺仓库管理软件(SQL网络版)为例&#xff0c;如果您因电脑操作系统重装&#xff0c;需要把以前备份的数据库恢复过来&#xff0c;请您按如下操作来。首先&#xff0c;您需要安装MS SQL Server2000。1. 以Windowns XP为例&#xff0c;SQL Server个人版安装完成后&#xff0c;…

java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合

今天&#xff0c;我们来简单介绍一下深度优先搜索(DFS)的概念和使用。在百度词条中&#xff0c;对深搜的解释是这样的。百度词条中的解释由此&#xff0c;我们可知&#xff0c;深搜是广泛运用到 图 中的搜索方法之一。用深度优先搜索遍历图的基本思路是&#xff1a;(1)访问顶点…

java 线程执行结束_Java_如何等待子线程执行结束

本程序的数据有可能是如下:main thread work startsub thread start working.main thread work done.now waiting sub thread done.sub thread stop working.now all done.忽略标号, 当然输出也有可能是1和2调换位置了. 这个我们是无法控制的. 我们看下线程的join操作, 究竟干了…

mysql将时间轴转化为时间_MySQL日期计算及格式转换有关问题

mysql日期计算及格式转换问题2012-06-09 21:08 MySQL日期计算及格式转换问题做开发的时候经常会碰到以下几个问题使用mysql的内置函数将时间轴转成对应的日期方法一&#xff1a;使用from_unixtime(unix_timestamp)函数即可实现&#xff0c;如&#xff1a;SELECT FROM_UNIXTIME(…

java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?

这几天在各大平台上都看到过这样一些帖子&#xff0c;全都是关于String类型对象不可变的问题&#xff0c;当然现在也是找工作的准备时期&#xff0c;因此花了一部分时间对其进行整理一下。想要完全了解String&#xff0c;在这里我们需要解决以下几个问题(1)什么是不可变对象&am…

java socket android_Android:这是一份很详细的Socket使用攻略

前言Socket的使用在 Android网络编程中非常重要今天我将带大家全面了解 Socket 及 其使用方法目录示意图1.网络基础阅读本文前&#xff0c;请先了解 关于计算机网络基础&#xff0c;如计算机体系结构、TCP、UDP等知识2. Socket定义即套接字&#xff0c;是应用层 与 TCP/IP 协议…

内构函数java_Android JNI参数传递

Java中调用native函数传递的参数是Java数据类型&#xff0c;到了JNI层需进行数据类型转换&#xff0c;基本数据类型是在前面加个j&#xff0c;如int——>jint&#xff0c;应用数据类型除了基本数据类型的数据、Class、String和Throwable外&#xff0c;其余所有Java对象的数据…

java 垃圾回收机制_Java的垃圾回收机制

前言在C语言中, 程序员必须小心谨慎的处理每一项内存分配, 且内存使用完后必须手动释放曾经占用的内存空间。当内存释放不够完全时, 即存在分配但永不释放的内存块, 就会引起"内存泄漏"问题。而在Java语言中, 它给了程序员一个美好的承诺: 程序员无需管理内存, 因为J…

java闹钟程序声音_跪求高手帮忙写一个JAVA手机闹钟程序 实现添加铃声和设置多闹钟...

展开全部import java.util.*;import java.awt.*;import java.applet.*;import java.text.*;public class AlarmClock extends Applet implements Runnable{Thread timernull; //创建线程timerImage clockp,gif1,gif2,clock6,clock7; //clockp:闹钟的外壳&#xff0c;闹铃和e68a…

摩托罗拉ex232java_摩托罗拉ex232r如何刷机?摩托罗拉ex232r评测

导语&#xff1a;随着 高科 技产业的发展&#xff0c;手机作为一个深受影响的产业&#xff0c;其竞争的激烈程度也是不言而喻的。市场好比战场&#xff0c;而为了在这个手机战场中赢 得胜 利&#xff0c;不论国内或者是国外的各大厂商也都全身心的投入到新技术的开发和新产品的…

JAVA捕捉输入格式异常_Java学习(四).异常处理

异常处理任何一个软件或程序都可能在运行的过程中出现故障&#xff0c;问题的关键是故障出现以后如何处理&#xff1f;谁来处理&#xff1f;怎样处理&#xff1f;处理后系统能否恢复正常的运行&#xff1f;本章在介绍Java处理这类问题基本方法的基础上&#xff0c;讨论包含异常…