day42

这篇具有很好参考价值的文章主要介绍了day42。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日内容概要

  • 外键(表与表之间的关系)

  • 一对多

  • 多对多

  • 一对一

  • 多表查询相关(核心)

  • Navicat可视化软件

  • 多表查询练习题(可能有些复杂,当堂不一定能消化)

  • python操作MySQL

  • 事务

外键

表与表之间建立关系

表与表之间只有三种关系:一对一,多对一,一对多
在MySQL的关系中没有多对一的说法

定义一张表
该表的组织结构不清晰
浪费硬盘空间

数据的扩展性极差,修改起来难度极差

如何优化?

使用外键
什么是外键?
外键是关系数据库中的一个概念,用于建立两个关系表之间的关联关联
它是一个列或一组列,用来指向另一个表的主键
外键在建立数据表与数据表之间的关系时起到了重要的作用

一对多关系

1.一对多关系,外键建在字段多的地方
2.在创建表的时候一定要先创建被关联表
3.在录入数据的时候必须要先录入被关联表
在确定表与表关系之前,首先要换位思考
例如:
在员工表:要考虑到员工表里面的一个员工是否能对应部门表里面的多个部门
在部门表:要考虑到一个部门能否对应员工表里面的多个员工
总结:员工表与部门表只是单向的一对多成立,那么员工表与部门表就是一对多的表关系

create table dep(
	id int primary key auto_increment,
    dep_name varchar(32),
    dep_desc varchar(32)
);

create table emp(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    dep_id int,
    foreign key(dep_id) references dep(id) # 让两张表建立了外键关系
    on update cascade # 级联更新
    on delete cascade # 级联删除
);

录入数据
mysql> insert into dep(dep_name,dep_desc) values('人事部','管理人才');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp(name,age,dep_id) values('kevin',20,1);\
Query OK, 1 row affected (0.00 sec)
多对多

以图书表和作者表为例
我们站在图书表的角度:一本图书能不能有多个作者?可以
我们站在作者表的角度:一个作者能不能写多本书?可以
结论:两个都可以,那么表关系就是’多对多‘
针对多对多的表关系,外键字段建在第三张表中

mysql> create table book(
    -> id int primary key auto_increment,
    -> title varchar(32),
    -> price decimal(8,2));
Query OK, 0 rows affected (0.04 sec)

mysql> create table author(
    -> id int primary key auto_increment,
    -> name varchar(32),
    -> addr varchar(32));
Query OK, 0 rows affected (0.04 sec)

