-
遇到多对多关系的时候,一定要用中间件吗?
-
花絮
-
- 数据库解析图
-
外键
-
- 外键约束
-
设计数据库模式
-
- 数据模式:一对一
-
使用一对一的时机
-
数据模式:一对多
-
数据模式:多对多
-
- 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代表未定义的值!
花絮
-
DEC(6,2):六位数,其中小数点后两位数。
-
DATATIME(时间和日期):10:30 a.m. 9/29/2020
-
如果想查看表的数据结构,可以使DESC语句
-
DRAP TABLE 语句可以用于丢弃表,谨慎使用!
-
为表插入数据时,可以使用任何一种INSERT语句。
-
NULL是未定义的值。它不等于0,也不是空值。值可以是NULL,但绝非等于NULL。
-
没有在INSERT语句中被赋值的列默认为NULL。
-
可以把列修改为不使用NULL,这需要在创建表时使用关键字NOT NULL。
-
创建表时使用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’;
花絮
-
在条件语句中,要查找空元素,应该使用
IS NULL
-
模糊查询(like)与它的通配符(%、_):匹配任意数量、单个数量
-
取定一个范围的数据:BETWEEN…AND…
-
枚举选定: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、主键不可以被修改。
花絮
-
谨慎使用DELETE和UPDATE,使用SELECT确认自己加入了非常精确的WHERE语句,可以只选出你真正想要删除/修改的行。
-
使用UPDATE,你可以改变单一列或所有列的值。
-
在SET子句中加入更多的column = value组,其间以逗号分隔。
-
UPDATE可用于更新单一的行或多行,一切交给WHERE子句决定。
-
自动递增关键字: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语句来指定外键,否则都不算是真的外键。创建在结构内的外键被称为约束。
插入外键列的值必须已经存在与父表的来源中,这是引用完整性。
创建外键作为表的约束提供了明确的优势,如果违反了规则,约束会阻止我们破坏表。
外键不一定要是父表的主键,但是要具有唯一性。
设计数据库模式
数据模式:一对一
在模式图中,一对一关系的连接线是单纯的实线,表示连接一件事物与另一件事物。
使用一对一的时机
事实上,很少。
-
抽出数据或许能让你写出更快速的查询。
-
如果有列包含还不知道的值,可以单独存储这一列,以免主表中出现NULL。
-
我们可能希望某些数据不要太常被访问,隔离这些数据,即可管制访问次数。一员工表为例,他们的薪资信息最好另存一张表。
-
如果有一大块数据,例如BLOB类型,这段数据或许另存为另一张表会更好。
数据模式:一对多
A表的某一条记录可以对应到B表的多条记录,但B表中的一条记录只能对应A表中的某一条记录。
连接线应该带有黑色箭头来表示一对多的连接关系。
数据模式:多对多
司空见惯了,中介者模式(调停者模式)该上场了。
Junction table(连接表)
范式(NF)
第一范式(1NF)
-
数据列只包含具有院子性的值
-
没有重复的数据组
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后
金三银四马上就到了,希望大家能好好学习一下这些技术点
学习视频:
大厂面试真题:
G?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzYyMTkx,size_16,color_FFFFFF,t_70)
范式(NF)
第一范式(1NF)
-
数据列只包含具有院子性的值
-
没有重复的数据组
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-28lK7vgQ-1711464995827)]
[外链图片转存中…(img-oqfjbc41-1711464995828)]
[外链图片转存中…(img-NwVLiBJQ-1711464995828)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后
金三银四马上就到了,希望大家能好好学习一下这些技术点
学习视频:
[外链图片转存中…(img-EhMOTKQQ-1711464995828)]
大厂面试真题:
[外链图片转存中…(img-3pzOkFgU-1711464995829)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!