day27_mysql表的查询和约束丶数据库设计常识

DQL 查询表中的数据

查询不会对数据库中的数据进行修改.只是一种显示数据的方式

简单查询

语法:

  • SELECT 列名 FROM 表名 [WHERE 条件表达式]

 详解:

  • SELECT 命令可以读取一行或者多行记录。
  • 你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
查询表所有行和列的数据

使用*表示所有列

语法:

  • SELECT * FROM 表名;

举例:

查询指定列

查询指定列的数据,多个列之间以逗号分隔

语法:
  • SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;

举例:

指定列的别名进行查询

使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。 

对列指定别名 

语法:

  • SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名; 

举例:

对列和表同时指定别名
语法
  • SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名; 

举例

清除重复值

查询指定列并且结果不出现重复数据

语法

  • SELECT DISTINCT 字段名 FROM 表名; 

举例:

查询结果参与运算

某列数据和固定值运算
语法:
  • SELECT 列名 1 + 固定值 FROM 表名; 

举例:

某列数据和其他列数据参与运算 

语法

  • SELECT 列名 1 + 列名 2 FROM 表名; 
注意: 参与运算的必须是数值类型

举例:

注意:

  • 因为null参与的运算,计算结果都为null,MySQL语句中提供函数ifnull(表达式1,表达式2):来解决这个问题。表达式1:哪个字段需要判断是否为null,如果该字段为null后的替换值。

条件查询 

如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤

条件查询的语法 

  • SELECT 字段名 FROM 表名 WHERE 条件;

语法流程:取出表中的每条数据,满足条件的记录就返回

运算符

逻辑运算符 

in 关键字 

范围查询

举例:

like 关键字

MySQL 通配符 

举例:

排序查询

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

语法:

  • SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];

tips:

  • ASC: 升序,默认值
  • DESC: 降序
单列排序

只按某一个字段进行排序,单列排序。

组合排序

同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推。

组合排序的语法:

  • SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC];

举例:

聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值 NULL。

五个聚合函数

  • max(列名):求这一列的最大值
  • min(列名):求这一列的最小值
  • avg(列名):求这一列的平均值
  • count(列名):统计这一列有多少条记录
  • sum(列名):对这一列求总和
语法:
  • SELECT 聚合函数(列名) FROM 表名;

举例:

我们发现对于 NULL 的记录不会统计,建议如果统计个数则不要使用有可能为 null 的列,但如果需要把 NULL也统计进去呢?

解决办法:

  • IFNULL(列名,默认值)  如果列名不为空,返回这列的值。如果为 NULL,则返回默认值。
我们可以利用 IFNULL()函数,如果记录为 NULL,给个默认值,这样统计的数据就不会遗漏

举例:

分组查询

分组查询是指使用 GROUP BY 语句对查询信息进行分组,相同数据作为一组
语法
  • SELECT 字段 1,字段 2... FROM 表名 GROUP BY 分组字段 [HAVING 条件]; 
GROUP BY 怎么分组的?将分组字段结果中相同内容作为一组,如按性别将学生分成 2 组。GROUP BY 将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
注意:
  • 当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的

 举例:

 

having 与 where 的区别

 例如:

分页查询

limit 的作用:

LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记录的条数

语法(MySQL方言)

  • SELECT *|字段列表 [as 别名] FROM 表名 [WHERE 子句] [GROUP BY 子句][HAVING 子句][ORDER BY 子句][LIMIT 子句];
LIMIT 语法格式:
  • offset:起始行数,从 0 开始计数,如果省略,默认就是 0
  • length: 返回的行数
  • 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
LIMIT 的使用场景:
分页:比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。 假设我们每页显示 5 条记录的方式来分页。

举例:

数据库表的约束

约束的作用:

  • 对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。

约束种类:

非空约束

什么是非空约束:某一列不能为 null。
非空约束关键字:NOT NULL; 

非空约束的基本语法格式

  • 字段名 字段类型 NOT NULL 

创建表时添加约束

语法:

create table 表名(

  字段名称 字段类型 NOT NULL, --- 这个字段添加了非空约束

   .....

);

举例:

创建表完后,添加非空约束

语法:

  • ALTER TABLE 表名 MODIFY 字段名称 字段类型 NOT NULL;

举例:

 删除name的非空约束

语法:

  • ALTER TABLE stu MODIFY字段名称 字段类型;

举例:

唯一约束

什么是唯一约束: 表中某一列不能出现重复的值
唯一约束关键字:UNIQUE

唯一约束的基本语法格式

  • 字段名 字段类型 UNIQUE 

注意:

  • 唯一约束可以有NULL值,但是只能有一条记录为null

在创建表时,添加唯一约束

语法:

