《深入浅出SQL》问答录

本文探讨了多对多关系在数据库设计中的使用,是否必须使用中间表,以及外键约束、不同类型的JOIN(如内联接、交叉联接、外联接)、范式理论(1NF,2NF,3NF),子查询的使用、视图的功能及其优点,以及主键和ORDERBY在SQL中的应用。
摘要由CSDN通过智能技术生成
  • 遇到多对多关系的时候,一定要用中间件吗?

  • 花絮

    • 数据库解析图
  • 外键

    • 外键约束
  • 设计数据库模式

    • 数据模式:一对一
  • 使用一对一的时机

  • 数据模式:一对多

  • 数据模式:多对多

    • Junction table(连接表)
  • 范式(NF)

    • 第一范式(1NF)
    • 组合键
  • 第二范式(2NF)

    • 函数依赖性
  • 第三范式(3NF)

  • 我为什么需要交叉联接?

  • 内联接和交叉联接有什么区别吗?

  • 可以联接多于两张表吗?

  • ORDER BY 这些东西也能与联接放到一起吗?

  • 外联接呢?

  • 花絮

    • 字符串切割函数
  • 同时(几乎同时)CREATE、SELECT、INSERT

  • 关键字AS

    • 表的别名,谁会需要?
  • 联接

    • 交叉联接(笛卡尔积)
  • 内联接

    • 自然联接
  • 子查询解析

    • 非关联子查询
  • 关联子查询

  • 内层查询究竟可以返回什么?外层查询呢?

  • 所以说,子查询可以放在子查询里吗?

  • 据说使用子查询能解决的事情,用联接也可以?是这样吗?

    • 左外联接
  • 右外联接

  • 自联接

  • UNION

    • UNION的使用限制
  • 示例

  • 联接VS子查询

  • 有使用左外连接取代右外联接的理由吗?

  • 检查约束

  • 视图

    • 创建视图
  • 查看视图

  • 视图的实际行动

  • 为什么视图对数据库有好处?

  • 销毁视图

  • 事务

  • 可以查看以创建的视图吗?

  • 如果我卸载了有视图的表,会发生什么事?

如果我只有一张白表,我为什么还要创建数据库?

A:SQL语言要求所有的表都放在数据库中,这当然有它的理由。SQL能控制多位用户同时访问表的行为,能够授予或撤销对整个数据库的访问权,这有时比控制每张表的权限要简单的多。

我发现CREATE DATABASE 命令的字母全是大写,一定要这样吗?

A:有些系统确实要求某些关键字采用大写形式,但SQL本身不区分大小写。也就是说,命令不大小写也可以,但命令大小写是良好的SQL编程惯例。

大写让我们很容易分辨命令与数据库名称。

给数据库、表和列命名时有什么注意事项吗?

A:创建具有描述性的名称通常有不错的效果。有时候要多用几个单词来命名。所有名称都不能包含空格,所以使用下划线能够让你创建更具描述性的名称。

命名时最好避免首字母大写,因为SQL不区分大小写,极可能会搞错数据库。

为什么不能直接把BLOB当成所有文本值的类型?

A:因为这样很浪费空间。VARCHAR或CHAR只会占用特定空间,不会多于256个字符。但BLOB需要很大的存储空间。

另外,有些重要的字符串运算无法操作BLOB类型的数据,只能用于VARCHAR或CHAR。

NULL是什么都没有的意思吗?

A:当然不是!! 它从来就不等于0。而且它也不等于另一个NULL,事实上,两个NULL根本不能放在一起比较。值可以是NULL,但是它不会等于NULL,因为NULL代表未定义的值!

花絮

  1. DEC(6,2):六位数,其中小数点后两位数。

  2. DATATIME(时间和日期):10:30 a.m. 9/29/2020

  3. 如果想查看表的数据结构,可以使DESC语句

  4. DRAP TABLE 语句可以用于丢弃表,谨慎使用!

  5. 为表插入数据时,可以使用任何一种INSERT语句。

  6. NULL是未定义的值。它不等于0,也不是空值。值可以是NULL,但绝非等于NULL。

  7. 没有在INSERT语句中被赋值的列默认为NULL。

  8. 可以把列修改为不使用NULL,这需要在创建表时使用关键字NOT NULL。

  9. 创建表时使用DEFAULT,可于日后输入缺乏部分数据的记录时自动的填入默认值。

