MySQL的多表操作

1. 多表关系

之前我们都是对一个表进行操作,但一个二维表存储过种类的数据可能会造成数据冗余,也就是同样的数据多次存储,例如我们的学生选课,如果将学生信息与其选课信息放在一个表中,就会出现很多重复的数据,而我们将他们分为两个表,通过主键和外键进行连接,这可以避免这种情况。
表的关系有:

  1. 一对多
  2. 多对一
  3. 多对多

其中一对多和多对一这两种关系最为简单,只需两张表即可,而多对多的关系需要一个中间表进行链接。

2. 外键约束

  MySQL的外键约束(foreign key)是表的一个特殊字段,它通常与主键连用,外键的多用其实就是用来与其他表进行连接的,而拥有主键的表又称为主表,一个表既可以是主表也可以是从表,这取决于连接数据的对应关系。

定义外键时需要遵守一下规则:

  1. 对应的主表必须已经存在数据库中,或是当前的表中
  2. 必须为主表定义主键,只有这样才从表才能与主表连接
  3. 主表中主键对应字段的值不能为空,但从表中外键对应字段的值可以为空,也就是说只要外键中的每个非空值出现在指定的主键中,这个外键就是正确的
  4. 在主表后面指定列或列名的组合,这个列或列名的组合必须时主表的主键或候选键。
  5. 外键对应列的数目与主键对应列的数目相同
  6. 外键中列的数据类型必须与主表中对应主键的列的数据类型相等

2.1创建外键约束

1.在create中创建外键约束

Constraint 外键名 foregin key 字段名(可多个) reference 主表名 主键列(可多个);

2.在创建表后添加外键约束
我们用alter

Alter table 表名 add constraint 外键名 foreign key 字段名 reference 主表名 列名;

2.2删除外键约束

用alter
语法格式

Alter table 表名 drop foreign key 外键约束名;--(外键约束名是自己创建外键约束时起的名字)

例如

Alter table emp drop foreign key emp_k;

3.对表联合查询

  多表查询就是对两个或两个以上的表进行查询,因为我们需要的数据可能是来自多个表中的数据。

而多表连接的方式有一下几种:

  1. 交叉连接:产生笛卡尔积
  2. 内连接:分为隐式内连接和显示内连接
  3. 外连接:分为左外连接,右外连接和满链接

3.1交叉连接

  交叉连接可以理解为排列组合,假设我们有两组数据,并且一组是主键对应的有n个,一组是外键对应的有m个,而交叉连接就是将外键中的每个数据都与主键的每个数据进行组合,从而得到nm行数据。

3.2内连接

内连接其实就是通过主键和外键的连接取两个表的交集。

在这里插入图片描述
也就是在从表的外键中,找出所有与主表主键中有对应值得数据。

  而内连接有隐式和显式,其实它们的效果都是一样的,只是语法格式不同,且他们是两个不同标准的语法,当然现在两种都支持。

隐式内连接(SQL92标准):select * from A,B where 条件;
显式内连接(SQL99标准):select * from A inner join B on 条件;

这里我们可以看到隐式内连接后面的子句用的式where,显式内连接用的是on,并且用了关键字inner join。

3.3外连接

  外连接有左外连接,右外连接和满链接,我们知道主键中的值和外键中的值是通常是一一对应的,比如学生表(学号,姓名,年龄),选课表(学号,课程号,课程),我们通过选课表中的学号对应学生表中的学生,通过两个表的连接从而得出每个学生分别选了哪些课。
但是学生不一定把所有课都选了,而课也不应定就被选了,我们通过这个例子分别解释各种外连接。

1. 左外连接:
  左外连接就是保留左边表的所有值,因为左表的外键不一定就有在右表中有对应的值,它对应右表可能为空值。
在这里插入图片描述
2. 右外连接:
  右外连接与左外连接相反,右外连接就保留右表的所有值。
在这里插入图片描述
3. 满链接:
  满链接算是左外连接和右外连接的并集,即左右两边的表的值都保留下来。
在这里插入图片描述

4.子查询及子查询关键字

  子查询其实就是语句的嵌套,与编程语言中函数的调用、循环的嵌套一样。比如select的嵌套。