mysql> create table book2author(
    -> id int primary key auto_increment,
    -> book_id int,
    -> author_id int,
    -> foreign key(book_id) references author(id)
    -> on update cascade
    -> on delete cascade
    -> ,foreign key(author_id) references book(id)
    -> on update cascade
    -> on delete cascade);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into book(title,price) values('斗破苍穹',1000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into book(title,price) values('完美世界',2000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into author(name,addr) values('zhangsan','beijing');
Query OK, 1 row affected (0.01 sec)

mysql> insert into author(name,addr) values('lisi','shanghai');
Query OK, 1 row affected (0.00 sec)

mysql> insert into book2author(book_id,author_id) values(1,1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into book2author(book_id,author_id) values(1,2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into book2author(book_id,author_id) values(2,1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into book2author(book_id,author_id) values(2,2);
Query OK, 1 row affected (0.00 sec)

一对一

以作者和作者详情表为例
外键关系建在哪里?两张表都可以,但是,推荐建在查询率较高的一张表

mysql> create table author_detail(
    -> id int primary key auto_increment,
    -> qq varchar(32),
    -> email varchar(32));
Query OK, 0 rows affected (0.03 sec)

mysql> create table author1(
    -> id int primary key auto_increment,
    -> name varchar(32),
    -> gender varchar(32),
    -> author_detail_id int unique,
    -> foreign key(author_detail_id) references author_detail(id)
    -> on update cascade
    -> on delete cascade
    -> );
Query OK, 0 rows affected (0.03 sec)


mysql> insert into author_detail(qq,email) values(1234,4321);
Query OK, 1 row affected (0.00 sec)

mysql> insert into author1(name,gender,author_detail_id) values('wzc',20,1);
Query OK, 1 row affected (0.00 sec)

注意事项

1.在创建表的时候 需要先创建被关联表(没有外键字段的表)
2.在插入新数据的时候 应该先确保被关联表中有数据
3.在插入新数据的时候 外键字段只能填写被关联表中已经存在的数据
4.在修改和删除被关联表中的数据的时候 无法直接操作
    如果想要数据之间自动修改和删除需要添加额外的配置

多表查询

在此之前,都是单表下的查寻
多表查询的思路是:
1.子查询
查询kevin的部门名称
应该先查询kevin的部门编号(部门表的id)

select dep_id from emp where name='kevin';

然后拿着查询出来的部门id去dep表中查询部门名称

select * from dep where id = (select dep_id from emp where name='kevin');

子查询就是:一条SQL的执行结果就是另外一条SQL的执行条件,其实就是分布操作

2.连表查询
把多张有关系的表链接成一张大的虚拟表。连接出来的虚拟表不是实际存在的,它是内存中存储,然后按照单表查询

专业的连表查询:

inner join 内连接,查询的是两张表中都有的数据
left join 左连接,以左表为基准,查询左表中所有的数据,右表没有的数据,使用NULL填充

right join:右连接,以右表为基准,查询右表中所有的数据,左表中没有的数据,使用NULL填充

union:连接两个SQL语句的结果

select * from emp left join dep on emp.dep_id=lep.id

union

select * from emp right join dep on.dep_id=dep.id;

连表可以连很多表,不只是两张,大多数是两张
 

Navicat可视化软件

这个软件基本上是不用写SQL语句
官网:Navicat | 产品查看完整的 Navicat 产品列表,包括最佳数据库管理工具 Navicat、Navicat Monitor、Navicat Charts Creator、Navicat Collaboration 和 Navicat Data Modeler。https://www.navicat.com.cn/products/文章来源地址https://www.toymoban.com/news/detail-720443.html

到了这里,关于day42的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录day42(背包)

    2024年02月13日
    浏览(27)
  • 每天一点Python——day42

     

    2024年02月11日
    浏览(26)
  • day42-servlet下拉查询/单例模式

    1.Servlet 实现下拉查询(两表) 2. 单例模式 1.实战 1.1  创建工程,准备环境... 1.2  接口 1.3  重写方法 1.4  servlet 1.5  list.jsp list.jsp 详解 2.单例模式 2.1  饿汉模式:在程序加载时直接创建对象(私有化,静态化),并创建公有的静态的(public static)get方法;其他类需要使用时

    2024年02月16日
    浏览(28)
  • Day 42 算法记录|动态规划 09 (打家劫舍)

    1.dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2.dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); 3.初始化,dp[0] 和 dp[1],dp[0] 一定是 nums[0],dp[1] = max(nums[0], nums[1]); 3.遍历顺序,dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历! 进一步对滚动数组

    2024年02月15日
    浏览(28)
  • 代码随想录day42|背包问题、416. 分割等和子集

     背包问题:    01 背包 二维数组dp[i][j]解法 纯01背包:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品只能用一次 ,求解将哪些物品装入背包里物品价值总和最大。 dp[i][j]:从下标为[0-i]的物品里任意取,放进容量为j的

    2024年04月09日
    浏览(41)
  • day59 | 503.下一个更大元素II、42. 接雨水

    目录: 503.下一个更大元素II https://leetcode.cn/problems/next-greater-element-ii/ 给定一个循环数组  nums  (  nums[nums.length - 1]  的下一个元素是  nums[0]  ),返回  nums  中每个元素的  下一个更大元素  。 数字  x  的  下一个更大的元素  是按数组遍历顺序,这个数字之后的第一个

    2024年02月16日
    浏览(21)
  • 研习代码 day42 | 动态规划——买卖股票的最佳时机 I II

            1.1 题目         给定一个数组  prices  ,它的第  i  个元素  prices[i]  表示一支给定股票第  i  天的价格。         你只能选择  某一天  买入这只股票,并选择在  未来的某一个不同的日子  卖出该股票。设计一个算法来计算你所能获取的最大利润。

    2024年02月03日
    浏览(29)
  • 代码随想录Day42-图论:力扣第417m、841m、463e题

    题目链接 代码随想录文章讲解链接 方法一: 用时:1h0m58s 思路 直接找哪些点既可以到达太平洋又可以到达大西洋比较麻烦,换个角度,找到太平洋可以逆流而上到达的点,再找到大西洋可以逆流而上到达的点,两者的交集就是所需要的答案。 用两个二维数组分别记录太平洋

    2024年02月05日
    浏览(49)
  • DAY42:动态规划(二)斐波那契数列+爬楼梯+最小花费爬楼梯

    斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: 给定 n ,请计算 F(n) 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30 思路:动规五步 确定dp数组和数组下标含义 DP题目都需要定义一维

    2024年02月13日
    浏览(46)
  • 力扣算法刷题Day42|动态规划:01背包问题 分割等和子集

    力扣题目:01背包问题(二维数组) 刷题时长:参考题解 解题方法:动态规划 + 二维dp数组 复杂度分析 时间 空间 问题总结 理解递推公式困难 本题收获 动规思路:两层for循环,第一层i遍历物品,第二层j枚举背包容量以内所有值 确定dp数组及下标的含义:dp[i][j] 表示从下标

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包