文章目录

  • SQL的概念
  • 什么是SQL
  • SQL作用
  • SQL语句分类
  • SQL通用语法
  • 用户管理与权限管理
  • 用户管理
  • 查看用户
  • 创建用户
  • 修改用户
  • 方法1:用alter修改用户密码
  • 方法2:用mysqladmin
  • 方法3:忘记root密码,需要重置root密码**
  • 删除用户
  • 权限管理
  • 用户授权
  • 查看用户权限
  • 取消用户授权
  • 数据定义语言(DDL)
  • 操作数据库
  • 创建数据库
  • 1. 直接创建数据库
  • 2. 判断是否存在并创建数据库(了解)
  • 3. 创建数据库并指定字符集(了解)
  • 4. 具体操作:
  • 查看数据库
  • 1. 查看所有的数据库
  • 2. 查看某个数据库的定义信息
  • 修改数据库
  • 删除数据库
  • 使用数据库
  • 操作表
  • 创建表
  • MySQL的数值数据类型
  • 整数类型
  • 浮点数类型
  • 定点小数类型
  • MySQL 数值类型溢出处理(了解)
  • MySQL的日期时间数据类型
  • MySQL的字符串类型
  • 查看表
  • 快速创建一个表结构相同的表
  • 删除表
  • 修改表结构
  • 1. 添加表列
  • 2.修改列类型
  • 3.修改列名
  • 4.删除列
  • 5.修改表名
  • 6. 修改字符集



学习目标:

  • 了解并学习SQL语句
  • 学会对数据库用户的操作
  • 学会对数据库的增删改查
  • 学会对数据表的增删改查

SQL的概念

什么是SQL

结构化查询语言(Structured Query Language)简称SQL,SQL语句就是对数据库进行操作的一种语言,类似数据库的数据库。

SQL作用

通过SQL语句我们可以方便的操作数据库中的数据、表、数据库。 SQL是数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。

SQL语句分类

  1. DDL(Data Definition Language)数据定义语言:用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等
  2. DML(Data Manipulation Language)数据操作语言:用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
  3. DQL(Data Query Language) 数据查询语言:DQL语言并不是属于MYSQL官方的分类,但是对数据库的操作最多就是查询,所以把查询语句的语句称作为DQL语言
  4. DCL(Data Control Language)数据控制语言:用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE等
  5. TCL(Transaction Control Language) 事务控制语言或TPL事务处理语言:用于控制数据库的事务操作,关键字; COMMIT,SAVEPOINT,ROLLBACK等
  6. CCL(Cursor Control Language)指针控制语言:像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。多用于存储过程中对结果集的处理。

SQL通用语法

  • SQL语句可以单行或多行书写,以分号结尾。
  • 可使用空格和缩进来增强语句的可读性。
  • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
    语法:SELECT 字段名 FROM 表名;

SELECT * FROM student;

三种注释:

  • 单行注释: – 注释内容
  • # 注释内容(mysql特有)
  • 多行注释: /* 注释 */

用户管理与权限管理

用户管理

查看用户

语法:select host,user,authentication_string from mysql.user;

select host,user,authentication_string from mysql.user;

mysql是MySQL数据库中的系统库,所有用户、权限、密码、时区等信息都存放在这个库里。

库名.表名的方式可以让我们跨库来引用某个特定库的表。

mysql sql 45讲笔记 sql mysql 基础教程_数据库

代码

含义

localhost

仅本机

%

无限制

IP地址(192.168.1.1)

只有对应ip的可以访问

  • host:用户主机名,见上图
  • user:用户名/连接数据库的账号
  • authentication_string:加密后的密码

创建用户

语法:create user “用户名”@“主机名” identified by “密码”;

create user “abc”@“%” identified by “123”;

创建一个谁都可以连接(%)的账号:abc,密码为:123

修改用户

方法1:用alter修改用户密码

