MySQL入门

第二章 建模和设计数据库

数据库设计过程

  • 需求分析:确定并记下需要从数据库中获取的内容,将存储哪些数据,以及数据项之间的相互关系。
  • 概念设计:将需求提炼成数据库设计的正式描述。
  • 逻辑设计:将数据库设计映射到现有的数据库管理系统和数据库表上。

实体关系模型

代表实体

  • 通常使用数据库来存储实体的特定特征或属性;
  • 属性描述它们所属的实体;
  • 对于给定实体,某些属性可以有多个值;
  • 属性有助于将一个实体与同类型的其他实体区分开;
  • 识别属性形成唯一键,此时我们称之为主键;
  • 属性值是从合法值的域中选择的;
  • 属性可以为空,但实体的主键绝不能是未知的。

代表关系

  • 实体可以参与与其他实体的关系;
  • 与实体一样,关系也可以具有属性;
  • 关系有一对一、一对多和多对多三种。

部分和全部参与

实体之间的关系可以是可选的,也可以是强制性的。

实体还是属性?
实体还是关系?

将需求中的名词映射到实体,并将谓词映射到关系。

中间实体

通常可以在概念上简化多对多关系,方法是将其替换为新的中间实体(有时称为关联实体),并通过多对一和一对多关系连接原始实体。

弱实体和强实体

弱实体与客户实体的关系称为识别关系。弱实体完全参与识别关系,因为它们不能独立于其拥有的实体存在于数据库中;
弱实体在其拥有(或强)实体的上下文中是唯一标识的,因此弱实体的完整键是其自己的(部分)键与其所属实体的键的组合。

数据库规范化

第一范式(1NF)的目标(无重复组):

  • 消除单个表中的重复组;
  • 为每组相关数据创建一个单独的表;
  • 使用主键标识每组相关数据。

如果关系包含复合或多值属性,则它违反了第一范式。相反,如果关系不包含任何复合或多值属性,则该关系为第一范式。因此,如果关系中的每个属性都具有适当类型的单个值,则该关系为第一范式。

第二范式(2NF)的目标(消除冗余数据):

  • 为应用于多个记录的值的集创建单独的表;
  • 将这些表与外键相关联。

记录不应依赖于表的主键(如果必要,复合键)以外的任何内容。

第三范式(3NF)增加了一个目标:

  • 消除不依赖于键的字段。

记录中不属于该记录键部分的值不属于该表。通常,每当一组字段的内容可能应用于表中的多个记录时,您都应考虑将这些字段放在单独的表中。

实体关系建模示例

将sakila数据库导入MySQL:
下载压缩包sakila
在C盘根目录下新建文件夹temp,将解压后的文件夹放入temp中,打开cmd启动并登录MySQL,输入以下命令:
SOURCE C:/temp/sakila-db/sakila-schema.sql
SOURCE C:/temp/sakila-db/sakila-data.sql
sakila还提供了EER模型,在sakila.mwb文件中,使用MySQL工作台打开该文件:

使用实体关系模型

将实体和关系映射到数据库表

将实体映射到数据库表
  • 对于每个强实体,创建一个包含其属性的表并指定主键。
  • 对于每个弱实体,创建一个包含其属性并包括其所属实体的主键的表。
  • 对于每个实体的多值属性,创建一个包含实体主键和属性的表。
将关系映射到数据库表
  • 两个实体之间的每个一对一关系都将一个实体的主键作为属于另一个实体的表中的外键包括在内。如果一个实体完全参与关系,请将外键放在其表中;如果两者都完全参与关系,请考虑将它们合并到一个表中。
  • 对于两个实体之间每个无法识别的一对多关系,将“1”端实体的主键作为“N”端实体表中的外键。将表中关系的任何属性与外键一起添加。注意标识一对多关系(弱实体与其所属实体之间的关系)是作为实体映射阶段的一部分进行捕获。
  • 对于两个实体之间的每个多对多关系,创建一个包含每个实体的主键作为主键的新表,并添加该关系的任何属性。此步骤有助于识别中间实体。
  • 对于涉及两个以上实体的每个关系,使用所有参与实体的主键创建一个表,并添加任何关系属性。

