03-MySQL查询语句及其约束

今日内容

  1. DQL:查询语句
    1. 排序查询
    2. 聚合函数
    3. 分组查询
    4. 分页查询

  2. 约束

  3. 多表之间的关系

  4. 范式

  5. 数据库的备份和还原

一、DQL:查询语句

  1. 排序查询
    * 语法:order by 子句
    * order by 排序字段1 排序方式1 , 排序字段2 排序方式2…
    * 排序方式:
    * ASC:升序,默认的。
    * DESC:降序。
    * 注意:
    * 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

  2. 聚合函数:将一列数据作为一个整体,进行纵向的计算。
    1. count:计算个数
    1. 一般选择非空的列:主键
    2. count(*)
    2. max:计算最大值
    3. min:计算最小值
    4. sum:计算和
    5. avg:计算平均值

    注意:聚合函数的计算,排除null值。
    解决方案:

    1. 选择不包含非空的列进行计算
    2. IFNULL函数
  3. 分组查询:

    1. 语法:group by 分组字段;

    2. 注意:

      1. 分组之后,查询(select后接)的字段为:分组字段、聚合函数(写其他字段没有任何的意义)–分组字段必须包含在查询字段内
      2. where 和 having 的区别?
        1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
        2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。

      – 按照性别分组。分别查询男、女同学的平均分
      SELECT sex , AVG(math) FROM student GROUP BY sex;

      – 按照性别分组。分别查询男、女同学的平均分,人数
      SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;

      – 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组
      SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

      – 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人
      SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
      SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;

  4. 分页查询

    1. 语法:limit 开始的索引,每页查询的条数;

    2. 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

      – 每页显示3条记录
      SELECT * FROM student LIMIT 0,3; – 第1页
      SELECT * FROM student LIMIT 3,3; – 第2页
      SELECT * FROM student LIMIT 6,3; – 第3页

    3. limit 是一个MySQL"方言"

      * 实现代码:
      * 排序
      * select * from student order by math -- 排序方式省略;	--排序方式默认升序,asc
      * select * from student order by math desc;		--降序
      * select * from student order by math asc,english desc;		--按照数学成绩升序,如果记录的数学成绩相等
      * 则再按照英语成绩降序排列记录
      * 
      * 聚合函数--将一列数据作为一个整体,进行纵向计算;聚合函数的计算会排除null的值
      * select count(name) from student;
      * select count(ifnull(english,0)) from student;
      * select count(*) from student;  --只要这一行记录有一个列的值不为null,即算一个记录
      * select max(math) from student;
      * select min(math) from student;
      * select sum(math) from student;
      * select avg(math) from student;
      * 
      * 分组(先分组,再运算聚合函数)
      * select sex,avg(math) from student group by sex;	--按性别分组,分别查询男、女平均分
      * select sex,avg(math),count(id) from student group by sex;	 --按性别分组,分别查询男、女同学平均分,人数
      * --分组之前,限定分组的条件,where
      * select sex,avg(math),count(id) from student where math > 70 order by sex;	 --按性别分组,分别查询男、女同学平均分,人数,要求:分数低于70分,不参与分组
      * --分组之后,再对结果集进行限定
      * select sex,avg(math),count(id) from student where math > 70 order by sex having count(id) > 2;	--~,分组之后人数大于2的组才显示
      * 
      * 分页
      * select * from student limit 0,3;	--第一页
      * select * from student limit(当前的页数-1)*每页的数,3;
      
      

二、约束

概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
1. 主键约束:primary key
2. 非空约束:not null
3. 唯一约束:unique
4. 外键约束:foreign key

* 非空约束:not null,某一列的值不能为null
	1. 创建表时添加约束
		CREATE TABLE stu(
			id INT,
			NAME VARCHAR(20) NOT NULL -- name为非空
		);
	2. 创建表完后,添加非空约束
		ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

	3. 删除name的非空约束
		ALTER TABLE stu MODIFY NAME VARCHAR(20);