CREATE TABLE 表名(
  字段名称 字段类型,
  字段名称 字段类型,UNIQUE -- 手机号
);

举例:

删除唯一约束

语法:

  • ALTER TABLE 表名 DROP INDEX 字段名称;

举例:

在表创建完后,添加唯一约束

只要表中没有相同数据,才能使用这种方式添加唯一约束

语法:

  • ALTER TABLE 表名 MODIFY 字段名称 字段类型 UNIQUE;

 举例:

主键约束

主键关键字: primary key
主键的作用
  • 用来唯一标识数据库中的每一条记录
主键的特点:
  • 非空 not null
  • 唯一
创建主键方式:

在创建表的时候给字段添加主键

语法:
  • 字段名 字段类型 PRIMARY KEY

举例:

删除主键
语法
  • alter table 表名 drop primary key;

举例

在已有表中添加主键
如果这个字段有重复或者null值,则添加主键失败
语法:
  • ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

举例:

主键自增

主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值 

语法:
  • AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型) 

创建主键,并且添加自动增长

语法:

CREATE TABLE 表名(
  列名 int primary key AUTO_INCREMENT
)
 
修改自增长的默认值起始值
默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL 语法

创建表时指定起始值

语法:

CREATE TABLE 表名(
  列名 int primary key AUTO_INCREMENT
) AUTO_INCREMENT=起始值;

举例:

创建好表以后修改起始值
语法:
  • ALTER TABLE 表名 AUTO_INCREMENT=起始值; 

举例:

删除自动增长

语法:

  • ALTER TABLE 表名 MODIFY 字段名称 字段类型;

举例:

小结:

  • 主键数在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列。
  • 自增长只能用在主键上

外键约束

  • 什么是外键:在从表中与主表主键对应的那一列。
  • 主表: 一方,用来约束别人的表
  • 从表: 多方,被别人约束的表
创建外键约束

新建表时增加外键: 

语法:

  • [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) 

举例:

已有表增加外键:

语法:
  • ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名); 

举例:

删除外键 

语法:
  • ALTER TABLE 从表 drop foreign key 外键名称; 

举例:

外键的级联 

什么是级联操作:
  • 在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作

 举例:

数据约束小结

数据库的设计

表与表之间的关系 

表关系的概念
现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系! 

一对一

一对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。 
两种建表原则: 

一对多

  • 一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品
  • 一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

多对多

  • 多对多(m:n) 例如:老师和学生,学生和课程,用户和角色
  • 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键
表与表之间的关系小结

数据范式

什么是范式:

好的数据库设计对数据的存储性能和后期的程序开发,都会产生重要的影响。建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。

三大范式:

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。 

1NF 

概念:
  • 数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简而言之,第一范式每一列不可再拆分,称为原子性。 

总结:每一列都不可再次拆分

示例:

2NF 

概念:
在满足第一范式的前提下,表中的每一个字段都完全依赖于主键。所谓完全依赖是指不能存在仅依赖主键一部分的列。简而言之,第二范式就是在第一范式的基础上所有列完全依赖于主键列。当存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在这样的属性,它只依赖于其中一个列,这就是不符合第二范式。
第二范式的特点:
  • 一张表只描述一件事情。
  • 表中的每一列都完全依赖于主键

示例:

3NF:

概念:
在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其它的列来间接依赖于主键。简而言之,第三范式就是所有列不依赖于其它非主键列,也就是在满足 2NF 的基础上,任何非主列不得传递依赖于主键。所谓传递依赖,指的是如果存在"A → B → C"的决定关系,则 C 传递依赖于 A。因此,满足第三范式的数据库表应该不存在如下依赖关系:主键列 → 非主键列 x → 非主键列 y

示例:学生信息表

三大范式小结: 

数据库备份和还原 

备份的应用场景
在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。
备份与还原的语句

备份格式: DOS 下,未登录的时候。这是一个可执行文件 exe,在 bin 文件夹

语法:

  • mysqldump -u 用户名 -p 密码 数据库 > 文件的路径

举例:

还原格式:mysql 中的命令,需要登录后才可以操作
  • USE 数据库;
  • SOURCE 导入文件的路径;

步骤

  1. 删除 day21 数据库中的所有表
  2. 登录 MySQL
  3. 选中数据库
  4. 使用 SOURCE 命令还原数据
  5. 查看还原结果 

图形化界面备份与还原 

备份数据库中的数据
  1. 选中数据库,右键 ”备份/导出”
  2. 指定导出路径,保存成.sql 文件即可。

 

还原数据库中的数据 
  1. 删除数据库
  2. 数据库列表区域右键“执行 SQL 脚本”, 指定要执行的 SQL 文件,执行即可

 

猜你喜欢

转载自www.cnblogs.com/wurengen/p/12300529.html