首先需要以root身份登录MySQL,然后再输入以下代码:
语法:create user “用户名”@“主机名” identified by “密码”;

ALTER USER ‘abc’@‘%’ IDENTIFIED BY ‘456’;
//刷新数据库,不然需要重新开启
flush privileges;

将谁都可以连接(%)的账号:abc的密码改为’456’

方法2:用mysqladmin

需要使用cmd来输入
需要使用cmd来输入
需要使用cmd来输入
语法:mysqladmin -u用户名 -p旧密码 password 新密码";

mysqladmin -uabc -p123 password 456

结果同上

方法3:忘记root密码,需要重置root密码**

详细请看这里

删除用户

drop user 用户名@‘主机名’;

drop user abc@‘%’;

删除访问权限是公共,账号是abc的。

权限管理

用户授权

初始创建的用户是不能访问数据库的,因为没有权限,因此我们需要给予权限

权限码

权限范围

all

所有权限

select

查询权限

delete

删除权限

update

更新权限

create

创建权限

drop

删除数据库。数据表权限

语法:grant 权限码 on 数据库名.表名 to 用户名@主机名’;

grant select on mysql.* to abc@%';
FLUSH PRIVILEGES;

给予公共的abc对mysql的所有表的查询权限

查看用户权限

语法:show grants for 用户名@主机名;

show grants for ‘abc’@‘%’;

显示公共的abc的所有权限

取消用户授权

语法:REVOKE 权限码 ON 库名.表名 FROM 用户名@主机名;

REVOKE select ON mysql.* FROM abc@%;

取消公共的abc账号的查询mysql数据库的权限


数据定义语言(DDL)

操作数据库

创建数据库

1. 直接创建数据库

CREATE DATABASE 数据库名;

2. 判断是否存在并创建数据库(了解)

CREATE DATABASE IF NOT EXISTS 数据库名;

3. 创建数据库并指定字符集(了解)

CREATE DATABASE 数据库名 CHARACTER SET 字符集;

4. 具体操作:
  • 直接创建数据库db1

CREATE DATABASE db1;

mysql sql 45讲笔记 sql mysql 基础教程_sql_02

  • 判断是否存在并创建数据库db2

CREATE DATABASE IF NOT EXISTS db2;

mysql sql 45讲笔记 sql mysql 基础教程_数据库_03

  • 创建数据库并指定字符集为gbk

CREATE DATABASE db3 CHARACTER SET gbk;

mysql sql 45讲笔记 sql mysql 基础教程_数据库_04

查看数据库

1. 查看所有的数据库

SHOW databases;

2. 查看某个数据库的定义信息

语法:SHOW CREATE DATABASE 数据库名;
具体操作:

  • 显示数据库a里面的所有表

SHOW CREATE DATABASE a;

修改数据库

语法:ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

具体操作:

  • 语法:DROP DATABASE 数据库名;

ALTER DATABASE db3 DEFAULT CHARACTER SET utf8;

将db3数据库的字符集改成utf8

删除数据库

具体操作:

  • 删除db2数据库

DROP DATABASE db2;

使用数据库

  1. 查看正在使用的数据库

SELECT DATABASE();

  1. 使用/切换数据库

USE 数据库名;

具体操作:

  • 查看正在使用的数据库

SELECT DATABASE();

  • 使用db1数据库

USE db1;


操作表

如果已执行 use 数据库名; 可以省略数据库名。

创建表

语法:

CREATE TABLE [IF NOT EXISTS] 表名 (
   字段名 字段类型 [ primary key | unique | not null | auto_increment |
      | binary | default 缺省值 | comment 注释语句],
   ......
) [ ENGINE=InnoDB | DEFAULT CHARSET=utf8 ];

表可选项:

if not exists:如果不存在就执行

engine:设置数据引擎,默认为innodb

default charset:设置默认字符编码,可以简写成charset

字段可选项:

primary key:主键,值唯一,不可为null