第三章 SQL基础

使用 sakila 数据库

选择sakila数据库作为当前数据库,使用以下语句:
USE sakila;

使用SELECT DATABASE();命令来检查哪个是活动数据库:

使用以下语句探索哪些表组成了数据库:
SHOW TABLES;

使用以下语句来浏览表:
SHOW COLUMNS FROM actor;

DESCRIBE关键字与SHOW COLUMNS FROM相同,我们可以将其缩写为DESC,因此可以按如下方式编写上一个查询:
DESC actor;

通过执行DESC语句来浏览city表:
DESC city;

重要的是熟悉每个表中的列,以后会经常使用。

SELECT 语句和基本查询技术

Single-Table SELECTs

最基本的SELECT形式是从表中读取所有行和列中的数据。使用命令行连接到MySQL并选择sakila数据库:
USE sakila;
检索language表中的所有数据:
SELECT * FROM language;

简单SELECT语句有四个组件:

  1. 关键字SELECT;
  2. 要显示的列,(*)符号是表示所有列的通配符;
  3. 关键字FROM;
  4. 表名。
    尝试另一个简单的SELECT,从city表中检索所有列:
    SELECT * FROM city;
    ···
    有600个城市,输出的基本结构与第一个示例中的基本结构相同。

选择列

如果不想显示所有列,则很容易通过按所需顺序列出所需的列(用逗号分隔)来更具体。例如,如果只需要city表中的city列,则需要键入:
SELECT city FROM city;

如果同时需要city和city_id列,按照该顺序可以使用:
SELECT city, city_id FROM city;

甚至可以多次列出列:
SELECT city, city FROM city;

可以在语句中指定数据库、表和列名。例如,假设要从sakila数据库中的language表中检索name列,可以使用以下命令执行此操作:
SELECT name FROM sakila.language;

使用 WHERE 子句选择行

SELECT * FROM sakila.language WHERE name = 'English';

假设要找出actor表中值为actor_id=4的参与者的名字,将输入:
SELECT first_name FROM actor WHERE actor_id = 4;

如果值与多行匹配,则结果将包含所有匹配项。假设要查看属于巴西country_id=15的所有城市,将输入:
SELECT city FROM city WHERE country_id = 15;

对于数字,常用运算符为等于(=)、大于(>)、小于(<)、小于等于(<=)、大于等于(>=),不等于(!=)
对字符串使用相同的运算符,默认情况下,字符串比较不区分大小写,并使用当前字符集:
SELECT first_name FROM actor WHERE first_name < 'B';

不区分大小写
寻找一部电影,标题包含family这个词:
SELECT title FROM film WHERE title LIKE '%family%';

如果要在子句中只匹配一个通配符,请使用下划线字符(_)。例如,如果要所有姓名以NAT三个字母开头的演员主演的电影的标题,请使用:
SELECT title FROM film_list WHERE actors LIKE 'NAT_%';

通常,应避免在模式的开头使用百分比(%)通配符,如以下示例所示:
SELECT title FROM film WHERE title LIKE '%day%';
会获得结果,但MySQL在这种情况下不会使用索引。使用通配符将强制MySQL读取整个表以检索结果,如果表具有数百万行,则可能会导致严重的性能影响。

将条件与AND、OR、NOT和XOR相结合:
到目前为止,我们已经使用WHERE子句来测试一个条件,并返回满足它的所有行。可以使用布尔运算符AND、OR、NOT和XOR来组合两个或多个条件。
SELECT title FROM film_list WHERE (category like 'Sci-Fi'OR category LIKE 'Family') AND rating LIKE 'PG';

假设要获取FID小于7的所有电影标题的列表,但不是编号为4或6的电影标题,可以使用以下查询执行此操作:
SELECT fid,title FROM film_list WHERE FID < 7 AND NOT (FID = 4 OR FID = 6);

