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 memcached java_java缓存技术memcached实例

1 下载memcached-1.2.1-win32.zip 并且解压.2 新建web project项目 名字自己取,然后导入必要的包,alisoft-xplatform-asf-cache-2.5.1.jar,commons-logging-1.0.3.jar,log4j-1.2.13.jar3 新建类 user.javapackage bean;import java.io.Serializable;public class User impleme…

编译安装mysql5.6.36_MySQL5.6.36编译安装

一、MySQL5.6.36安装前准备(1)克隆一个模板机器(使用centos6)&#xff0c;克隆完做快照(2)IP 10.0.0.52 主机名db02(3)iptables selinux(4)下载好5.6.36(5)安装依赖包yum install -y ncurses-devel libaio-devel cmake(6)安装cmakeyum install cmake –y(7)创建用户useradd -s …

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…

mysql 报表统计sql使用实例_mysql 案例~mysql元数据的sql统计

一 简介:今天我们来收集下提取元数据的sql二 前沿: information_schema 引擎 memory 元数据收集表三 sql语句:1#没有使用索引的表统计SELECT t.TABLE_SCHEMA,t.TABLE_NAME,t.TABLE_ROWS FROM information_schema.tables AS t LEFT JOIN (SELECT DISTINCT table_schema, table_…

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

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

linux忘记mysql登录用户密码_linux中忘记mysql用户root密码解决方案

1.vim /etc/my.cnf[mysqld]skip-grant-tables ##追加此行&#xff0c;跳过权限表&#xff0c;2.重启mysqlsystemctl restart mysqld3.mysql 登陆mysqlmysql> use mysql;mysql> UPDATE user SET Password password ( ‘zha123456‘ ) WHERE User ‘root‘ ;mysql> fl…

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

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

suse下删除mysql_每日MySQL之005:SUSE linux下卸載MySQL

卸載這里的卸載&#xff0c;對應於之前的安裝停止MySQL服務&#xff1a;db2a:~ #service mysql stop找到所有的MySQL包&#xff1a;db2a:~ #rpm -qa | grep -i mysqlmysql-community-server-5.7.19-1.sles11mysql-community-common-5.7.19-1.sles11libqt4-sql-mysql-4.6.3-5.34…

java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得

BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用socket.close()关闭不需要的socket.从一个有若干行的文件中依次读取各行&#xff0c;处理后输出&#xff0c;如果用以下方法&…

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

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

java数组元素是类_Java数组及其常用类

本文由疯狂软件教育中心整理&#xff0c;更多Java等高新技术&#xff0c;疯狂软件期待与你交流。一、JAVA中的数组(1)数组的定义&#xff1a;是有相同类型的、用一个标识符名称封装到一起的一个对象序列或基本数据类型数据序列。数组是一种最简单的复合数据类型。数组可以是一维…

java 数组 equals_java中用equals比较两个内容相同的字符数组

********************************************你在数组上调用函数equals,比较的是c和ch的地址改成if(Arrays.equals(ch,c));就可以比较c和ch的内容了********************************************java.sun.com上说&#xff0c;The equals method for class Object implements…

java ssh pdf_JavaSSH框架技术规范.pdf

航安项目(三期)框架技术规范日期 版本 简述 作者2011年3月1 日 V1.0 指定本系统的技术规范2011年9月25 日 V2.0 指定本系统的技术规范框架技术规范航安项目框架技术规范 目录1、规范配置说明12、系统三层架构规范配置说明12.1 Dao22.2 Entity42.3 Service43、Spring 规范配置说…