unique:唯一键,值唯一,可以为null

not null:不可为null,不写这一项,则默认为可以接受null值

auto_increment:自动增长,只能与整数类型搭配,默认每次增长1

binary:与字符类型搭配,在字段比较时大小写敏感

default:设置缺省值,若插入值为null时,则使用默认值填充

comment:设置字段注释

示例:

mysql sql 45讲笔记 sql mysql 基础教程_sql_05


MySQL的数值数据类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

整数类型

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 字节

(-128,127) FF 1111 1111

(0,255)

小整数值

SMALLINT

2 字节

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 字节

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 字节

(-2,147,483,648,2,147,483,647)

(0,4 294 967 295)

大整数值

BIGINT

8 字节

(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)

(0,18 446 744 073 709 551 615)

极大整数值

关键字INTINTEGER的同义词,关键字DECDECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。表显示了需要的每个整数类型的存储和范围。
TINYINT,1字节,8位,16进制最大表示为FF,2进制表示最大为1111 1111,有符号,第一位为符号为(整数为0,负数为1),所以整数最大值为0111 1111(127),负数最大值为1111 1111(-128),无符号的最大值是255。

  • 可以用unsigned控制是否有符号位
  • 可以使用zerofill控制是否有前导零
  • 也存在布尔类型。首先mysql是不支持布尔类型的,当把一个数据设置成布尔类型的时候,数据库会自动转换成tinyint(1)的数据类型,其实这个就是变相的布尔。 默认值也就是1,0两种,分别对应了布尔类型的true和false。
  • 类型后面(1),代表的显示长度,只有跟zerofill配合起来才能用。简单地说,没有(1),会显示成00x数字,具体连数字带前导零总共几位,有(n)来限制。
    我们在这里测试一下。
create table test1 (
c1 TINYINT,
c2 tinyint UNSIGNED,
c3 tinyint ZEROFILL );

然后执行sql,分别看看执行结果,分析报错信息。

insert into test1 values(1, 2, 3);
insert into test1 values(-1, 2, 3);
insert into test1 values(1, -2, 3);
insert into test1 values(1, 2, -3);
insert into test1 values(127, 2, -3);
insert into test1 values(-128, 128, 3);
insert into test1 values(-128, 256, 255);

总结:zerofill具备unsigned的隐藏属性,不能存负值。

SMALLINT,2字节,16位,16进制最大表示为FFFF。

MEDIUMINT,3字节,24位,16进制最大表示为FF FFFF。

INTINTEGER ,4字节,32位 ,16进制最大表示为FFFF FFFF。

BIGINT,8字节,64位 ,16进制最大表示为FFFF FFFF FFFF FFFF。

这些类型都可以用unsigned和zerofill修饰。

浮点数类型

类型

大小

范围(有符号)

范围(无符号)

用途

FLOAT

4 字节

(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)

0,(1.175 494 351 E-38,3.402 823 466 E+38)

单精度 浮点数值

DOUBLE

8 字节

