MySql之表的增删改查

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: day03 表的增删改查

回顾讲解的内容:

1.png2.png

注意:DQL:Data Query Language 数据查询语言


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLmaY2Lf-1633503346242)(image/image.png)]


一、分析表结构

例:员工表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0viPdllH-1633503346245)(image/image_1.png)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtQwVtHP-1633503346247)(image/image_2.png)]


二、表的创建、修改与销毁 DDL

DDL (Data Definition Language) :数据定义语言,定义库,表结构等 ,包括create,drop,alter等

前提:数据库 DataBase


创建数据库

# 创建数据库的命令
create database database_name;
create database 数据库名;
#在mysql中字符集名称不要使用utf-8
create database 数据库名 charset 'utf8'; 
create database 数据库名 charset 'gbk';
  • 使用数据库
use database_name;

  • 查询数据库
show databases;

  • 删除数据库
drop database database_name;
drop database suns1;


查看某个库下的所有表格

#前提是前面有use 数据库名;的语句
show tables ;  
show tables from 数据库名;

1、建表语句

表格的组成

3.png

语法:

create table [if not exists] 表名(
 字段名 数据类型 [约束], 
 字段名 数据类型 [约束], ... 
 );
# id name password balance 
create table table_name(
   列名1 数据类型1,
   列名2 数据类型2
   .....
);
create table t_account(
   id int,
   name varchar2(20),
   password varchar(24),
   balance double
); 

表名和字段名

1. 合法的标识符即可。 
2. 表名一般以t_开头,字段名多个单词间以下划线分隔。 
3. 表名和字段名不区分大小写。


2、MySql数据类型

不同的数据库产品,虽然大面积的数据类型是相通的,但会存在差异


不同的数据库产品,虽然大面积数据类型是相通的,但是会存在稍许差异
MYSQL  double
Oracle  number(5,2)
MYSQL  varchar(12)
Oracle   varchar2(12) varchar(12)


作用:明确一列可以存储什么样的数据。


image.png

timestamp和datetime的区别:


timestamp范围比较小
timestamp和时区有关
show variables like 'time_zone'
set time_zone = '+9:00';


实战建议:


1. 如果数字一定大于0,且不会进行减运算,可以使用unsigned无符号数。如非必要,还是建议 使用有符号数。
 2. float和double存在精度问题,实战中很少使用,MySQL后续版本将不再支持上述两个类型。 
 对精度要求较高时使用decimal。
  3. char和varchar在保存多字节字符(比如中文)底层实现是一样的,所以实战中建议使用 varchar 
  4. 实战中通常需要精确到秒,而timestamp的上限很快到达,建议使用datetime


例:创建t_person表


unsigned无符号的


create table t_person(
 person_id int, 
 person_name varchar(50), 
 age tinyint unsigned, 
 --在给定的范围内选择一个值
 sex enum('F','M'), 
 birthday datetime, 
 salary decimal(10,2), 
 mobile varchar(11), 
 address varchar(500)
  );


3、约束

duplicate:重复

作用:约束限制字段值格式和范围。

image.png

primary key

1. 主键约束只能给主键列添加。唯一且非空
create table t_account1(
id int primary key,
password varchar(12) bot null,
password varchar(12) unique,
balance double
);


例:普通约束示例


-- 列级约束:直接将约束定义在列中 
create table t_person( 
person_id int primary key, 
person_name varchar(50) unique not null, 
age tinyint unsigned not null,
 sex enum('F','M') not null default 'M', 
 birthday datetime not null,
  salary decimal(10,2) not null, 
  mobile varchar(11) not null, 
  address varchar(500) not null );
  -- 表级约束:将约束定义在列定义语句后,not null、default 没有表级约束 
  create table t_person( 
  person_id int ,
  person_name varchar(50) ,
  age tinyint unsigned , 
  sex enum('F','M') not null default 'M', 
  birthday datetime not null, 
  salary decimal(10,2) not null, 
  mobile varchar(11) not null, 
  address varchar(500) not null, 
  -- [constraint 约束名] 约束类型(字段名) 
  constraint pk_person_id primary key(person_id), 
  constraint uq_person_name unique(person_name) );


