03--MySQL数据库概述

目录

第13章 DML

13.1 添加语句

(1)添加一条记录到某个表中

(2)添加一条记录到某个表中

(3)添加多条记录到某个表中

(4)示例演示

13.2 修改语句

修改所有行

修改部分行

13.3 删除

删除部分行的数据

删除整张表的数据,但表结构留下

截断表,清空表中的数据,只有表结构

13.4 UPDATE中嵌套子查询

13.5 DELETE中嵌套子查询

13.6 使用子查询复制表结构和数据

第14章 约束

14.1 约束的作用

14.2 约束的类型

1、约束类型

2、表级约束和列级约束

3、约束和索引

14.3 非空约束

1、作用

2、关键字:not null

3、特点

4、如何指定非空约束

(1)建表时

(2)建表后(了解)

5、如何删除非空约束(了解)

6、SQL示例演示

14.4 唯一键约束

1、唯一键约束的作用

2、关键字:unique key

3、特点

4、如何指定唯一键约束

(1)建表时

(2)建表后指定唯一键约束(了解)

4、如何查看唯一键约束?(了解)

5、复合唯一

6、删除唯一键约束(了解)

7、如何查看表的索引

8、SQL示例

14.5 主键约束(重要)

1、主键约束的作用

2、关键字:primary key

3、特点

4、唯一键约束和主键约束区别

5、如何指定主键约束

(1)建表时指定主键约束

(2)建表后增加主键约束(了解)

6、复合主键

7、如何删除主键约束?(了解)

8、SQL示例

14.6 默认值约束

1、作用

2、关键字:default

3、如何给字段加默认值

(1)建表时

(2)建表后(了解)

4、如何删除默认值约束(了解)

5、SQL示例

14.7 自增属性

1、作用

2、关键字:auto_increment

3、特点和要求

4、如何指定自增约束

(1)建表时

(2)建表后(了解)

5、如何删除自增约束(了解)

6、演示错误

7、SQL示例

14.8 检查约束

1、作用

2、关键字:check

3、如何定义检查约束

(1)建表时

(2)建表后(了解)

4、如何查看一个表的约束(了解)

5、如何删除检查约束(了解)

6、SQL示例

14.9 外键约束(了解)

1、作用

2、关键字:foreign key

3、主表和从表/父表和子表

4、特点

5、如何指定外键约束

(1)建表时

(2)建表后(了解)

6、如何查看外键约束名

7、如何查看外键字段索引

8、如何删除外键约束(了解)

第15章 事务(了解)

15.1 事务的特点

15.2 事务的开启、提交、回滚

15.2.1 手动提交模式

15.2.2 自动提交模式下开启事务

15.2.3 DDL语句不支持事务

15.3 事务的隔离级别


第13章 DML

13.1 添加语句

(1)添加一条记录到某个表中

