0
点赞
收藏
分享

微信扫一扫

MySQL中的SQL高级语句[一](上篇)

源码之路 04-09 10:30 阅读 1

使用语言 MySQL

使用工具 Navicat Premium 16

代码能力快速提升小方法,看完代码自己敲一遍,十分有用

  • 拖动表名到查询文件中就可以直接把名字拉进来
  • 以下是使用脚本方法,也可以直接进行修改
  • 中括号,就代表可写可不写 

目录

1.修改数据表结构

1.1 修改数据库的表名 

1.2 修改数据表的字段 

1.3 给数据表添加字段 

1.4 删除数据表的字段 

1.5 添加主外键约束 

1.5.1 添加主键约束 

1.5.2 添加外键约束 

1.5.3 判断是主表(父表)还是外表(子表)

2.DML语句 

2.1 插入数据语句

2.1.1 插入单行数据

2.1.2 插入多行数据 

2.1.3 将查询结果插入新表

2.1.4 插入示例

2.1.5 使用时需注意

2.2 更新数据语句 

2.2.1 更新数据语法

2.2.2 更新示例

 2.3 删除数据语句

2.3.1 delete语法

2.3.2 truncate语法 

2.3.3 TRUNCATE、Drop、Delete的区别 

2.3.4 删除示例 


 

1.修改数据表结构

在项目开发过程中,应尽量在设计阶段将项目中可能存在的问题考虑全面,将数据表设计完整。但是总会出现因业务变动等因素需要对已经创建好的数据表去做修改表的操作,如添加、删除字段等。如果采用将表删除后重建的方式实现,很容易造成已有数据的丢失,影响业务,风险比较大。此时,需要在原有表结构的基础上对表进行修改。MySQL可以通过alter关键字实现此功能。在修改操作之前,应先使用show tables语句确认该表是否存在于数据库中。 

1.1 修改数据库的表名 

使用SQL语句对已创建的表修改表名,语法如下:

  • alter table 旧表名 rename [to] 新表名;

其中,to为可选,使用与否不影响结果。此语句仅修改表名,并不更改表的结构。 

1.2 修改数据表的字段 

数据表中的字段包含字段名和数据类型,可以使用SQL修改字段名和修改数据存储类型及属性。语法如下:

  • alter table 表名 change 原字段名 新字段名 数据类型 [属性];

其中,原字段名指修改前的字段名,新字段名为修改后的;数据类型指修改后的,若不需要修改数据类型,则与原数据类型保持一致,但数据类型不能为空;属性可为空,若修改时未添加属性,则修改后的字段无任何属性约束。 

由于不同类型的数据存储释放和长度不同,修改数据类型可能会影响数据表中已有的数据,因此,已有数据情况下不轻易修改数据类型;

1.3 给数据表添加字段 

随着业务需求的变化,可能需要向已存在的表中添加新的字段。添加字段的语法格式如下:

  • alter table 表名 add 字段名 数据类型 [属性]; 

1.4 删除数据表的字段 

在开发过程中,由于业务的改变,也有将数据表中的某个字段从表中移除的需求。删除字段的语法格式如下:

  • alter table 表名 drop 字段名; 

1.5 添加主外键约束 

1.5.1 添加主键约束 

语法如下:

  • alter table 表名 [add constraint 主键名] primary key 表名(主键字段); 

 

1.5.2 添加外键约束 

语法如下:

  • alter table 表名 [add consran 外键名] foreign key (外表外键字段) references 关联表名(关联字段); 

 

在MySQL中,InnoDB存储类型的表支持外键,MyISAM存储类型的表不支持外键。因此,对于MyISAM存储类型的表,也可以通过建立逻辑关联的方式保证数据的完整性和一致性。 

1.5.3 判断是主表(父表)还是外表(子表)


1.查看这张表有没有其他表的主键,没有的话就是主表,有的话就是外表
2.语法中的主键名,就是设计表上方索引的名(一般以PK_字段名命名)
3.语法中的外键名就是设计表上方外键的名(一般以FK_字段名命名)
4.创建外键,第一个表名写外表,第二个外键字段写外表中需要创建关系的字段,最后一个写主表中的需要创建关系字段(从外写到主)
5.添加数据先添加主表,然后再添加外表