表级约束:将约束定义在列定义语句后,not null、default 没有表级约束


id——》identify唯一标识


4、表的修改[了解]

# 修改已经存在的列,改数据类型,约束
# 前提这列不能存储数据。
alter table table_name modify name 数据类型 约束
# 修改表的列名
# alter table table_name rename column name to new_name
# 修改表的列名字 
alter table t_test1 change name new_name varchar(12);
# 添加列的名字 
alter table t_test1 add name 数据类型
# 删除列 
alter table t_test1 drop name
1. 对于表进行相关的操作
 创建表(create table) 
 删除表(drop table) 
 修改表(alter table)
2. 对表相关的操作 DDL语言


描述表结构

describe 【数据库名.]表名称;
desc t_test1;
  1. 1.修改字段列的类型( 该列不能有数据 )
alter table 表名 modify 列名 类型;
alter table student modify age int;

  1. 2.修改字段/列名
alter table 【数据库名.]表名称 change【column】 旧字段名 新字段名 新数据类型;


例:

alter table student rename column address to addr

  1. 3.追加新的列
alter table 表名 add 列名 类型 约束 默认值;


例:

alter table student add email varchar(59) not null;


  1. 4.修改表名
alter table 表名 rename 新表名;


     5.表的销毁删除

  • 语法:
drop table [if exists] 表名;
drop table table_name;


例:

drop table t_person; 
**注意:如果两张表有外键引用关系,那么必须先删子表,后删父表** 。

5、表的总结

1.创建表:create 修改表:alter 删除表:drop
2.对表的相关操作DDL语言


三、操作数据

1、添加数据

  • 语法:
insert into table_name(field1,列名,列名,...) 
values(value1,值,值,...);

例:

insert into
 t_person(person_id,person_name,age,sex,birthday,salary,mobile,address) 
 values(1,'xiaohei',18,'M','2000-12-23 12:30:30',10000.00,'187xxxxxxx','郑 州硅谷');


注意:

1. values后小括号中的值要和表名后小括号对应!!!
2.  注意类型与约束

给所有列添加数据,表名后的小括号可以省略


语法:

insert into 表名 
values(值,值,值,...);


例:

insert into t_person 
values(2,'xiaobai',18,'F','2000-12-23 12:30:30',12000.00,'185xxxxxxx','郑 州硅谷');

注意:values前后两个括号中的值 数量要一致


主键是自动增长,mysql自动填充值,不建议认为指定id值!

insert into user(name,nick,birthday) values ('Mr_lee','zz22','2000-01-01');


一次插入多条数据【常用】

insert into user9 (name,nick,birthday) values ('Mr_lee','zz22','2000-01-01'),
                                              ('Mr_lee','zz33','2000-01-01'),
                                              ('Mr_lee','zz44','2000-01-01')
  • 省略列名插入,要求values中必须是完整的列对应的值**[不建议]**
insert into user9 values (1,'Mr_lee','zz','2000-01-01')

2、删除数据

语法:


delete from 表名 
[where 条件];
#全表数据全删除
delete from t_test1 
#根据id删除某些行的数据
delete from t_test1 where id = 10;
delete from t_test1 where id in (1,2,3);


例·:

delete from t_person
 where person_id = 1;


注意:不加条件,则删除表中所有数据。


删除所有数据

表截断:truncate table 表名;//删除表中所有数据 
表截断:直接在物理空间中,将保存数据的空间截断,效率更高
 delete from 表:一行一行的删除,效率比较低。


3、修改数据

  • 语法:
update 表名 
set 列名 = 新值,列名=新值,... 
[where 条件];
update table_name 
set field1=new_value1,field2=new_value2
where....

注意 :更新数据时务必指定where条件,否则将会影响所有行的值。


更新id为1的用户的姓名为Mr_lee

update user9
 set name='Mr_lee' 
 where id=1;
 update user9 set 
 name='xiaohei',
 age=30 
 where id = 20;


  • 更新所有人的姓名**(慎用)**
update user9 
set name='Mr_lee' ;


例:

update t_person 
set age = 20,sex = 'F' 
where person_id = 1;


注意:不加where条件,则更新所有行。


4、数据操作的总结

