注:摘自极客时间《SQL必知必会》,纯属个人学习笔记总结
04丨使用DDL创建数据库&数据表时需要注意什么?
- 思考
- 了解 DDL 的基础语法,它如何定义数据库和数据表;
- 使用 DDL 定义数据表时,都有哪些约束性;
- 使用 DDL 设计数据库时,都有哪些重要原则。
- DDL的基础语法及设计工具
DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了数据库的结构和数据表的结构。
常用的功能是增删改,分别对应的命令是 CREATE、DROP 和 ALTER
(1).对数据库进行定义
创建:CREATE DATABASES 数据库名称
删除:DROP DATABASES 数据库名称
(2).对表进行定义
创建:create table 表名称
(3).创建表结构
CREATE TABLE player ( player_id int(11) NOT NULL AUTO_INCREMENT, player_name varchar(255) NOT NULL) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
(4).修改表结构
添加字段:ALTER TABLE player ADD (age int(11));
修改字段名:ALTER TABLE player RENAME COLUMN age to player_age
修改字段数据类型:ALTER TABLE player MODIFY (player_age float(3,1));
删除字段:ALTER TABLE player DROP COLUMN player_age;
- “三少一多原则”
1.数据表的个数越少越好
RDBMS 的核心在于对实体和联系的定义,也就是 E-R 图(Entity Relationship Diagram),数据表越少,证明实体和联系设计得越简洁,既方便理解又方便操作。
2.数据表中的字段个数越少越好
字段个数越多,数据冗余的可能性越大。设置字段个数少的前提是各个字段相互独立,而不是某个字段的取值可以由其他字段计算出来。当然字段个数少是相对的,我们通常会在数据冗余和检索效率中进行平衡。
3.数据表中联合主键的字段个数越少越好
设置主键是为了确定唯一性,当一个字段无法确定唯一性的时候,就需要采用联合主键的方式(也就是用多个字段来定义一个主键)。联合主键中的字段越多,占用的索引空间越大,不仅会加大理解难度,还会增加运行时间和索引空间,因此联合主键的字段个数越少越好。
4.使用主键和外键越多越好
数据库的设计实际上就是定义各种表,以及各种字段之间的关系。这些关系越多,证明这些实体之间的冗余度越低,利用度越高。这样做的好处在于不仅保证了数据表之间的独立性,还能提升相互之间的关联使用率。 - 总结
05丨检索数据:你还在SELECT * 么?
- 思考
- SELECT 查询的基础语法;
- 如何排序检索数据;
- 什么情况下用SELECT*,如何提升 SELECT 查询效率?
- SELECT 查询的基础语法
王者荣耀实战数据表下载
(1).查询列:SELECT name FROM heros
(2).起别名:SELECT name AS n, hp_max AS hm, mp_max AS mm, attack_max AS am, defense_max AS dm FROM heros
(3).查询常数:SELECT '王者荣耀' as platform, name FROM heros
(4).去除重复行:SELECT DISTINCT attack_range FROM heros
(5).排序索引数据:SELECT name, hp_max FROM heros ORDER BY hp_max DESC
(注:默认ASC递增;DESC递减)
(6).约束返回结果数量:SELECT name, hp_max FROM heros ORDER BY hp_max DESC LIMIT 5
- 关键字顺序和执行顺序
1、FROM子句组装数据
2、WHERE子句进行条件筛选
3、GROUP BY分组
4、使用聚集函数进行计算;
5、HAVING筛选分组;
6、计算所有的表达式;
7、SELECT 的字段;
8、ORDER BY排序
9、LIMIT筛选 - 总结
06丨数据过滤:SQL数据过滤都有哪些方法?
- 思考
- 学会使用 WHERE 子句,如何使用比较运算符对字段的数值进行比较筛选;
- 如何使用逻辑运算符,进行多条件的过滤;
- 学会使用通配符对数据条件进行复杂过滤。
- 比较运算符
(1).查询所有生命值在5399到6811之间的英雄:
SELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811
(2).对 heros 表中的 hp_max字段进行空值检查:
SELECT name, hp_max FROM heros WHERE hp_max IS NULL
- 逻辑运算符
(1).最大生命值大于 6000,最大法力大于 1700 的英雄,然后按照最大生命值和最大法力值之和从高到低进行排序:
SELECT name, hp_max, mp_max FROM heros WHERE hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC
(2).查询主要定位或者次要定位是法师或是射手的英雄,同时英雄的上线时间不在 2016-01-01 到 2017-01-01 之间:
FROM heros
WHERE (role_main IN ('法师', '射手') OR role_assist IN ('法师', '射手'))
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC
(3).使用通配符进行过滤:
SELECT name FROM heros WHERE name LIKE '_% 太 %'
- 总结
续~~ 见下一篇