2.DML语句 

常用的DML语句——增、删、改语句的使用方法。 

2.1 插入数据语句

完成数据库搭建及数据表的创建后,就需要向数据表中添加数据。使用insert语句向数据表中插入数据的语法如下: 

2.1.1 插入单行数据

  • insert into 表名[(字段名列表)] values (值列表); 

2.1.2 插入多行数据 

 MySQL支持在一条SQL语句中依次向数据表中插入多条记录。插入多个值列表时,每个值列表之间用逗号分隔。语法格式如下:

  • insert into 表名[(字段名列表)] values (值列表1),(值列表2)...,(值列表n);

除数字类型之外的所有数据类型都要加单引号包住;

2.1.3 将查询结果插入新表

在MySQL中,如果想把一个表中的数据查询后存储至另一张表的语法如下:

  • create table 新表(select 字段1,字段2, ... form原表);

使用as放在对应的字段或者表名后面时,可以为这个前面的字段添加别名;

2.1.4 插入示例

 

运行结果 

 

这个代表,有4行受到影响;

查询结果 

 如果执行以上创建a表的语句后,执行结果如下:

 查询的结果如下: 

 

2.1.5 使用时需注意

 

  • 可以直接选中表中需要添加数据的行,然后右键,可以复制脚本代码来赋值;
  • 字段名列表是可选项,若省略,则依次插入所有字段。
  • 若插入表的是部分数据,字段名列表不能省略。
  • 值列表必须和字段名列表的数量相同,且数据类型一致。
  • 多个字段名和多个值之间使用逗号分隔。
  • 自增列如果一定要写的话写null或者0,自增列一般默认不写,这时就要使用字段名列表 ;

2.2 更新数据语句 

2.2.1 更新数据语法

更新表中的数据也是软件开发经常使用的技能。通常使用update语句更新数据表中的数据。语法格式如下:

  • update 表名 set 字段1=值1,字段2=值2,...,字段n=值n [where 条件]; 

2.2.2 更新示例

 

运行结果 

  • 原来的查询结果 
  • 更新后的查询结果 

 2.3 删除数据语句

2.3.1 delete语法

  • delete from 表名 [where 条件]; 

2.3.2 truncate语法 

  • truncate table 表名; 

2.3.3 TRUNCATE、Drop、Delete的区别 

  • truncate语句删除表中的所有数据时会重置自增列,表结构及其字段、约束、索引保持不变,执行速度比delete语句快。
  • drop和truncate都无法回滚,但是delete可以。
  • drop和delete只是删除表的数据(定义),drop语句将删除表的结构、被依赖的约束(constrain)、触发器 (trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。
  • delete语句是DML语言,这个操作会放在rollback segement中,事物提交后才生效;如果有相应的触发器(trigger),执行的时候将被触发。truncate、drop是DDL语言,操作后即 生效,原数据不会放到rollback中,不能回滚,操作不会触发trigger。
  • delete语句不影响表所占用的extent、高水线(high watermark)保持原位置不动。drop语句将表所占用的空间全部释放。truncate语句缺省情况下将空间释放到minextents的 extent,除非使用reuse storage。truncate会将高水线复位(回到最初)。
  • 效率方面:drop > truncate > delete
  • 安全性:小心使用drop与truncate,尤其是在 没有备份的时候,想删除部分数据可使用delete需要带上where子句,回滚段要足够大,想删除表可以用drop,想保留表只是想删除表的所有数据、 如果跟事物无关可以使用truncate,如果和事物有关、又或者想触发 trigger,还是用delete,如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入、插入数据。
  • delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
  • drop一般用于删除整体性数据 如表,模式,索引,视图,完整性限制等;delete用于删除局部性数据 如表中的某一元组
  • DROP把表结构都删了;DELETE只是把数据清掉
  • 当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时(always with a WHERE clause), 用 delete. 

2.3.4 删除示例 

 

运行后查询结果

 如果truncate无法删除,可以先delete,然后使用:

ALTER TABLE table_name AUTO_INCREMENT = 重置从哪里开始;

举报

相关推荐

0 条评论