(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

双精度 浮点数值

科学计数法,0.123 * 10^1。

创建该类型字段时,可以设置(M,D)模式控制数值范围

create table test4 (
  f1 float,
  f2 float(5, 2),
  f3 float(16,4)
);

insert into test4 values (123.456789, 123.456789, 123.456789);
insert into test4 values (1234.56789, 1234.56789, 1234.56789);
insert into test4 values (12345.6789, 12345.6789, 12345.6789);
insert into test4 values (123456.789, 123456.789, 123456.789);
insert into test4 values (1234567.89, 1234567.89, 1234567.89);
insert into test4 values (12345678.9, 12345678.9, 12345678.9);
insert into test4 values (123456789, 123456789, 123456789);
select * from test4;

从上面看出:默认的float类型都只能存6个数字(包括小数点前后的位数),整数超过6位就被科学计数表示(id=4),小数位超出则需要四舍五入。

float(m,d):小数点后位数为d,即整数位数为(m-d),整数位超出则整数为(m-d)个,小数点后位数为(d)个9999,不用科学计算了;若小数位超出,则需要四舍五入。

单精度浮点数的精度是不高的,我们可以试试double。

drop table test5;
create table test5 (
  d1 double,
  d2 double(5, 2),
  d3 double(16, 4)
);

insert into test5 values (123.456789, 123.456789, 123.456789);
insert into test5 values (1234.56789, 1234.56789, 1234.56789);
insert into test5 values (12345.6789, 12345.6789, 12345.6789);
insert into test5 values (123456.789, 123456.789, 123456.789);
insert into test5 values (1234567.89, 1234567.89, 1234567.89);
insert into test5 values (12345678.9, 12345678.9, 12345678.9);
insert into test5 values (123456789, 123456789, 123456789);

双精度浮点型的有效精度更高(16位左右),可以容纳更多的值。

定点小数类型

类型

大小

范围(有符号)

范围(无符号)

用途

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2

依赖于M和D的值

依赖于M和D的值

小数值

我们创建一个包含decimal类型字段的表

drop table test6;
create table test6 (
  d1 decimal,
  d2 decimal(6, 2),
  d3 decimal(32, 4)
);
insert into test6 values (123.456789, 123.456789, 123.456789);
insert into test6 values (1234.56789, 1234.56789, 1234.56789);
insert into test6 values (12345.6789, 12345.6789, 12345.6789);
insert into test6 values (123456.789, 123456.789, 123456.789);
insert into test6 values (1234567.89, 1234567.89, 1234567.89);
insert into test6 values (12345678.9, 12345678.9, 12345678.9);

decimal型的默认整数位为10,小数位为0,即默认为整数。

在MySQL中,定点数以字符串形式存储,因此,其精度比浮点数要高,而且浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数decimal比较安全。

MySQL 数值类型溢出处理(了解)

当 MySQL 在某个数值列上存储超出列数据类型允许范围的值时,结果取决于当时生效的 SQL 模式

  • 如果启用了严格的 SQL 模式,则 MySQL 会根据 SQL 标准拒绝带有错误的超出范围的值,并且插入失败。
SET sql_mode = 'TRADITIONAL'; -- 将当前会话的模式设置严格模式
  • 如果没有启用任何限制模式,那么 MySQL 会将值裁剪到列数据类型范围的上下限值并存储
  • 当超出范围的值分配给整数列时,MySQL 会存储表示列数据类型范围的相应端点的值
  • 当为浮点或定点列分配的值超出指定(或默认)精度和比例所隐含的范围时,MySQL 会存储表示该范围的相应端点的值
SET sql_mode = ''; -- 禁用所有模式

不光是insert 的时候,其他时候也可能会触发数值溢出。

数值表达式求值过程中的溢出会导致错误,例如,因为最大的有符号 BIGINT 值是 9223372036854775807,因此以下表达式会产生错误。

mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

为了在这种情况下使操作成功,需要将值转换为 unsigned

mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+
1 row in set (0.00 sec)

整数数值之间的减去,如果其中一个类型为 UNSIGNED ,默认情况下会生成无符号结果。如果为负,则会引发错误。

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

这种情况下,如果启用了 NO_UNSIGNED_SUBTRACTION SQL 模式,则结果为负。

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
1 row in set (0.00 sec)

如果此类操作的结果用于更新 UNSIGNED 整数列,则结果将裁剪为列类型的最大值,如果启用了 NO_UNSIGNED_SUBTRACTION 则裁剪为 0。但如果启用了严格的 SQL 模式,则会发生错误并且列保持不变。

MySQL的日期时间数据类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

日期时间类型

占用空间

日期格式

最小值

最大值

零值表示

DATETIME

8 bytes

YYYY-MM-DD HH:MM:SS

1000-01-01 00:00:00

9999-12-31 23:59:59

0000-00-00 00:00:00

TIMESTAMP

4 bytes

YYYY-MM-DD HH:MM:SS

1970-01-01 00:00:00

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

00000000000000

DATE

4 bytes

YYYY-MM-DD

1000-01-01

9999-12-31

0000-00-00

TIME

3 bytes

HH:MM:SS

-838:59:59

838:59:59

00:00:00

YEAR

1 bytes

YYYY

1901

2155

0000

我们来创建 一个表试试。

drop table dt01;
create table dt01(
  d1 year,
  d2 date,
  d3 time,
  d4 datetime,
  d5 timestamp
);

insert into dt01 values ('2020', '2020-3-4', '3:4:5','2020-3-4 3:4:5', null);
insert into dt01 values ('2020', '20200304', '131415','20200304131415', CURRENT_TIMESTAMP);
insert into dt01 values ('2020', '2020-3-4', '3:4:5','2020-3-4 3:4:5', CURRENT_TIMESTAMP);
insert into dt01 values ('2020', '2020:3:4', '03:04:05','2020:3:4 3:4:5', CURRENT_TIMESTAMP);
insert into dt01 values ('2020', '2020-3-4', '3:4:5',
STR_TO_DATE('2019-12-5 7:8:9', '%Y-%m-%d %H:%i:%s'), CURRENT_TIMESTAMP);
insert into dt01 values ('2020', '2020-3-4', '3:4:5',
STR_TO_DATE('2019*12*5 7&8&9', '%Y*%m*%d %H&%i&%s'), CURRENT_TIMESTAMP);
insert into dt01 values ('2020', '2020-3-4', '3:4:5',
STR_TO_DATE('2019年12月12日 7时8分9秒', '%Y年%m月%d日 %H时%i分%s秒'), CURRENT_TIMESTAMP);

日期时间类型转换成格式字符串,可以使用这种方法。

select date_format(now(), ‘%Y-%m-%d %H:%i:%s’);

格式字符串转换成日期时间类型,可以使用这个函数

STR_TO_DATE('2019-12-5 7:8:9', '%Y-%m-%d %H:%i:%s')

format可以使用的值为:

%M 月名字(January……December)

%W 星期名字(Sunday……Saturday)

%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)