* 唯一约束:unique,某一列的值不能重复
	1. 注意:
		* 唯一约束可以有NULL值,但是只能有一条记录为null
	2. 在创建表时,添加唯一约束
		CREATE TABLE stu(
			id INT,
			phone_number VARCHAR(20) UNIQUE -- 手机号
		);
	3. 删除唯一约束
		ALTER TABLE stu DROP INDEX phone_number;
	4. 在表创建完后,添加唯一约束
		ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

* 主键约束:primary key。
	1. 注意:
		1. 含义:非空且唯一
		2. 一张表只能有一个字段为主键(中间表设置联合主键除外)
		3. 主键就是表中记录的唯一标识

	2. 在创建表时,添加主键约束
		create table stu(
			id int primary key,-- 给id添加主键约束
			name varchar(20)
		);

	3. 删除主键
		-- 错误 alter table stu modify id int ;
		ALTER TABLE stu DROP PRIMARY KEY;

	4. 创建完表后,添加主键
		ALTER TABLE stu MODIFY id INT PRIMARY KEY;

	5. 自动增长:
		1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长
		2. 在创建表时,添加主键约束,并且完成主键自增长
		注意:自动增长时,下条记录承接上条记录的自动增长值,而不是添漏补缺
		create table stu(
			id int primary key auto_increment,-- 给id添加主键约束
			name varchar(20)
		);
		3. 删除自动增长
		ALTER TABLE stu MODIFY id INT;
		4. 添加自动增长
		ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;


* 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
	1. 在创建表时,可以添加外键
		* 语法:
			create table 表名(
				....
				外键列
				constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
			);

		constraint 外键名称--可省略,系统会自动设置一个外键名 

	2. 删除外键
		ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

	3. 创建表之后,添加外键
		ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
		
	4. 级联操作(实际开发要非常谨慎)
		1. 添加级联操作
			语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 
					FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;
		2. 分类:
			1. 级联更新:ON UPDATE CASCADE 
			2. 级联删除:ON DELETE CASCADE 

	* 实现代码:
		* create table employee(
				id int primary key auto_increment,	--本表的主键
				name varchar(30),
				age int,
				dep_id int,	--声明的与部门表相联系的列,也可以叫外键列
				constraint emp_dep_fk foreign key (dep_id) references department (id)--设置外键,建立该表与其他表的联系
				--外表关联的键通常是外表的主键,因为要保证与外表关联的唯一性,emp_dep_fk外键名,定义了外表的键被本表的外键列引用
			);
		* alter table employee drop foreign key emp_dep_fk;
		* alter table employee add constraint emp_dep_fk foreign key (dep_id) references department (id);
		* 
		* 级联更新、级联删除
		* update employee set dep_id = null where dep_id = 1;
		* 更改本表所引用外表的部门的列-->id=5
		* update employee set dep_id = 5 where dep_id is null;
		* 	
		* 使用级联更新
		* 级联更新:当所引用的外表的关联的表的主键列发生改变时,本表的外键列自动一同更新
		* 外键关系的级联操作(添加外键时,便要设置两表间的级联更新)
		* alter table employee add constraint emp_dep_fk foreign key (dep_id) references department (id) on update cascade;
		* 级联删除:当所引用的外表的关联列删除时,本表相应的关联列记录也自动删除掉
		* alter table employee add constraint emp_dep_fk foreign key (dep_id) references department (id) on delete cascade;
		* 级联更新,级联删除可同时指定在外键关系上
		* ~ on update cascade on delete cascade;

