MySQL学习笔记(三)

1 数据约束

1.1什么数据约束

对用户操作表的数据进行约束

1.2 默认值

作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。

注意:

1)对默认值字段插入null是可以的。

2)对默认值字段可以插入非null


-- 1.1 默认值

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

address VARCHAR(20) DEFAULT ‘山东淄博‘  -- 默认值

)

DROP TABLE student;

-- 当字段没有插入值的时候,mysql自动给该字段分配默认值

INSERT INTO student(id,NAME) VALUES(1,‘张三‘);

-- 注意:默认值的字段允许为null

INSERT INTO student(id,NAME,address) VALUE(2,‘李四‘,NULL);

INSERT INTO student(id,NAME,address) VALUE(3,‘王五‘,‘山东淄博‘);

1.3 非空

作用: 限制字段必须赋值

注意:

1)非空字符必须赋值

2)非空字符不能赋null


-- 1.2 非空

-- 需求: gender字段必须有值(不为null)

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

gender VARCHAR(2) NOT NULL -- 非空

)

-- 非空字段必须赋值

INSERT INTO student(id,NAME) VALUES(1,‘李四‘);

-- 非空字符不能插入null

INSERT INTO student(id,NAME,gender) VALUES(1,‘李四‘,NULL);

1.4 唯一

作用: 对字段的值不能重复

注意:

1)唯一字段可以插入null

2)唯一字段可以插入多个null


-- 1.3 唯一

CREATE TABLE student(

id INT UNIQUE, -- 唯一

NAME VARCHAR(20)

)

INSERT INTO student(id,NAME) VALUES(1,‘zs‘);

INSERT INTO student(id,NAME) VALUES(1,‘lisi‘); -- ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘id‘

INSERT INTO student(id,NAME) VALUES(2,‘lisi‘);

1.5 主键

作用: 非空+唯一

注意:

1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。

2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。


-- 1.4 主键(非空+唯一)

DROP TABLE student;

CREATE TABLE student(

id INT PRIMARY KEY, -- 主键

NAME VARCHAR(20)

)

INSERT INTO student(id,NAME) VALUES(1,‘张三‘);

INSERT INTO student(id,NAME) VALUES(2,‘张三‘);

-- INSERT INTO student(id,NAME) VALUES(1,‘李四‘); -- 违反唯一约束: Duplicate entry ‘1‘ for key ‘PRIMARY‘

-- insert into student(name) value(‘李四‘); -- 违反非空约束: ERROR 1048 (23000): Column ‘id‘ cannot be null

1.6 自增长

作用: 自动递增


-- 1.5 自增长

CREATE TABLE student(

id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从0开始  ZEROFILL 零填充

NAME VARCHAR(20)

)

-- 自增长字段可以不赋值,自动递增

INSERT INTO student(NAME) VALUES(‘张三‘);

INSERT INTO student(NAME) VALUES(‘李四‘);

INSERT INTO student(NAME) VALUES(‘王五‘);

SELECT * FROM student;

-- 不能影响自增长约束

DELETE FROM student;

-- 可以影响自增长约束

TRUNCATE TABLE student;

1.7 外键

作用:约束两种表的数据

出现两种表的情况:

解决数据冗余高问题: 独立出一张表

例如: 员工表  和  部门表

问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!

使用外键约束:约束插入员工表的部门ID字段值

解决办法: 在员工表的部门ID字段添加一个外键约束


-- 部门表(主表)

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

-- 修改员工表(副表/从表)

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)

--           外键名称                  外键               参考表(参考字段)

)

注意:

1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

2)主表的参考字段通用为主键!

3)添加数据: 先添加主表,再添加副表

4)修改数据: 先修改副表,再修改主表

5)删除数据: 先删除副表,再删除主表

 


-- 1.6 外键约束

-- 员工表

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptName VARCHAR(20) -- 部门名称

)

INSERT INTO employee VALUES(1,‘张三‘,‘软件开发部‘);

INSERT INTO employee VALUES(2,‘李四‘,‘软件开发部‘);

INSERT INTO employee VALUES(3,‘王五‘,‘应用维护部‘);

SELECT * FROM employee;

-- 添加员工,部门名称的数据冗余高