我试着从网络上复制并粘贴查询,但在使用时却一直出现错误信息,我做错什么了吗?

A:从web浏览器剪切过来的查询有时包含了外观像空格,但在SQL里有其他含义的隐形字符。你可以把查询粘贴到文本编辑器中,如此一来,就可以仔细寻找并移除这些小麻烦。

所以我应该把查询粘贴到Microsoft Word之类的软件中吗?

A:建议使用norepad(PC)或TextEdit(Mac)的纯文本编辑模式。

关于单引号的两种转义方法,哪一种比较好呢?

A:其实没有优劣之分,但是斜杠对我们肉眼有利。

若是NOT 搭配 AND/OR,该如何处置?

A:如果想在AND或OR子句中使用NOT,请直接将它放在关键字后面,如下:

SELECT * FROM asd WHERE NOT main = ‘aaa’ AND NOT mian = ‘bbb’;

花絮

  1. 在条件语句中,要查找空元素,应该使用 IS NULL

  2. 模糊查询(like)与它的通配符(%、_):匹配任意数量、单个数量

  3. 取定一个范围的数据:BETWEEN…AND…

  4. 枚举选定:in :select XXX from XXX where XXX IN(XXX、XXX、XXX),select XXX from XXX where XXX NOT IN(XXX、XXX、XXX).

为什么不能假设最后一条记录就是最新的记录?

A:因为表中的记录排序方式没有一定的规则,而且我们很快又要调整查询结果的记录,所以实在无法保证表的最后一条记录是最后插入的记录。除非我们记住哪份数据先进来。

数据会改变,所以知道如何改变数据才会如此重要。

A:但表设计的越好,整体所需的更新操作就会越少。良好的表设计能让我们从专心于表的内容中解放出来。

查询表时是否应该避免使用LIKE?LIKE有问题吗?

A:LIKE没有问题,但可能很难运用到你的查询中,而且你会冒着找出你不需要的一大堆数据的风险。如果你的列包含复杂信息的话,LIKE搜索精确数据的能力还不够。

为什简短的查询优于较长的查询?

A:查询越简短越好。随着数据的增长,还有对新表的添加,你的查询就会变得越来越复杂。如果现在就练习设计最简单的查询,以后你会感谢现在的及早训练。

简述创建表的思路

A:1、挑出事物,挑出你希望表描述的某样事物。

2、列一份关于那样事物的信息列表,这些信息都是使用表时的必要信息。

3、使用信息列表,把关于那样事物的综合信息拆分成小块信息,以便用于组织表。

原子不是很小吗?我是不是应该把数据分割成非常非常小的片段?

A:不是哦,让数据具有原子性,表示把数据分割成创建有效率的表所需的最小片段。

别把数据切割的超出必要。如果不需要增加额外的列,就别因为可以增加而增加。

原子性对我有什么帮助?

A:原子性有助于确保表内容的准确性。

原子性也可以使查询更加有效率。因为查询会因原子性而更容易设计,而且所需时间也更短,因此在面对大量数据时有加分效果。

主键规则说说看?

A:1、主键用于独一无二地识别出每条记录。

2、主键不可以为NULL。

3、插入新纪录时必须指定主键值。

4、主键必须简洁。

5、主键不可以被修改。

花絮

  1. 谨慎使用DELETE和UPDATE,使用SELECT确认自己加入了非常精确的WHERE语句,可以只选出你真正想要删除/修改的行。

  2. 使用UPDATE,你可以改变单一列或所有列的值。

  3. 在SET子句中加入更多的column = value组,其间以逗号分隔。

  4. UPDATE可用于更新单一的行或多行,一切交给WHERE子句决定。

  5. 自动递增关键字:AUTO_INCREMENT


如果我想改变列的顺序呢?像ALTER TABLE MODIFY COLUMN proj_desc AFTER con_name;这样做可以吗?

创建表后你就无法真正的改变列的顺序了。最多只能在指定位置添加新列,然后删除旧列,但是这样会失去旧列中的所有数据。