%Y 年, 数字, 4 位

%y 年, 数字, 2 位

%a 缩写的星期名字(Sun……Sat)

%d 月份中的天数, 数字(00……31)

%e 月份中的天数, 数字(0……31)

%m 月, 数字(01……12)

%c 月, 数字(1……12)

%b 缩写的月份名字(Jan……Dec)

%j 一年中的天数(001……366)

%H 小时(00……23)

%k 小时(0……23)

%h 小时(01……12)

%I 小时(01……12)

%l 小时(1……12)

%i 分钟, 数字(00……59)

%r 时间,12 小时(hh:mm:ss [AP]M)

%T 时间,24 小时(hh:mm:ss)

%S 秒(00……59) %s 秒(00……59)

%p AM或PM

%w 一个星期中的天数(0=Sunday ……6=Saturday )

%U 星期(0……52), 这里星期天是星期的第一天

%u 星期(0……52), 这里星期一是星期的第一天

%% 一个文字“%”。

MySQL的字符串类型

类型

大小

用途

CHAR(n)

0-255字符(*字符集字节数)

定长字符串

VARCHAR(2000)

0-65535 字节

变长字符串

TINYBLOB

0-255字节

不超过 255 个字符的二进制字符串

TINYTEXT

0-255字节

短文本字符串

BLOB

0-65 535字节

二进制形式的长文本数据

TEXT

0-65 535字节

长文本数据

MEDIUMBLOB

0-16 777 215字节

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215字节

中等长度文本数据

LONGBLOB

0-4 294 967 295字节

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295字节

极大文本数据

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换,CHAR删除尾部的空格,VARCHAR则保留尾部的空格。

