第10天SQL进阶-表的创建修改与删除(SQL 小虚竹)

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第10天SQL进阶-表的创建修改与删除(SQL 小虚竹)相关的知识,希望对你有一定的参考价值。

回城传送–》《32天SQL筑基》

文章目录

零、前言

今天是学习 SQL 打卡的第 10 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

​ 虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-表的创建、修改与删除

一、练习题目

题目链接难度
SQL进阶-表的创建、修改与删除:SQL118 创建一张新表★☆☆☆☆
SQL进阶-表的创建、修改与删除:SQL119 修改表★★☆☆☆
SQL进阶-表的创建、修改与删除:SQL120 删除表★★☆☆☆

二、SQL思路

SQL进阶-表的创建、修改与删除:SQL118 创建一张新表


初始化数据

drop table if EXISTS user_info_vip;

解法

要求处理:

  • 创建一张优质用户信息表user_info_vip,表结构和用户信息表一致
  • 如果该表已经被其他分析师创建过了,正常返回即可

分析:

  • mysql中创建表使用的是CREATE TABLE语句,语法如下:

CREATE TABLE [IF NOT EXISTS] 表名(
字段名1, 数据类型 [约束条件] [默认值] comment ‘字段的注释’,
字段名2, 数据类型 [约束条件] [默认值] comment ‘字段的注释’,
字段名3, 数据类型 [约束条件] [默认值] comment ‘字段的注释’,
……
);

  • [IF NOT EXISTS]的意思是:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表
  • 数据类型支持以下几大类型:
    • 数值型:整数类型、浮点数类型和定点数类型

    • 字符串类型:可以存储字符到长文本或二进制字符串数据。

    • 注:char(n)和varchar(n)中n代表字符的个数,并不是字节个数。

    • 日期和时间类型:MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。

  • 约束条件支持6种约束:主键约束、外键约束、唯一约束、检查约束、非空约束和默认值约束。
约束类型关键字说明
主键约束primary key主键是表里面的一个特殊字段,这个字段能的够唯一标识该表中的每条信息。一张表只能定义一个主键,如果一个字段被定义成了主键,该列的值不允许为 NULL,也不允许重复
外键约束foreign key外键通常会和主键约束一起使用,用来确保数据的一致性。对于有关联关系的两张表,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表),外键就是用来建立主表与从表的关联关系的。当子表的某一个字段被定义为外键时该列上的值必须在父表中存在或者为NULL 值
唯一约束unique唯一约束就是指所有记录中字段的值不允许重复。值得注意的是,由于 SQL 中的 NULL值是一个特殊值,因此如果一个字段被定义了唯一约束,该字段的值允许为NULL
检查约束checkMySQL提供了检查约束用来指定某列可取值的范围,它通过限制输人到列中的值来强制域的完整性
非空约束not null非空约束用于确保该字段的值不能为空值,非空约束只能出现在表对象的列上
默认值约束defaultMySQL默认值约束用来指定某列的默认值
  • 注释:

    • MySQL数据库中, 字段或列的注释是用属性comment来添加。创建新表的脚本中, 可在字段定义创建表脚本中添加comment属性来添加注释。
    • 如果是已经创建好的表,要添加注释,可以用以下语法进行修改。(这个语法也是修改字段类型的语法)

    alter table table_name modify column field_name 字段类型 comment ‘修改后的字段注释’;

  • 套用语法,得到创建表的sql :

create table if not exists user_info_vip (
    id int(11) primary key auto_increment comment '自增ID',
    uid int(11) unique not null comment '用户ID',
    nick_name varchar(64) comment '昵称',
    achievement int(11) default 0 comment '成就值',
    level int(11) comment '用户等级',
    job varchar(32) comment '职业方向',
    register_time datetime default current_timestamp comment '注册时间'
);

扩展

  • 注:表名称在Windows操作系统上不区分大小写,在Linux操作系统上区分大小写。如果需要在Linux操作系统上不区分大小写,则需要在MySQL的配置文件my.cnf中添加一项配置。

lower_case_table_names=1

MySQL创建相同表结构的表的方法:

  • 使用AS复制相同的表结构:

CREATE TABLE table_name AS
SELECT * FROM other_table WHERE 有条件就写条件;

  • 使用LIKE复制相同的表结构:

CREATE TABLE table_name LIKE other_table;

SQL进阶-表的创建、修改与删除:SQL119 修改表


初始化数据