INSERT INTO employee VALUES(4,‘陈六‘,‘软件开发部‘);

-- 解决数据冗余高的问题:给冗余的字段放到一张独立表中

-- 独立设计一张部门表

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

DROP TABLE employee;

-- 修改员工表

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE  -- ON CASCADE UPDATE :级联修改

--           外键名称                  外键               参考表(参考字段)

)

INSERT INTO dept(id,deptName) VALUES(1,‘软件开发部‘);

INSERT INTO dept(id,deptName) VALUES(2,‘应用维护部‘);

INSERT INTO dept(id,deptName) VALUES(3,‘秘书部‘);

INSERT INTO employee VALUES(1,‘张三‘,1);

INSERT INTO employee VALUES(2,‘李四‘,1);

INSERT INTO employee VALUES(3,‘王五‘,2);

INSERT INTO employee VALUES(4,‘陈六‘,3);

-- 问题: 该记录业务上不合法,员工插入了一个不存在的部门数据

INSERT INTO employee VALUES(5,‘陈六‘,4); -- 违反外键约束: Cannot add or update a child row: a foreign key constraint fails (`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))

-- 1)当有了外键约束,添加数据的顺序: 先添加主表,再添加副表数据

-- 2)当有了外键约束,修改数据的顺序: 先修改副表,再修改主表数据

-- 3)当有了外键约束,删除数据的顺序: 先删除副表,再删除主表数据

-- 修改部门(不能直接修改主表)

UPDATE dept SET id=4 WHERE id=3;

-- 先修改员工表

UPDATE employee SET deptId=2 WHERE id=4;

-- 删除部门

DELETE FROM dept WHERE id=2;

-- 先删除员工表

DELETE FROM employee WHERE deptId=2;

SELECT * FROM dept;

SELECT * FROM employee;

1.8 级联操作

问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!

级联修改: ON UPDATE CASCADE

级联删除: ON DELETE CASCADE


CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE  -- ON CASCADE UPDATE :级联修改

--           外键名称                  外键               参考表(参考字段)

)

注意: 级联操作必须在外键基础上使用


-- 级联修改(修改)

-- 直接修改部门

UPDATE dept SET id=5 WHERE id=4;

-- 级联删除

-- 直接删除部门

DELETE FROM dept WHERE id=1;

2 连接查询(多表查询)

2.1基本含义

连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。

实际上,两个表的完全的连接是这样的一个过程:

左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。

注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。

2.2连接语法的基本形式

from 表1  [连接方式]  join 表2  [on 连接条件];

连接的结果可以当作一个“表”来使用。常用有以下几种连接方式:

2.3交叉连接:

实际上,交叉连接是将两个表不设定任何条件的连接结果。

交叉连接通常也被叫做“笛卡尔积”——数学上可能比较多。

语法:

from  表1  [cross]  join  表2  ; //可见交叉连接只是没有on条件而已。

cross这个词也可以省略,还可以使用inner这个词代替

表1:

表2:

交叉:

2.4内连接:

语法:

from  表1  [inner]  join  表2  on  表1.字段1=表2.字段2;

含义:找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行。

分析交叉连接的“无意义性”,以及内连接的“有意义性”:

先看交叉连接:

再看内连接:

可见,在现实的常见需求中,上述内连接的结果就都是“有意义”的数据了。

也可以指定只列出其中部分字段:

SELECT t1.pro_id, pro_name, price, t2.protype_name FROM product as t1 join `product_type` as t2 on t1.protype_id=t2.protype_id WHERE 1

结果为:

2.5左[外]连接:

形式:

from  表1  left  [outer]  join   表2   on  连接条件。

说明:

1,这里,left是关键字。

2,连接条件跟内连接一样。

3,含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。

则左连接结果为:

2.6右[外]连接:

右连接跟左连接恰恰相反:

形式:

from  表1  right  [outer]  join   表2   on  连接条件。

说明:

1,这里,right是关键字。

2,连接条件跟内连接一样。

3,含义是:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。

2.7全[外]连接:

形式:

from  表1  full  [outer]  join  表2  on  连接条件;

说明:

1,含义:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。

2,mysql中其实不认识全[外]连接语法,即mysql这个软件本身不支持全连接的语法。

3,此概念在其他数据库有的存在,了解就可以。

2.8连接查询举例:

原始数据:

1:找出索尼4G手机所属类别名称:

2,找出所有属于手机数码的产品:

3.什么叫子查询

子查询就是把一个查询的结果当作另一个查询的条件。

使用in子查询

in的基本语法形式为:

where  操作数  in (值1,值2, ....)

则in子查询就是:

where  操作数  in ( 列子查询 );

含义:

表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件。

举例:

找出所有带“电”字的类别的产品

第一步:找出所有带“电”字的类别ID:

第二步:根据结果找出这些类别的产品:

select * from product  where  protype_id in (1, 3);  ==〉

select * from product  where  protype_id in (

select protype_id from product_type where protype_name like ‘%电%‘

);

 

4.联合查询

联合查询的关键字是: union

基本含义

联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”。

两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。

语法形式:

select 语句1

union  [ALL | DISTINCT]

select 语句2;

说明:

1,两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义。

2,结果集中的字段以第一个select语句的字段为准。

3,第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名。

4,联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些“ALL”。

5,如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:

(select 语句1)

union

(select 语句2)

order  by .....  limit ....;

原文地址:https://www.cnblogs.com/boringLee/p/8618040.html

时间: 2024-10-22 11:22:07

MySQL学习笔记(三)的相关文章

MySQL学习笔记(三)—索引

一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经常会感觉慢.这个时候要提高数据库的检索性能,就必须要用到索引.给表追加合适的索引能极大的改善数据检索的效率,提供数据库性能.      索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,而且每种存储引擎也不一定支持所有的索引类型.      所有存储引擎支持每个表至多16个索引,总索

MySQL学习笔记(三):常用函数

一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是null. 二:数值函数 注意的几个细节: 1.truncate(x,y) 和 round(x,y) 都能截断,只是round会四舍五入,而truncate不会. 三:日期和时间函数 四:流程函数 五:其他函数

MYSQL学习笔记三:日期和时间函数

1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ #CURDATE()与CURRENT_DATE()作用同样,返回同样的系统当前日期 #CURDATE()+0则将当前日期值转换成数值类型 SELECT CURDATE(), CURRENT_DATE(), CURDATE()+0; /* CURTIME()和CURRENT_TIME()作用同样.将当前时间以'HH:MM:SS'或者'HH

Mysql学习笔记(三)对表数据的增删改查。

写在前面:(一些牢骚,可以直接跳到分割线后) 太过敏感的人不会快乐,不幸的是我正是这种性格的人. 从培训机构毕业后,迫于经济方面的压力,和当时的班里的一个同学住在了一起,我们在一个公司上班.谁知道这都是不开心生活的源头,从每天早晨开始心情就很糟糕.他是个脾气很慢的人,我是个急脾气,特别是在早上上班的时候.由此种种吧,实在是不胜枚举.算了,还是不说了,太痛苦了,我不太喜欢说别人的坏话.我是学心理学的,已经用各种方法去安慰自己,但是都不太奏效. 回想以往和朋友的交往中,我虽然不算十分合群的人,但绝对

Mysql学习笔记(三)运算符和控制流函数

原文:Mysql学习笔记(三)运算符和控制流函数 本章学习内容: 1.操作符 2.控制流程函数 操作符: i.圆括号.. 简单的介绍一下圆括号,圆括号的使用的目的是规定计算表达式的顺序...这个想必大家都熟悉例如  mysql>select 1+(2*3) mysql>select (1+2)*3 ii.比较运算符. 比较运算符就比较多了,并且也很常用..比如 = 等于: mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -&g

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于

MySQL学习笔记—SQL服务器模式汇总

MySQL学习笔记-SQL服务器模式汇总 MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式.这样每个应用程序可以根据自己的需求来定制服务器的操作模式. 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查.这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL. 你可以用–sql-mode="modes"选项启动mysqld来设置默认SQL模式.如果你想要重设,该值还可以为空(–sql-mode ="&q

MySQL学习笔记之五 有关数据表操作

MySQL在创建表的时候,创建一个.frm文件保存表和列定义.索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中.   一.用SHOW/ DESCRIBE语句显示数据表的信息 语法: SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于