因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后,系统都会在数据后面增加1-2个字节的额外开销:是用来保存数据所占用的空间长度

如果数据本身小于127个字符:额外开销一个字节;如果大于127个,就开销两个字节。

最大长度根据字符集换算,GBK每个字符2个字节,UTF8每个字符3个字节,utf8mb4每个字符4字节,那么

在GBK字符集下,varchar最大长度32766,UTF8最大长度21844,UTF8MB4最大长度16384。

我们来验证一下

create table test7 (
  test_char varchar(21845)
) character set utf8;
create table test7 (
  test_char varchar(32766)
) character set gbk;
create table test7 (
  test_char varchar(16383)
) character set utf8mb4;

还有一个有趣的现象,mysql表的每行记录字节总和不能超过65535。

create table test7 (
  c1 char(100),
  c2 varchar(21845)
) character set utf8;

create table test7 (
  c1 char(100),
  c2 varchar(21744)
) character set utf8;

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

1.BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
2.BLOB存储的数据只能整体读出。
3.TEXT可以指定字符集,BLOB不用指定字符集。

查看表

  1. 查看某个数据库中的所有表
    SHOW TABLES;
  2. 查看表结构
    DESC 表名;
  3. 查看创建表的SQL语句
    SHOW CREATE TABLE 表名;

具体操作:

  • 查看mysql数据库中的所有表

SHOW TABLES;

mysql sql 45讲笔记 sql mysql 基础教程_SQL_06

  • 查看student的创建表SQL语句

SHOW CREATE TABLE student;``

mysql sql 45讲笔记 sql mysql 基础教程_mysql_07

快速创建一个表结构相同的表

CREATE TABLE 新表名 LIKE 旧表名;

具体操作:

  • 创建s1表,s1表结构和student表结构相同
    CREATE TABLE s1 LIKE student;

mysql sql 45讲笔记 sql mysql 基础教程_SQL_08

删除表

  1. 直接删除表
    DROP TABLE 表名;
  2. 判断表是否存在并删除表(了解)
    DROP TABLE IF EXISTS 表名;

具体操作:

  • 直接删除表s1表
    DROP TABLE s1;
  • 判断表是否存在并删除s1表
    DROP TABLE IF EXISTS s1;

修改表结构

修改表结构使用不是很频繁,只需要知道下,等需要使用的时候再回来查即可

1. 添加表列

ALTER TABLE 表名 ADD 列名 类型;

具体操作:

  • 为学生表添加一个新的字段remark,类型为varchar(20)
ALTER TABLE student ADD remark VARCHAR(20);

mysql sql 45讲笔记 sql mysql 基础教程_mysql sql 45讲笔记_09

2.修改列类型

ALTER TABLE 表名 MODIFY 列名 新的类型; 具体操作:

  • 将student表中的remark字段的改成varchar(100)
ALTER TABLE student MODIFY remark VARCHAR(100);

mysql sql 45讲笔记 sql mysql 基础教程_mysql_10

3.修改列名

ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; 具体操作:

  • 将student表中的remark字段名改成intro,类型varchar(30)
ALTER TABLE student CHANGE remark intro varchar(30);

mysql sql 45讲笔记 sql mysql 基础教程_SQL_11

4.删除列

ALTER TABLE 表名 DROP 列名; 具体操作:

  • 删除student表中的字段intro
ALTER TABLE student DROP intro;

mysql sql 45讲笔记 sql mysql 基础教程_SQL_12

5.修改表名

RENAME TABLE 表名 TO 新表名; 具体操作:

  • 将学生表student改名成student2
RENAME TABLE student TO student2;

mysql sql 45讲笔记 sql mysql 基础教程_mysql_13

6. 修改字符集

ALTER TABLE 表名 character set 字符集; 具体操作:

  • 将sutden2表的编码修改成gbk
ALTER TABLE student2 character set gbk;

mysql sql 45讲笔记 sql mysql 基础教程_SQL_14