1:数据操作语言
2:数据操作语言:DML Data modify language
3:
DQL:查询语句
DDL:建表相关语句 create alter drop
DML:数据操作语言数据插入 insert 数据修改update 数据删除delete
4:数据库中的增删改查(CRUD) create read update delete
增:insert into  
删:delete from
改:update set
查:select


四、外键(Foreign Key)

  • 概念:外键也是一种约束,主要用于说明该列与其他列的关系。
  • 分析如何让多张表产生关系


表结构:

4.png

在student表中增加一列,该列只用于让两张表产生关系:

5.png

我们通过student表中的class_id 就可以准确的找到另一张表与它有关系的数据。


该列的数据必须来源于 class 表中的 id 是一种约束


例:


-- 外键约束,必须使用表级约束方式定义  表级约束:constraint
create table t_class( 
class_id int primary key,
 class_name varchar(20) not null );
create table t_student(
 student_id int primary key,
  student_name varchar(20) not null, 
  class_id int not null, 
  -- 追加外键(关系列) 
  constraint fk_student_class foreign key(class_id)
   references t_class(class_id) )
   **--** ** 我们一般把有外键的表称之为子表(从表),被指向的表称之为父表(主表) ** 


外键:体现2张表之间关系的。
外键约束 表达 外键列的值必须来源于另一张表的主键


create table t_dept(
id int primary key,
dept_name varchar(12),
dept_code int
);
create table t_employee{
id int primary key,
name varchar(12),
age int,
salary double,
dept_id int,
foreign key(dept_id) references t_dept(id)
}


注意:

1、外键列的值可以重复、可以为null。
2、建表时应该先创建主表再创建从表 
3、删除主表数据时如果该数据被从表指向,
  必须先解除关系(update ,delete),再删除主表数据。


五、事务(Transaction)

  • 作用:保证业务的完整性,要么一起成功要么一起失败
  • 例:转载业务

6.png

7.png

思考:完整的业务需要执行两次更新操作,但如果第二次更新失败呢?

1、事务的控制

  • 概念:我们在一个事务中,可以使用控制事务语句来控制提交所有操作或者回到事务最初状态、
  • transaction 事务 [trænˈzækʃn]
  • image.png
  • 概念:我们在一个事务中,可以使用控制事务语句来控制提交所有操作或者回到事务最初状态
    例:
程序员误删数据: 
delete from t_account;--忘记写 
rollback; --回到事务最初状态

8.png

2、回滚段

  • rollback9.png
  • commit
  • 10.png
  • rollback为什么能够把数据恢复初始状态?
  • 11.png
  • 概念:

数据库为每个客户端连接分配的独立区域,当执行insert|update|delete
 操作时会暂时将原数据存储到回滚段中,
如果事务失败将会进行回滚(rollback)。

实现原理:

12.png

3、事务的特性【面试】ACID

image.png

隔离性,加锁

13.png

一致性

14.png

六、SQL分类

image.png

七、主键自增&列的附加值

  • 作用:生成一段连续的不可重复的数值,每次+1,一般用于生成主键值。

使用方法:

  1. 1.建表时指定主键为自动增长

语法

可在建表主键后使用 AUTO_INCREMENT ,插入数据时可以不用插入主键的值,自动生成


例:

create table t_person( 
person_id int primary key auto_increment, 
person_name varchar(50) unique not null, -- 略.... 
);


插入数据时不必插入主键的值,自动增长


例:

insert into t_person(
person_name,age,sex,birthday,salary,mobile,address) 
values('xiaohei23',18,'M','2000-12-23 12:30:30',10000.00,'187xxxxxxx','郑州硅谷');


注意:在sql语句执行时,无论成功与否 auto_increment 都会自动+1


2.指定 auto_increment 起始值

语法

alter table 表名 auto_increment = 起始值


为表中所有使用了auto_increment 自增功能的列,指定起始值


3.获取auto_increment当前值

语法:

select last_insert_id()


1、auto_increment