insert into 表名称 values(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应
mysql> desc teacher;
+----------+------------------------+------+-----+---------+-------+
| Field    | Type                   | Null | Key | Default | Extra |
+----------+------------------------+------+-----+---------+-------+
| tid      | int(11)                | YES  |     | NULL    |       |
| tname    | varchar(5)             | YES  |     | NULL    |       |
| salary   | double                 | YES  |     | NULL    |       |
| weight   | double                 | YES  |     | NULL    |       |
| birthday | date                   | YES  |     | NULL    |       |
| gender   | enum('男','女')        | YES  |     | NULL    |       |
| blood    | enum('A','B','AB','O') | YES  |     | NULL    |       |
| phone    | char(11)               | YES  |     | NULL    |       |
+----------+------------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
insert into teacher values(1,'张三',15000,120.5,'1990-5-1','男','O','13789586859');
insert into teacher values(2,'李四',15000,'1990-5-1','男','O','13789586859'); #缺体重weight的值
​
ERROR 1136 (21S01): Column(列) count(数量) doesn't match(不匹配) value(值) count(数量) at row 1

(2)添加一条记录到某个表中

insert into 表名称 (字段列表) values(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应
insert into teacher(tid,tname,salary,phone) values(3,'王五',16000,'15789546586');

(3)添加多条记录到某个表中

insert into 表名称 values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应
insert into 表名称 (字段列表) values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应
insert into teacher (tid,tname,salary,phone) 
values(4,'赵六',16000,'15789546586'),
(5,'汪飞',18000,'15789548886'),
(6,'天琪',19000,'15909546586');

(4)示例演示

#演示基本的,简单的DML语句
#基于tempdb数据库演示
create database tempdb;
use tempdb;
​
#创建teacher表
create table teacher(
    id int,
    name varchar(20),
    gender enum('m','f'),
    birthday date,
    salary double,
    tel varchar(11)
);
​
#查看teacher表结构
mysql> desc teacher;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| id       | int           | YES  |     | NULL    |       |
| name     | varchar(20)   | YES  |     | NULL    |       |
| gender   | enum('m','f') | YES  |     | NULL    |       |
| birthday | date          | YES  |     | NULL    |       |
| salary   | double        | YES  |     | NULL    |       |
| tel      | char(18)      | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
​
​
#添加数据
#(1)第一种情况,给所有字段赋值
insert into 表名称 values(值列表);  
#这种情况要求(值列表)的每一个值的类型、顺序与表结构一一对应
#表中有几个字段,(值列表)必须有几个值,不能多也不能少
#值如果是字符串或日期类型,需要加单引号
​
#例如:添加一条记录到teacher表
insert into teacher values
(1,'张三','m','1998-7-8',15000.0,'15512341234');
​

13.2 修改语句

修改所有行

update 表名称 set 字段名 = 值, 字段名 = 值; #给所有行修改
#修改所有人的薪资,都涨了1000
update teacher set salary = salary + 1000 ; 

修改部分行

update 表名称 set 字段名 = 值, 字段名 = 值 where 条件; #给满足条件的行修改
#修改张三的薪资降低5000
update teacher set salary = salary-5000 where tname = '张三';

13.3 删除

删除部分行的数据

delete from 表名称 where 条件;
delete from teacher where tname = '张三';

删除整张表的数据,但表结构留下

delete from 表名称;
delete from teacher;

截断表,清空表中的数据,只有表结构

truncate 表名称;
truncate teacher;
truncate表和delete表的区别:

delete是一条一条删除记录的。如果在事务中,事务提交之前支持回滚。(后面会讲事务)

truncate是把整个表drop,新建一张,效率更高。就算在事务中,也无法回滚。

#同学问:是否可以删除salary字段的值,字段留着,值删掉
#可以实现,但是不是用delete,用update
​
#同学问:是否可以删除salary字段,连同字段和这个字段的数据都是删除
#可以实现,但是不是用delete,用alter table 表名称 drop column 字段名;
​
#同学问:只删除某个单元格的值
#可以实现,但是不是用delete,用update

13.4 UPDATE中嵌套子查询

#子查询也可以嵌套在update语句中
#(1)修改“t_employee”表中部门编号(did)和
#“测试部”部门编号(did)相同的员工薪资为原来薪资的1.5倍。
UPDATE t_employee
SET salary = salary * 1.5
WHERE did = (SELECT did FROM t_department WHERE dname = '测试部');
​
#(2)修改“t_employee”表中did为NULL的员工信息,
#将他们的did值修改为“测试部”的部门编号。
#子查询select did from t_department where dname = '测试部'
#这种子查询必须是单个值,否则无法赋值
​
UPDATE t_employee 
SET did = (SELECT did FROM t_department WHERE dname = '测试部')
WHERE did IS NULL;
​
#(3)修改“t_employee”表中“张三”的薪资值等于“李四”的薪资值。
#这里使用子查询先在“t_employee”表中查询出“李四”的薪资。
​
UPDATE t_employee
SET salary = (SELECT salary FROM t_employee WHERE ename = '李四')
WHERE ename = '张三';
#You can't specify target table 't_employee' for update in FROM clause'
​
UPDATE t_employee
SET salary = (SELECT salary FROM(SELECT salary FROM t_employee WHERE ename = '李四')temp)
WHERE ename = '张三';
#当update的表和子查询的表是同一个表时,需要将子查询的结果用临时表的方式表示
#即再套一层子查询,使得update和最外层的子查询不是同一张表
​
#(4)修改“t_employee”表“李四”的薪资与她所在部门的平均薪资一样。
#子查询,查询李冰冰的部门编号 
#select did from t_employee where ename = '李四';
​
#子查询第二层,查询李四所在部门的平均薪资
#select avg(salary) from t_employee where did = (select did from t_employee where ename = '李四');
​
#子查询第三层,把第二层的子查询结果当成临时表再查一下结果
#目的使得和外层的update不是同一张表
SELECT pingjun FROM (SELECT AVG(salary) pingjun FROM t_employee WHERE did = (SELECT did FROM t_employee WHERE ename = '李四') temp)
​
#update更新
UPDATE t_employee
SET salary = 
(SELECT pingjun FROM 
    (SELECT AVG(salary) pingjun FROM t_employee WHERE did = 
        (SELECT did FROM t_employee WHERE ename = '李四') ) temp)
WHERE ename = '李四';

13.5 DELETE中嵌套子查询

#delete语句中也可以嵌套子查询
#(1)从“t_employee”表中删除“测试部”的员工记录。
DELETE FROM t_employee 
WHERE did = (SELECT did FROM t_department WHERE dname = '测试部');
​
​
#(2)从“t_employee”表中删除和“李四”同一个部门的员工记录。
#子查询 “李四”的部门编号
#select did from t_employee where ename = '李四';
​
DELETE FROM t_employee WHERE did = (SELECT did FROM t_employee WHERE ename = '李四');
#You can't specify target table 't_employee' for update in FROM clause'
#删除和子查询是同一张表
​
DELETE FROM t_employee WHERE did = (SELECT did FROM (SELECT did FROM t_employee WHERE ename = '李四')temp);

13.6 使用子查询复制表结构和数据

#演示通过子查询复制表,
#(1)复制表结构
#(2)复制一条或多条记录
#(3)同时复制表结构和记录
#仅仅是复制表结构,可以用create语句
CREATE TABLE department LIKE t_department;
​
#使用INSERT语句+子查询,复制数据,此时INSERT不用写values
INSERT INTO department (SELECT * FROM t_department WHERE did<=3);
​
#同时复制表结构+数据
CREATE TABLE d_department AS (SELECT * FROM t_department);
#如果select后面是部分字段,复制的新表就只有这一部分字段

第14章 约束

14.1 约束的作用

约束是为了保证数据的完整性,数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。

数据的完整性要从以下四个方面考虑:

  • 实体完整性(Entity Integrity):例如,同一个表中,不能存在两条完全相同无法区分的记录

  • 域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”

  • 引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门

  • 用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。

14.2 约束的类型

1、约束类型

  • 键约束:主键约束、外键约束、唯一键约束

  • Not NULL约束:非空约束

  • Check约束:检查约束

  • Default约束:默认值约束

自增是键约束字段的一个额外的属性。

2、表级约束和列级约束

其中键约束和检查约束是表级约束,即不仅要看约束字段当前单元格的数据,还要看其他单元格的数据。

非空约束和默认值约束都是列级约束,即约束字段只看当前单元格的数据即可,和其他单元格无关。

所有的表级约束都可以在“information_schema.table_constraints”表中查看。

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';

3、约束和索引

在MySQL中键约束会自动创建索引,提高查询效率。索引的详细讲解在高级部分。

MySQL高级会给大家讲解索引、存储引擎等,因为高级要给大家分析SQL性能。而基础阶段先不管效率,只要能查出来就行。

约束和索引不同:

约束是一个逻辑概念,它不会单独占用物理空间,

索引是一个物理概念,它是会占用物理空间。

例如:字典

字典里面有要求,不能有重复的字(字一样,读音也一样),这是约束。

字典里面有“目录”,它可以快速的查找某个字,目录需要占用单独的页。

14.3 非空约束

1、作用

限定某个字段/某列的值不允许为空

2、关键字:not null

3、特点

(1)只能某个列单独限定非空,不能组合非空

(2)一个表可以有很多列都分别限定了非空

4、如何指定非空约束

(1)建表时
create table 表名称(
    字段名 数据类型 not null,
    字段名 数据类型 not null,
    字段名 数据类型
);
(2)建表后(了解)
alter table 表名称 modify 【column】 字段名 数据类型 not null;
​
/*
如何该字段已经有值了,给该字段增加非空约束,要求该字段的值不能有NULL值,否则需要先处理NULL值才能加上非空约束
*/

5、如何删除非空约束(了解)

alter table 表名称 modify 【column】 字段名 数据类型;
​
/*
说明:
如果某个字段有not null非空约束,使用modify修改字段的数据类型、位置、字符集和校对规则、默认值约束时,
想要保留非空约束,必须把not null带上,否则会在修改字段的数据类型、位置、字符集和校对规则时,会把非空约束给丢掉。
*/

6、SQL示例演示

/*演示非空约束
1、作用:限定某个字段的值不允许为NULL。
​
在Java中只有引用数据类型才能赋值为null,基本数据类型不允许为null。
但是MySQL中所有的数据类型都可以赋值为NULL,包括int等。
​
2、关键字:not null
​
3、一个表可以有很多个字段限定非空约束,
一个字段加not null,和其他字段无关,它是列级约束。
*/
​
#创建一个表格,演示NULL值
create table not_null_demo(
    id int,
    name varchar(20),
    birthday date
);
​
insert into not_null_demo values(null,null,null);
insert into not_null_demo(id) values(1);
select * from not_null_demo;
drop table not_null_demo;
​
#在创建表的时候,可以指定非空约束
​
create table 表名称(
    字段名 数据类型 not null,
    字段名 数据类型 not null,
    字段名 数据类型
);
​
create table not_null_demo(
    id int not null,
    name varchar(20) not null,
    birthday date  #没有加not null的,允许为NULL
);
​
#添加NULL值
insert into not_null_demo values(null,null,null);
​
mysql> insert into not_null_demo values(null,null,null);
ERROR 1048 (23000): Column 'id' cannot be null
​
#指定了id字段的值,但是没有指定name字段和birthday字段的值
insert into not_null_demo(id) values(1);
​
mysql> insert into not_null_demo(id) values(1);
ERROR 1364 (HY000): Field 'name' doesn't have a default value'
#此时name设定了NOT NULL,但又没有提前指定默认值,
#如果没赋值只能处理为NULL,就违反非空约束
​
#总结:在insert添加记录时,必须给所有没有提前指定默认值的非空约束字段赋值。
​
insert into not_null_demo(id,name) values(1,'张三');
insert into not_null_demo(id,name,birthday) values(2,'李四','2000-1-1');
insert into not_null_demo values(3,'王五','2000-2-1');
insert into not_null_demo values(4,'赵六',null);
​
insert into not_null_demo values(4,'赵六'); #错误,值列表数量与字段数量不匹配
mysql> insert into not_null_demo values(4,'赵六');
ERROR 1136 (21S01): Column count doesn't match value count at row 1'
​
​
#在创建表之后,可以给某个字段增加非空约束
#alter table 表名称 modify 【column】 字段名 数据类型 not null;
​
#例如:给not_null_demo表格的birthday字段加not null约束
alter table not_null_demo modify column birthday date not null;
​
mysql> alter table not_null_demo modify column birthday date not null;
ERROR 1138 (22004): Invalid use of NULL value
#失败的原因是因为not_null_demo表中birthday字段现在已经有NULL值。
#所以添加不上非空约束。
#如果要加,必须先将原来的NULL值修改掉
​
mysql> select * from not_null_demo;
+----+------+------------+
| id | name | birthday   |
+----+------+------------+
|  1 | 张三 | NULL       |
|  2 | 李四 | 2000-01-01 |
|  3 | 王五 | 2000-02-01 |
|  4 | 赵六 | NULL       |
+----+------+------------+
4 rows in set (0.01 sec)
​
update not_null_demo set birthday = '2000-5-1' where id=1 || id = 4;
​
mysql> select * from not_null_demo;
+----+------+------------+
| id | name | birthday   |
+----+------+------------+
|  1 | 张三 | 2000-05-01 |
|  2 | 李四 | 2000-01-01 |
|  3 | 王五 | 2000-02-01 |
|  4 | 赵六 | 2000-05-01 |
+----+------+------------+
4 rows in set (0.00 sec)
​
mysql> alter table not_null_demo modify column birthday date not null;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> desc not_null_demo;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   |     | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| birthday | date        | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
​
#删除某个字段的非空约束
alter table 表名称 modify 【column】 字段名 数据类型;
​
#例如:去掉birthday字段的非空约束
alter table not_null_demo modify column birthday date;
​
mysql> desc not_null_demo;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   |     | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
​
/*
说明:
如果某个字段有not null非空约束的话,
使用modify修改字段的数据类型、位置、字符集和校对规则时,
想要保留非空约束,必须把not null带上,
否则会在修改字段的数据类型、位置、字符集和校对规则时,
把非空约束给丢掉。
*/
#例如:修改name字段的数据类型为varchar(30),本来想要保留not null非空约束的
alter table not_null_demo modify column name varchar(30);
#此时alter没有加not null,会把name字段的not null约束给丢掉。
​
mysql> desc not_null_demo;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   |     | NULL    |       |
| name     | varchar(30) | YES  |     | NULL    |       |
| birthday | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
​

14.4 唯一键约束

1、唯一键约束的作用

单列唯一:用来限制某个字段/某列的值不

你可能感兴趣的:(后端,mysql,android,数据库,mysql,后端)