运算符优先级(由高到低,同行优先级相同):

ORDER BY子句

在关系数据库中,表中的行形成一个集合,行之间没有内在顺序,因此,如果我们希望以特定顺序对结果进行排序,则必须要求MySQL对结果进行排序,可使用ORDER BY子句来执行此操作。排序不会影响返回的内容,它只影响结果的返回顺序。
假设您要返回sakila数据库中前10个客户的列表,按name字母顺序排序,如下:

SELECT name FROM customer_list
ORDER BY name
LIMIT 10;

可以将排序与两个或多个列复合。例如,假设希望按字母顺序对地址进行排序,但按地区分组:

SELECT address, district FROM address
ORDER BY district, address;

···

升序ASC,降序DESC

限制条款

SELECT name FROM customer_list LIMIT 10;

LIMIT子句可以有两个参数。在这种情况下,第一个参数指定要返回的第一行,称为偏移量;第二个参数指定要返回的最大行数。
假设想要五行,但要跳过前五行,这意味着结果将从第六行开始。从0开始的偏移量,可以按如下方式执行此操作:
SELECT name FROM customer_list LIMIT 5, 5;

OFFSET语法丢弃其中指定的N个值,LIMIT 10 OFFSET 5代替 LIMIT 5, 10,即6~15行。

连接两个表

INNER JOIN语法将两个或多个表中的数据汇集在一起。