举例:

  当我们知道又一个表emp时,但我们不知道其内部的数据或则数据很多,几百上千个,我们需要找到工资最高的员工时,就可以进行嵌套。

Select * from emp where salary = (select max(salary) from emp);

分析:

(select max(salary) from emp)这个子查询用来查询工资多高是多少,将查找出的值返回,假设它的返回值为50000,那么整个语句就是查询工资为50000的员工信息。
相当于select * from emp where salary = 50000
但由于我们并不知道最大工资是多少,所以我们通过嵌套的方式进行查询。

在子查询中还含有一些常见的关键字,它们可以提供更丰富的查询功能:

  1. ALL关键字
  2. ANY关键字
  3. SOME关键字
  4. IN关键字
  5. EXISTS关键字

4.1 ALL关键字

语法格式:

Selectfromwhere c > all(查询语句); -- 举例

等价于

Selectfromwhere c > result1 and c > result2 and c > result3 … ;

All的意思就是满足所有条件,也就是说c要大于子查询语句返回的所有值。

特点:

与子查询返回的所有值进行比较,成立则返回true,否则false; ALL可以与判断符号结合使用,如比较大小的这些。

4.2 ANY和SOME关键字

举例:

Selectfromwhere c > any(查询语句);

等价于

Selectfromwhere c > result1 or c > result2 or c > result3 … ;

Any和some的作用是一样的,可以将some理解为any的别名。

特点和all一样,不过any和some则是只需满足其中一个结果即返回true,如果所有结果都不满足则返回false。

4.3 IN关键字

Selectfromwhere c in (查询语句);

等价于

Selectfromwhere c = result1 or c = result2 or c = result3 or result4;

特点:

In关键字就是判断某个记录的值是否在指定的集合中
Not in 则是反过来,判断记录是否不存在指定的集合中

4.4 EXISTS关键字

格式:

Selectfromwhere exists(查询语句);

特点:

EXISTS子句不返回结果,只返回true和false
EXISTS子查询是用来判断是否有返回值,有返回值则true,外层查询执行,没有则false,外层查询不执行。
EXISTS的执行效率比IN高,因此在实际开发中,特别是大量数据时,推荐使用EXISTS关键字。

例如:
查询公司是否有大于60岁的员工,有则输出

Select * from emp as a where exists(select * from emp as b where a.age > 60);

4.5 自关联查询

  自关联查询就是自己和自己进行关联,一个表既可以是主表,也可以是从表,这取决于连接的关系,所以一个表里面既可以有主键也可以有外键,而一个表既有主键也有外键,并且该外键是与自己的主键相连,那就可以进行自关联查询。

同时要注意,进行自关联查询时要给表取别名来区分

格式:

Select 字段列表 from1 a,表1 b where 条件;

或者

Select 字段列表 from1 a [left] join2 b on 条件;
  • 48
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
在Java中进行MySQL多表操作需要使用JDBC(Java Database Connectivity)技术,具体步骤如下: 1. 加载MySQL驱动程序 在Java中连接MySQL数据库需要加载MySQL驱动程序,可以使用Class.forName()方法加载。 ``` Class.forName("com.mysql.jdbc.Driver"); ``` 2. 建立数据库连接 使用DriverManager.getConnection()方法建立数据库连接,需要传入数据库URL、用户名和密码。 ``` String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); ``` 3. 创建Statement对象 使用Connection.createStatement()方法创建Statement对象,用于执行SQL语句。 ``` Statement stmt = conn.createStatement(); ``` 4. 执行SQL语句 使用Statement.executeUpdate()方法执行SQL语句,可以执行增、删、改操作。 ``` String sql = "insert into user(name, age) values('Tom', 20)"; stmt.executeUpdate(sql); ``` 使用Statement.executeQuery()方法执行SQL查询语句,返回ResultSet对象,可以遍历结果集获取查询结果。 ``` String sql = "select * from user"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println(name + " " + age); } ``` 5. 关闭连接 使用Connection.close()方法关闭连接。 ``` conn.close(); ``` 以上是Java进行MySQL多表操作的基本步骤,具体操作需要根据业务需求来设计SQL语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值