SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

04丨使用DDL创建数据库&数据表时需要注意什么?

陈旸 2019-06-19
DDL 是 DBMS 的核心组件,也是 SQL 的重要组成部分,DDL 的正确性和稳定性是整个 SQL 运行的重要基础。面对同一个需求,不同的开发人员创建出来的数据库和数据表可能千差万别,那么在设计数据库的时候,究竟什么是好的原则?我们在创建数据表的时候需要注意什么?
今天的内容,你可以从以下几个角度来学习:
了解 DDL 的基础语法,它如何定义数据库和数据表;
使用 DDL 定义数据表时,都有哪些约束性;
使用 DDL 设计数据库时,都有哪些重要原则。

DDL 的基础语法及设计工具

DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了数据库的结构和数据表的结构。
在 DDL 中,我们常用的功能是增删改,分别对应的命令是 CREATE、DROP 和 ALTER。需要注意的是,在执行 DDL 的时候,不需要 COMMIT,就可以完成执行任务。
1.对数据库进行定义
CREATE DATABASE nba; // 创建一个名为nba的数据库
DROP DATABASE nba; // 删除一个名为nba的数据库
2.对数据表进行定义
创建表结构的语法是这样的:
CREATE TABLE [](字段名 数据类型,......)

创建表结构

比如我们想创建一个球员表,表名为 player,里面有两个字段,一个是 player_id,它是 int 类型,另一个 player_name 字段是varchar(255)类型。这两个字段都不为空,且 player_id 是递增的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(84)

  • 我知道了嗯 置顶
    外键多了会有很多维护问题吧?

    作者回复: 是否使用外键确实会有一些争议。我来解释下关于外键的使用:
    首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。
    当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。

    当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。
    所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。
    不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。
    当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。
    不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。

    2019-06-19
    8
    116
  • KaitoShy
    主键:唯一标识一条记录,不能重复,不能为空。
    外键:确保了表于表之间引用的完整性,可以重复,可以为空
    索引:提升数据检索速度
    区别:主键是索引的一种,而且是唯一索引的一种。而并非在是索引,是两表之间的链接

    疑问:1. 关于使用主键和外键越多越好有个疑问,是否涉及到数据库的维护成本,性能等问题呢?而我们现实生活中很少到外键约束,基本上用程序维持这种关系的。
    2. 设计原则和之前了解的“数据库设计的三大范式”有什么关系呢?个人感觉是从不同纬度讲述了设计的方法,三大范式过于理论化,而老师的更具有实操性。不过还是希望老师,讲解一下。
    2019-06-19
    18
  • 梁😜
    在阿里巴巴《JAVA开发手册》中有这么一条
    “【强制】不得使用外键与级联,一切外键概念必须在应用层解决。”,说明指出
    “外键与级 联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风 险;外键影响数据库的插入速度。”
    老师对此怎么看呢?
    2019-06-22
    5
    17
  • 夜路破晓
    类比自己,
    主键就好比是我的身份证;
    外键就好比我在各种团队组织中的身份,如在单位是员工和管理者、在家是儿子和丈夫、在协会是会员和委员等;
    索引就好比是我的某些特征或者独树一帜的风格,玉树临风、风流倜傥之类的。

    作者回复: 可以这么理解,这么说也比较有趣。在数据库系统中实现他们会采用一些技术方式。比如索引,常用的算法有BTree何Hash索引,是一种数据结构来实现快速检索的目的。

    2019-06-19
    17
  • pepezzzz
    外键怎么会越多越好呢? 现在的数模设计都是不用外键,会带来数据归档和数据操作等一系列问题。
    2019-06-19
    12
  • 夜路破晓
    修改字段数据类型,报错,改写成:
    ALTER TABLE player MODIFY column player_age float(3,1)
    2019-06-19
    1
    9
  • Ant
    老师您好,mysql的编码utf-8是3个字节的,它和我们传统的utf-8编码是不一样的,mysql中不是用了utf-8mb4莱对应4字节的utf-8编码吗?我在项目中一般都会用utf-8mb4这种,请问下这两个在生产环境如何做选择呢?
    2019-06-19
    4
    9
  • kyle
    外键越多越好吗?应该是维护麻烦的缘故,我们都没使用外键了!
    2019-06-19
    6
  • o灬o
    银行业的数据库基本不用自增长的主键,不利于维护,基本上都是使用唯一标识字段uuid+日期+渠道流水(unique index)来保证数据的唯一性;老师您的这种方法很适合初学者和复习者。
    2019-06-20
    5
  • 木偶人King
    老师咱们这里
    ALTER TABLE player RENAME COLUMN age to player_age
    在mysql中报错。mysql中修改列名属性 用change或者modify 吧。
    修改表名用rename to.
    2019-06-20
    2
    4
  • allean
    实际生产环境,更多的是用一个冗余字段取代外键吧?

    作者回复: 分情况而定,如果外键或者这些属性字段不需要修改的话,可以使用冗余字段替代,达到通过“空间换时间”的效果
    所以呢,如果冗余字段可控好维护,可以使用。如果涉及到级联删除/级联更新,冗余字段不可控,建议还是采用外键的方式。

    2019-06-19
    4
  • 阡陌
    可是实际工作的时候更多的外键确实增大了维护难度。对于老师说的外键越多越好表示难以理解。老师可否细讲一下
    2019-06-19
    4
  • chengzise
    我的理解:
    主键:确保本表每行数据的唯一性
    外键:与外表建立连接
    索引:加快本表数据的查找
    2019-06-19
    4
  • nzdx
    MySQL8.0.16版本及以上才支持check,以前的版本解析后就忽略了,不起作用
    2019-07-20
    2
  • 风中花
    老师好!可不可以说下外键和冗余一个字段的不同!有时候是可以到达一样的效果!我早期使用orcal数据哪会全是外键设计!我记得做数据很麻烦和插入数据也有困惑!那时的感觉!也许就是老师说的数据强一致的作用效果!现在大多数关系关联全是冗余字段!其实我一直没有明白真正的差异和区别!望老师能解惑!谢谢
    2019-06-19
    2
  • ABC
    我的理解:


    主键:用来在表中确定一条数据,唯一且不可为空;

    外键:用来关联两个表的数据,对删除有约束,可以防止误删除数据(在实际删除时,也需要先删除外键关联的数据才能删除当前表的数据)。外键可以为空。

    索引:用来加快查询的速度,有唯一索引和普通索引。

    区别:

    主键:确定唯一性,增删改的时候都会用到;查询单条记录的时候会用到,不可为空;

    外键:查询和删除,修改,可为空;

    索引:查询,统计数据。
    2019-06-19
    2
  • 错过了过去
    ALTER TABLE student DROP COLUMN player_age;
    这里是 player 吧?
    2019-06-19
    2
  • Sam
    主键,在一个表中唯一标记一行数据,作用等效于唯一约束+not null;在MySQL InnoDB引擎,数据表按照主键来组织表数据,形成索引组织表;在Oracle中,也有IOT表,但不显式指定创建索引组织表,那么数据表默认是堆表,主键上另外创建一个主键索引;
    外键,是指定两表之间的父子关系,子表外键上的数据,必须要在父表存在,在父表和子表的外键相关列上创建索引,会大大提高性能;
    索引,是提高查询效率的关键手段。索引是跟数据表相互独立的数据库对象,除非是Oracle中的索引组织表或者MySQL中的主键索引。索引的类型有B+树,hash,bitmap,全文索引等等。在表数据更新时需要维护索引结构,对DML效率有影响。
    2019-06-19
    2
  • taoist

    # MariaDB 下执行下面语句

    # 创建自增,须设为主键
    CREATE TABLE player ( player_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, player_name varchar(255) NOT NULL);

    # 重命名字段
    alter table player change column `age` player_age int(11);

    # 修改字段类型
    alter table player change column `player_age` player_age float(3,1);
    2019-12-10
    1
  • supermouse
    主键是表中的记录的唯一标识,不能重复,不能为空,用来区分同一张表中不同的记录。一张表的外键是另一张表的主键,起到关联的作用,同时可以降低数据的冗余度,提高数据利用率。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,索引的一个主要目的就是加快检索表中数据。对于经常用来作为查询条件的字段,应该建立索引。但是对着数据量的增加,索引占用的空间也会越来越大
    2019-06-22
    1
收起评论
84
返回
顶部