如果我已经创建了主键,然后又意外的想改用另一列呢?可以只移除主键的设置而不改变其中的数据吗?

A:可以,而且很简单。ALTER TABLE your_table DROP PRIMARY KEY,ADD PRIMARY KEY(XXX);

AUTO_INCREMENT又该如何处理/

A:你可以把它添加到没有自动递增功能的列中,如下所示:ALTER TABLE your_table CHANGE yoour_id your_id INT(11) NOT NIULL AUTO_INCREMENT;

而且可以这样就将它删除:ALTER TABLE your_table CHANGE your_id your_id INT(11) NOT NULL;

有一点要记住:每个表中只有一列可以加上AUTO_INCREMENT,该列必须为整形而且不能包含NULL。

花絮

ALTER使用示例

ALTER TABLE my_contacts

ADD COLUMN contact_id INT NOT NULL AUTO_INCREMENT FIRST,

ADD PRIMARY KEY(contact_id);

ALTER TABLE my_contacts

ADD COLUMN phone VARCHAR(10)

AFTER list_name;

CHANGE --可同时改变现有列的名称和数据类型

MODIFY --修改现有列的数据类型或数据

ADD --在当前表中添加一列,可自选类型

DROP --从当前表中删除某列

ALTER TABLE project_list

CHANGE COLUMN number proj_id INT NOT NULL AUTO_INCREMENT,

ADD PRIMARY KEY(proj_id);

–将原名为“name”的列的名称和类型修改

–如果把数据改成另一种类型,你可能会丢失数据

ALTER TABLE project_list

CHANGE COLUMN descriptionofproj proj_desc VARCHAR(10),

CHANGE COLUMN contractoronjob con_name VARCHAR(30),

ALTER TABLE project_list

MODIFY COLUMN proj_desc VARCHAR(120);

ALTER TABLE project_list

DROP COLUMN start_date;

一些便利的字符串函数

SELECT RIGHT(lie,2) FROM my_contacts; --从lie列中读取两个字符

SELECT SUBSTRING_INDEX(lie,‘,’,1) FROM my_contacts;

–截取部分字符串,第三个参数就是寻找第一个逗号,用于截取第一个逗号之前的所有字符。

SELECT UPPER(‘usa’); --把整整组字符串改大写

SELECT LOWER(‘USA’); --改小写