create table t_dept1(
  id int primary key,
  dept_name varchar(12),
  dept_code int
);
insert into t_dept1 (id,dept_name,dept_code) values (1,'dev','001');
insert into t_dept1 (id,dept_name,dept_code) values (2,'dev','001');
create table t_dept1(
  id int primary key auto_increment, // 主键自动增长
  dept_name varchar(12),
  dept_code int
);
insert into t_dept1 (dept_name,dept_code) values ('dev','001'); mysql 自动的为id 设置值 为1
insert into t_dept1 (dept_name,dept_code) values ('dev','001'); id+1 ---> 2

2、列默认值

create table t_dept2(
  id int primary key auto_increment,
  dept_name varchar(12) default 'xiaohei',
  dept_code int
);
insert into t_dept2 (dept_code) values (1);
MYSQL 
假定 id 5
id  dept_name dept_code
 6  xiaohei          1

3、表附加值

  • engine 引擎选择:一般使用innodb
  • default charset 表中的数据编码格式

1、建库最好选择字符集utf-8建表时会继承库的字符集
2、如果建库时没有选择字符集,则建表必须设置字符集,否则会出现中文乱码
3、建议将my.ini配置文件中的字符集更改为utf8则数据库将会继承配置中的字符集`


auto_increment 自增长列的起始值

create table t_xxx(
   name varchar(12) xxx xxx
   ...
   ....
)xxxx;
create table user9(
  id int auto_increment primary key,
  name varchar(20) NOT NULL DEFAULT 'Mr_lee',
  nick varchar(15) UNIQUE,
   birth timestamp
)
ENGINE = InnoDB default charset = utf8 auto_increment = 9;

八、视图

  • 作用:把查询(select)结果存储在数据库中并重新命名,方便重复使用。15.png

1、创建视图

  • 语法:
create view v_user as 查询SQL;

例:

create view v_employee_departments
 as select e.*,d.department_name,d.location_id
  from employees e 
  left join departments d 
  on e.department_id = d.department_id;

2、使用视图

  • 如果表中的数据改变,视图也会改变

语法:

select 列,列,... 
from 视图名 
[where 条件] ...


例:

create view v_employee_departments 
as 
select e.*,d.department_name,d.location_id 
from employees e 
left join departments d 
on e.department_id = d.department_id;


3、 销毁视图

  • 语法:
drop view 视图名;


例:

drop view v_employee_departments;


4、 视图的特点

视图本质上就是一个复杂的查询SQL

视图本身并不能提升查询效率,只能提升开发效率

视图本身不是表,不存储任何数据


九、索引

  • 概念:索引是数据库为提高查询速度而提供一种机制

   从数据库中查询数据和从字典中查询一个字的过程相似。数据库中的索引和字典中的拼音、偏旁部首、笔画这些组成类似,用来提高查询效率的。


   - 使用索引提高查询效率

16.png

相关语法:

创建:
create index 索引名
 on 表名(列名); 
查看:
show index from 表名; 
删除引:
drop index 索引名 on 表名;


使用索引:

当使用添加了索引的列作为查询条件时,数据库会自动使用索引。 
提前准备千万级的数据能看出索引的效果。


索引的特点

1. 索引用来提高查询效率 
2. 索引也会占用磁盘空间 
3. 索引不是越多越好,一般每张表不要超过5个。
   原因:
   1.索引会占空间,影响性能
   2.影响增删改的效率 
**4. 注意,索引不是任何时候都有效,例如在is null或者模糊查询时索引会失效** 


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Oracle 关系型数据库 MySQL
【mysql】—— 表的内连和外连
【mysql】—— 表的内连和外连
|
1月前
|
存储 关系型数据库 MySQL
【mysql】—— 表的增删改查
【mysql】—— 表的增删改查
|
1月前
|
分布式计算 DataWorks 关系型数据库
DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
【2月更文挑战第14天】DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
56 8
|
16天前
|
存储 SQL 关系型数据库
【MySQL】4. 表的操作
【MySQL】4. 表的操作
19 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
15天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
15天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
16天前
|
关系型数据库 MySQL
【MySQL】12. 表的内连和外连(重点)
【MySQL】12. 表的内连和外连(重点)
12 0
|
1月前
|
存储 关系型数据库 MySQL
【mysql】—— 表的约束
【mysql】—— 表的约束
|
1月前
|
存储 SQL 关系型数据库
【mysql】—— 表的操作
【mysql】—— 表的操作