三、数据库的设计

  1. 多表之间的关系

    1. 分类:

      1. 一对一(了解):
        • 如:人和身份证
        • 分析:一个人只有一个身份证,一个身份证只能对应一个人
      2. 一对多(多对一):
        • 如:部门和员工
          分析:一个部门有多个员工,一个员工只能对应一个部门
      3. 多对多:
        * 如:学生和课程
        * 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
    2. 实现关系:

      1. 一对多(多对一):
        • 如:部门和员工
        • 实现方式:在多的一方建立外键,指向一的一方的主键。
      2. 多对多:
        • 如:学生和课程
        • 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
      3. 一对一(了解):
        • 如:人和身份证
          实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。外键添加唯一约束
    3. 案例

       -- 创建旅游线路分类表 tab_category
       -- cid 旅游线路分类主键,自动增长
       -- cname 旅游线路分类名称非空,唯一,字符串 100
       CREATE TABLE tab_category (
       	cid INT PRIMARY KEY AUTO_INCREMENT,
       	cname VARCHAR(100) NOT NULL UNIQUE
       );
       
       -- 创建旅游线路表 tab_route
       /*
       rid 旅游线路主键,自动增长
       rname 旅游线路名称非空,唯一,字符串 100
       price 价格
       rdate 上架时间,日期类型
       cid 外键,所属分类
       */
       CREATE TABLE tab_route(
       	rid INT PRIMARY KEY AUTO_INCREMENT,
       	rname VARCHAR(100) NOT NULL UNIQUE,
       	price DOUBLE,
       	rdate DATE,
       	cid INT,
       	FOREIGN KEY (cid) REFERENCES tab_category(cid)
       );
       
       /*创建用户表 tab_user
       uid 用户主键,自增长
       username 用户名长度 100,唯一,非空
       password 密码长度 30,非空
       name 真实姓名长度 100
       birthday 生日
       sex 性别,定长字符串 1
       telephone 手机号,字符串 11
       email 邮箱,字符串长度 100
       */
       CREATE TABLE tab_user (
       	uid INT PRIMARY KEY AUTO_INCREMENT,
       	username VARCHAR(100) UNIQUE NOT NULL,
       	PASSWORD VARCHAR(30) NOT NULL,
       	NAME VARCHAR(100),
       	birthday DATE,
       	sex CHAR(1) DEFAULT '男',
       	telephone VARCHAR(11),
       	email VARCHAR(100)
       );
       
       /*
       创建收藏表 tab_favorite
       rid 旅游线路 id,外键
       date 收藏时间
       uid 用户 id,外键
       rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
       */
       CREATE TABLE tab_favorite (
       	rid INT, -- 线路id
       	DATE DATETIME,
       	uid INT, -- 用户id
       	-- 创建复合主键
       	PRIMARY KEY(rid,uid), -- 联合主键
       	FOREIGN KEY (rid) REFERENCES tab_route(rid),
       	FOREIGN KEY(uid) REFERENCES tab_user(uid)
       );
      
  2. 数据库设计的范式

    • 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
      设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
      目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
    • 几个概念:
      1. 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
        例如:学号–>姓名。 (学号,课程名称) --> 分数
      2. 完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
        例如:(学号,课程名称) --> 分数 学号,课程名缺一不可
      3. 部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
        例如:(学号,课程名称) – > 姓名 单单学号就可以确定姓名
      4. 传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
        例如:学号–>系名,系名–>系主任
      5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
        例如:该表中码为:(学号,课程名称)
        • 主属性:码属性组中的所有属性
        • 非主属性:除过码属性组的属性
        • 通过码可以确定其他任意的非码属性
    • 分类:
      1. 第一范式(1NF):每一列都是不可分割的原子数据项
      2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
        • 非码的属性(非码内任意属性)完全函数依赖于码属性,而不能非码属性部分的依赖于码属性里的某个属性
        • 码与非码两者的属性或属性组,只能是完全函数依赖,不能有部分函数依赖
      3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
        • 消除第二范式中的传递依赖:学号–>系名,系名–>系主任

拆分一张表,拆开里面的各个项,到多张表中,某些项可以在多个表复用,
先确定一个表所能有的所有项,再对该表按第一、第二、第三范式依次才分,直到这些表满足第三范式为止
具体细节详见学生信息表

四、数据库的备份和还原

文件夹的复制(数据库中的表,数据,其实也就是一系列sql语句)

  1. 命令行:
    • 语法:

    • 备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径

    • 还原:

      1. 登录数据库
      2. 创建数据库
      3. 使用数据库
      4. 执行文件:source 文件路径
    • 实现代码:
      * 备份
      * mysqldump -uroot -proot db1 > d://a.sql
      *
      * 删库
      * show databases;
      * drop database db1;
      *
      * 还原
      * create database db1;–也可以叫其他数据库名
      * use db1;
      * source d://a.sql;

  2. 图形化工具:导出数据库的备份文件.sql文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值