SELECT LTRIM(’ dogfood '); --清除左侧空格

SELECT RTRIM(’ catfood ');

SELECT LENGTH(‘San Antonio,TX’); --返回字符串中的字符数量


要用到ELSE吗?

A:看你咯,无所谓。

如果没有ELSE而且列也不符合任何一个WHEN条件,会发生什么事?

在你想更新的列里面不会发生任何改变。

如果我只想对部分列套用CASE表达式,应该怎么做呢?

A:可以加上WHERE,可以在END后加上WHERE子句。这样,CASE就只会套用在符合WHERE子句的列上。

CASE表达式可以搭配UPDATE以外的语句吗?

A:why not?

讲到MIN,如果查询中的列有NULL,这会有上面影响吗?

A:好问题。NULL其实不会有影响,因为NULL代表此处无值,而不是此值为0.

花絮

CASE语句

看图:

在这里插入图片描述

在这里插入图片描述

现在怎么办?是像这样吗?

在这里插入图片描述

这样要执行n次啊。。。

那有没有更好的办法,其实在主语言中,这不过就是个分支语句的事情嘛,奈何SQL语言我不熟啊。。。

没事,一直以来不懂,从今以后懂了:

UPDATE my_table

SET new_column =

CASE

WHEN column1 = somevalue1

THEN newvalue1

WHEN column2 = somevalue2

THEN newvalue2

ELSE newvalue3

END;

在这里插入图片描述

ORDER BY排序
1、升序排序:ASC | 降序排序:DESC
2、SQL排序规则

在这里插入图片描述

多列排序:

越靠前的列权重越高,拥有对后面列的一票否决权。

GROUP BY 分组

SELECT first_name,SUM(sales)

FROM cookie_sales

GROUP BY first_name

ORDER BY SUM(sales) DESC

;

SELECT first_name,AVG(sales)

FROM cookie_sales

GROUP BY first_name

ORDER BY AVG(sales) DESC

;

SELECT first_name,MAX(sales)

FROM cookie_sales

GROUP BY first_name

SELECT first_name,MIN(sales)

FROM cookie_sales

GROUP BY first_name

;

COUNT,计数

SELECT COUNT(sale_date)

FROM cookie_sales

;

DISTINCT,取独

SELECT DISTINCT sale_date

FROM cookie_sales

ORDER BY sale_date

;

SELECT COUNT(DISTINCT sale_date)

FROM cookie_sales

;

LIMIT:限制查询数量

SELECT first_name,SUN(sales)

FROM cookie_sales

GROUP BY first_name

ORDER BY SUN(sales) DESC

LIMIT 2 OFFSET 4 --跳过两条,查询两条记录

–也可以这样写:LIMIT 4,2

;


如果外键是NULL,它右什么作用吗?有办法确定外键已经连接到父键了吗?

A:外键为NULL,表示在父表中没有相符的主键。但我们可以确认外键包含有意义、已经存储在父表中的值,请通过约束实现。

不能单纯的使用另一张表的键,称之为外键,而不加上约束吗?

A:其实可以,但创建成外键约束后,就只能插入已经存在于父表中的值,有助于加强两张表间的连接。

加强连接?是什么意思?

A:外键约束能确保引用完整性(换句话说,如果表中的某行有外键,约束能确保该行通过外键与另一张表中的某一行一一对应)。如果我们试着删除主键表中的行或者是改变主键值,而这个主键是其他表的外键约束时,你就会收到错误警告。

所以上面说的那种,我就不能删除了是吗?

A:还是可以的,先移除外键行即可。

遇到多对多关系的时候,一定要用中间件吗?

A:不然呢?

花絮

数据库解析图

在这里插入图片描述

创建数据库的视觉解析图,在设计查询时有助于理解数据相连的方式,但模式也能以文字形式表达,看个人。

外键

在这里插入图片描述

在这里插入图片描述

外键约束

创建一张表并加上可作为外键的列虽然很简单,但除非你利用CREATE或ALTER语句来指定外键,否则都不算是真的外键。创建在结构内的外键被称为约束。

插入外键列的值必须已经存在与父表的来源中,这是引用完整性。

创建外键作为表的约束提供了明确的优势,如果违反了规则,约束会阻止我们破坏表。

外键不一定要是父表的主键,但是要具有唯一性。

在这里插入图片描述

设计数据库模式
数据模式:一对一

在模式图中,一对一关系的连接线是单纯的实线,表示连接一件事物与另一件事物。

在这里插入图片描述

使用一对一的时机

事实上,很少。

  1. 抽出数据或许能让你写出更快速的查询。

  2. 如果有列包含还不知道的值,可以单独存储这一列,以免主表中出现NULL。

  3. 我们可能希望某些数据不要太常被访问,隔离这些数据,即可管制访问次数。一员工表为例,他们的薪资信息最好另存一张表。

  4. 如果有一大块数据,例如BLOB类型,这段数据或许另存为另一张表会更好。

数据模式:一对多

A表的某一条记录可以对应到B表的多条记录,但B表中的一条记录只能对应A表中的某一条记录。

在这里插入图片描述

连接线应该带有黑色箭头来表示一对多的连接关系。

在这里插入图片描述

数据模式:多对多

在这里插入图片描述

司空见惯了,中介者模式(调停者模式)该上场了。

Junction table(连接表)

在这里插入图片描述

范式(NF)
第一范式(1NF)
  1. 数据列只包含具有院子性的值

  2. 没有重复的数据组

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

大厂面试真题:

G?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYyMTkx,size_16,color_FFFFFF,t_70)

范式(NF)
第一范式(1NF)
  1. 数据列只包含具有院子性的值

  2. 没有重复的数据组

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-28lK7vgQ-1711464995827)]

[外链图片转存中…(img-oqfjbc41-1711464995828)]

[外链图片转存中…(img-NwVLiBJQ-1711464995828)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

[外链图片转存中…(img-EhMOTKQQ-1711464995828)]

大厂面试真题:

[外链图片转存中…(img-3pzOkFgU-1711464995829)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值