drop table if exists user_info;
CREATE TABLE IF NOT EXISTS user_info (
id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
uid int UNIQUE NOT NULL COMMENT '用户ID',
`nick_name` varchar(64) COMMENT '昵称',
achievement int COMMENT '成就值',
level int COMMENT '用户等级',
job varchar(10) COMMENT '职业方向',
register_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

解法

要求处理:

  • 在用户信息表,字段level的后面增加一列最多可保存15个汉字的字段school;
  • 将表中job列名改为profession,同时varchar字段长度变为10;
  • achievement的默认值设置为0。

分析:

  • 在用户信息表,字段level的后面增加一列最多可保存15个汉字的字段school,给表增加列的语法:

alter table table_name add column field_name 字段类型 【 DEFAULT 默认值】 【first或after 字段名】

其中【 DEFAULT 默认值】 是可选参数,如不写,默认为null。
其中【first或after 字段名】是可选参数:first 代表当前要添加的字段位于当前表的第一个字段的位置。
after 字段名 代表:要添加的字段位于指定字段的后面。
示例:使用first
使用DESCRIBE TABLE语句查看数据表表结构:

alter table user_info add column school varchar(15) first;


如预期所示:新增字段放在第一个字段

示例:使用after 字段名

alter table user_info add column school varchar(15) after level;


如预期所示:新增字段放在指定字段后面。

  • 将表中job列名改为profession,同时varchar字段长度变为10,修改表字段名称的语法:

ALTER TABLE 表名 CHANGE 原有字段名 新字段名 新数据类型

alter table user_info change job profession varchar(10);

未修改之前的表字段:

修改之后:

修改成功:

  • achievement的默认值设置为0,使用的语法是:

ALTER TABLE 表名 MODIFY 字段名 新数据类型 [DEFAULT 默认值]

alter table user_info modify achievement int(11) default 0;

修改之前:

修改之后:

扩展:

上面题目介绍了三种修改方式:给表增加列、对字段名重命名和修改字段类型、对字段的数据类型和默认值进行修改。

  • 第四种:修改数据表名称,语法:

ALTER TABLE 原表名 RENAME 新表名

  • 第五种:修改字段的位置:
    将字段的位置修改为数据库的第一个字段,语法:

ALTER TABLE 表名 MIDIFY 字段名 数据类型 FIRST

将当前字段的位置修改到某个字段的后面,语法:

ALTER TABLE 表名 MODIFY 字段1名称 字段1的数据类型 AFTER 字段2名称

  • 第六种:取消数据表的外键约束,语法:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名

SQL进阶-表的创建、修改与删除:SQL120 删除表

初始化数据

drop table if EXISTS exam_record;
CREATE TABLE IF NOT EXISTS exam_record (
id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
uid int NOT NULL COMMENT '用户ID',
exam_id int NOT NULL COMMENT '试卷ID',
start_time datetime NOT NULL COMMENT '开始时间',
submit_time datetime COMMENT '提交时间',
score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS exam_record_2010 (LIKE exam_record); 
CREATE TABLE IF NOT EXISTS exam_record_2012 (LIKE exam_record); 
CREATE TABLE IF NOT EXISTS exam_record_2013 (LIKE exam_record); 
CREATE TABLE IF NOT EXISTS exam_record_2014 (LIKE exam_record); 
CREATE TABLE IF NOT EXISTS exam_record_2015 (LIKE exam_record); 


解法

要求处理:

  • 把很久前的(2011到2014年)备份表都删掉(如果存在的话)

分析:

  • 把很久前的(2011到2014年)备份表都删掉(如果存在的话),删除语法:

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n]

查看现有数据库里的表:

SHOW TABLES;

按需求删除:

drop table 
if exists 
exam_record_2011,
exam_record_2012,
exam_record_2013,
exam_record_2014;


得到预期的结果:

扩展

  • 删除有外键约束的主表:直接删除主表会报错,有两种方式可解决:

    • 一种方式是先删除有外键约束的从表,再删除主表;
    • 另一种方式为先解除外键约束,再删除主表 。

我是虚竹哥,我们明天见~

以上是关于第10天SQL进阶-表的创建修改与删除(SQL 小虚竹)的主要内容,如果未能解决你的问题,请参考以下文章

第9天SQL进阶-删除记录(SQL 小虚竹)

第13天SQL进阶-索引的隐藏索引(SQL 小虚竹)

第23天SQL进阶-查询优化- performance_schema系列五:数据库对象事件与属性统计(SQL 小虚竹)

第23天SQL进阶-查询优化- performance_schema系列五:数据库对象事件与属性统计(SQL 小虚竹)

第25天SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(全局读锁)(SQL 小虚竹)

第25天SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(全局读锁)(SQL 小虚竹)