SELECT city, country FROM city INNER JOIN country
ON city.country_id = country.country_id
WHERE country.country_id < 5`
ORDER BY country, city;

SELECT city, country FROM city
INNER JOIN country using (country_id)
WHERE country.country_id < 5
ORDER BY country, city;

查询结果相同。

插入语句

INSERT语句用于向表中添加新数据。
插入数据通常发生在两种情况下:在创建数据库时大批量加载数据时;在使用数据库时临时添加数据时。
SHOW COLUMNS FROM language;

为葡萄牙语语言添加一个新行,最常见的是让MySQL填充language_id的默认值,操作如下:
INSERT INTO language VALUES (NULL, 'Portuguese', NOW());
如果我们现在在表上执行一个SELECT,我们将看到MySQL插入了该行:
SELECT * FROM language;

第二个方法是手动插入language_id列的值。现在我们已经有七种语言,我们应该使用8作为language_id的下一个值,操作如下:
SELECT MAX(language_id) FROM language;

INSERT INTO language VALUES (8, 'Russian', '2020-09-26 10:35:00');,插入后执行看到:

删除语句

DELETE语句用于从表中删除一行或多行。
最简单的用法是删除表中的所有行。假设要清空rental表,可以使用以下命令执行此操作:

DELETE FROM rental;
SELECT * FROM rental;

DELETE FROM rental WHERE rental_id < 10;是删除与条件匹配的9行。
TRUNCATE删除payment表中所有数据:操作为TRUNCATE TABLE payment;

更新声明

UPDATE语句用于更改数据。
假设需要通过为所有付款添加 10% 来更新payment表的amount列,操作如下:
UPDATE payment SET amount=amount*1.1;
忘记更新last_update状态,若要使其与预期的数据库模型一致,可以通过运行以下语句来解决此问题:
UPDATE payment SET last_update='2021-02-28 17:53:00';
UPDATE payment SET last_update=NOW();

使用SHOW和mysqlshow探索数据库和表

列出可以访问的数据库:SHOW DATABASES;

仅查看名称以s开头的数据库:SHOW DATABASES LIKE 's%';

列出sakila数据库中的表:SHOW TABLES FROM sakila;

MySQL入门:建模和设计数据库,SQL基础相关推荐

  1. php学生成绩管理系统,数据库使用MySQL,包括源代码和数据库SQL文件,具有学生和教师登录管理功能

    php学生成绩管理系统,数据库使用MySQL,包括源代码和数据库SQL文件,具有学生和教师登录管理功能 数据库SQL文件 /*Navicat Premium Data TransferSource S ...

  2. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  3. Mysql入门学习第二章(学习sql语句)

    SQL学习(重要) SQL SQL是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.(用人话说就是通过程序能看懂的方式告诉mysql程序怎么做) ...

  4. 用MySQL语句为SC定义主码_珍藏的数据库SQL基础练习题答案

    一,基本表的定义与删除. 题1: 用SQL语句创建如下三张表:学生(Student),课程表(Course),和学生选课表(SC),这三张表的结构如表1-1到表1-3所示. 表1-1 Student表 ...

  5. mysql综合查询索引优化_MySQL数据库SQL优化之确定问题使用索引提高查询效率

    在EXPLAIN分析SQL中,已经可以确定是对客户表customet的全表扫描导致效率的不理想,那么对客户表customer的email字段创建索引,具体如下: mysql> create in ...

  6. 【黄啊码】MySQL入门—14、细说数据库的MVCC机制

    大家好,我是黄啊码.上一篇文章中,我们讲到了锁的划分,以及乐观锁和悲观锁的思想.今天我们就来看下 MVCC,它就是采用乐观锁思想的一种方式.那么它到底有什么用呢? 我们知道事务有 4 个隔离级别,以及 ...

  7. mysql select内部原理_数据库SQL SELECT查询的工作原理

    作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库.一般开发员只会应用SQL的四条经典语句:select,insert,delete,update.以至于从来没有研究过它们的工作原理,在这 ...

  8. 数据库SQL基础语法

    一. 数据完整性 数据完整性是为了保证插入到数据库中的数据是正确的,防止用户可能的错误输入. 数据完整性分为实体完整性.域完整性.参照完整性. 2.1实体(行)完整性 (实体完整性中的实体指的是表中的 ...

  9. 阿里云入门教程搭建云数据库SQL Server

    小白阿里云入门教程 阿里云应用教程 小白阿里云入门教程 购买阿里云服务器 连接远程服务器 VS连接云数据库 购买阿里云服务器 学生可免费获取六个月服务器 连接远程服务器 1,打开云服务器ECS 1,重 ...

最新文章

  1. 关系数据库是如何工作的
  2. 自定义线程池-java内置线程池构造方法介绍
  3. Java学习小程序(9)冒泡排序算法实现
  4. 介绍一个修改 Visual Studio Code 侧边框颜色的扩展 Peacock
  5. 控制台程序隐藏方法总结(四种)
  6. linux shell 高级编程,shell高级编程
  7. c++ 舞伴配对问题_R绘图:配对样本差异表达作图ggpubr
  8. eplan安装提示没有安装许可语言_CAD和EPLAN!电气制图你会选择哪个?
  9. 面试必备之为什么重写equals必须重写hashcode
  10. 内存释放_把微信这两个开关关掉, 手机立马释放大量内存, 快去试试吧
  11. 身处小公司,如何在2年内快速突破,拿到大厂offer?
  12. 机器学习第六回(完结篇)
  13. 利用JS代码批量自动取消抖音所有关注
  14. 【Python游戏】用Python实现一个2048小游戏 | 附带源码
  15. Internet信息服务(IIS)管理器--IIS部署发布网站
  16. freyja2多数据源版本
  17. Java 随笔 IO
  18. 杂志风城市夜景PPT模板
  19. matlab pcm encode,[MATLAB基础] PCM编码及解码
  20. sensor_msgs/BatteryState Message

热门文章

  1. HTC平板电脑会创造与iPad的不同价值
  2. linux route输出分析,Traceroute原理分析
  3. 静态代码块和普通代码块的区别
  4. MBA关注:长期太忙或太穷人会变傻
  5. 女生做大数据有发展前景吗?
  6. vue android 4.4兼容,vue cli3 打包兼容Android 4.4
  7. 超链接的hideFocus属性
  8. ARM-CP15寄存器组介绍(开启I/D catch,MMU都需要此寄存器)
  9. vs出现错错误main.obj:error LNK2001:unresolved external symbol
  10. cydia无法安装插件