惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
T
Threatpost
Latest news
Latest news
N
News | PayPal Newsroom
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
The Last Watchdog
The Last Watchdog
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
O
OpenAI News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Securelist
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
Cisco Talos Blog
Cisco Talos Blog
云风的 BLOG
云风的 BLOG
AWS News Blog
AWS News Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
美团技术团队
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
S
Schneier on Security
博客园 - 聂微东
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
SecWiki News
SecWiki News
S
Secure Thoughts
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
腾讯CDC
H
Heimdal Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy International News Feed

博客园 - 早上六点半遇见五月天

PHP 关于用判断is_resource函数判断 CURL 句柄,在 PHP 7.2+ 版本有一个重要变化! mysql 存储不过1000个中文选什么数据类型 PHP curl 模拟GET请求接口报错HTTP Status 400 – Bad Request 问题 删除所有的php-fpm进程命令 利用Navicat premium实现将数据从Oracle导入到MySQL Mac版phpstorm 一次性折叠所有函数/方法的快捷键 Mac 多次killall php-fpm之后会php-fpm会自动启动 解决方法 PHP 常用的字符串函数 MySQL 表示日期的数据类型 同一局域网下Mac无法远程连接至win7报错:Unable to connect to remote PC. MySQL 支持的存储引擎 设计模式之单例模式 设计模式的原则和法则 GoF的23种设计模式分类和功能 PHP 跨域之header Mac brew安装的php修改了php.ini之后如何重启php? PHP 文件上传之如何识别文件伪装?——PHP的fileinfo扩展可! PHP 超全局变量之$_FILES PHP 超全局变量之$GLOBALS
MySQL 数据定义语言(DDL)
早上六点半遇见五月天 · 2020-03-23 · via 博客园 - 早上六点半遇见五月天

参考资料:C语言中文网

SQL 包含以下 4 部分:
    1    数据定义语言(DDL):DROP、CREATE、ALTER 等语句。
    2    数据操作语言(DML):INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
    3    数据查询语言(DQL):SELECT 语句。
    4    数据控制语言(DCL): GRANT、REVOKE、COMMIT、ROLLBACK 等语句。

MySQL之DDL(Data Definition Language): 数据定义语言:CREATE,ALTER,DROP等

DDL:操作数据库,表(CRUD)

1、操作数据库(CRUD)

(1)C(Create):创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名
[[DEFAULT] CHARACTER SET 字符集名]
[[DEFAULT] COLLATE 校对规则名];

[ ]中的内容是可选的。
语法说明如下:
数据库名:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。
IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
[DEFAULT] CHARACTER SET:指定数据库的字符集。指定字符集的目的是为了避免在数据库中存储的数据出现乱码的情况。如果在创建数据库时不指定字符集,那么就使用系统的默认字符集。
[DEFAULT] COLLATE:指定字符集的默认校对规则。

eg.

mysql> CREATE DATABASE IF NOT EXISTS test
    -> DEFAULT CHARACTER SET utf8
    -> DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected, 1 warning (0.01 sec)

(2)R(Retrieve):查询

SHOW DATABASES [LIKE '数据库名'];

语法说明如下:
LIKE 从句是可选项,用于匹配指定的数据库名称。LIKE 从句可以部分匹配,也可以完全匹配。
数据库名由单引号' '包围。

eg.查询全部

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |         |
| mqcms              |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sys                |
| test               |
| test_aa            |
| ultrax             |
+--------------------+
9 rows in set (0.00 sec)

eg.查询某一个(我有test和test_aa两个库)

mysql> show databases like 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+
1 row in set (0.00 sec)
mysql> show databases like '%test%';
+-------------------+
| Database (%test%) |
+-------------------+
| dedetest          |
| test              |
| test_aa           |
+-------------------+
3 rows in set (0.00 sec)

这里的like跟模糊查询一样%aa%;%aa;aa%;

eg.查询某个数据库的创建语言

mysql> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

(3)U(Update):修改

ALTER DATABASE [数据库名] { 
[ DEFAULT ] CHARACTER SET <字符集名> |
[ DEFAULT ] COLLATE <校对规则名>}

语法说明如下:
ALTER DATABASE 用于更改数据库的全局特性。
使用 ALTER DATABASE 需要获得数据库 ALTER 权限。
数据库名称可以忽略,此时语句对应于默认数据库。
CHARACTER SET 子句用于更改默认的数据库字符集。

eg.修改数据库test的字符集

mysql> ALTER DATABASE test
    -> DEFAULT CHARACTER SET gb2312
    -> DEFAULT COLLATE gb2312_chinese_ci;
Query OK, 1 row affected (0.02 sec)


mysql> show create database test;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gb2312 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

(4)D(Delete):删除

DROP DATABASE [ IF EXISTS ] <数据库名>

语法说明如下:
<数据库名>:指定要删除的数据库名。
IF EXISTS:用于防止当数据库不存在时发生错误。
DROP DATABASE:删除数据库中的所有表格并同时删除数据库。使用此语句时要非常小心,以免错误删除。如果要使用 DROP DATABASE,需要获得数据库 DROP 权限。

注意:MySQL 安装后,系统会自动创建名为 information_schema 和 mysql 的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MySQL 将不能正常工作。

使用 DROP DATABASE 命令时要非常谨慎,在执行该命令后,MySQL 不会给出任何提示确认信息。DROP DATABASE 删除数据库后,数据库中存储的所有数据表和数据也将一同被删除,而且不能恢复。因此最好在删除数据库之前先将数据库进行备份。

eg.删除数据库test_aa;

mysql> DROP DATABASE IF EXISTS test_aa;
Query OK, 0 rows affected (0.02 sec)

mysql> show databases like 'test%';
+------------------+
| Database (test%) |
+------------------+
| test             |
+------------------+
1 row in set (0.00 sec)

2、操作数据表(CRUD)

(1)C(Create)创建表

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

其中,[表定义选项]的格式为:
<列名1> <类型1> [,…] <列名n> <类型n>


CREATE TABLE 语句的主要语法及使用说明如下:
CREATE TABLE:用于创建给定名称的表,必须拥有表CREATE的权限。
<表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。表名称被指定为 db_name.tbl_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db-name。如果使用加引号的识别名,则应对数据库和表名称分别加引号。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。
<表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。
默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。

eg.创建一张测试表test_tbl;

字段名称 字段类型 字段备注
id int(11) ID
name varchar(20) 名称
age int(11) 年龄
sex tinyint(4) 性别0 男 1女 2 未知
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| board          |
| data           |
+----------------+
2 rows in set (0.01 sec)


mysql> CREATE TABLE test_tbl
    -> (
    -> id INT(11),
    -> name VARCHAR(20),
    -> age INT(11),
    -> sex TINYINT(4)
    -> );
Query OK, 0 rows affected (0.03 sec)

复制表结构:

 CREATE TABLE <数据表名> like <被复制的表名>;

eg.

mysql> CREATE TABLE test_tbl_cp like test_tbl;
Query OK, 0 rows affected (0.01 sec)

(2)R(Retrieve)查看表

查看所有表:

eg.

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| board          |
| data           |
| test_tbl       |
| test_tbl_cp    |
+----------------+
4 rows in set (0.00 sec)

查看表结构:

DESCRIBE <表名>;

或简写成:
DESC <表名>;

DESCRIBE/DESC 语句可以查看表的字段信息,包括字段名、字段数据类型、是否为主键、是否有默认值等

eg.

mysql> DESC test_tbl;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
| sex   | tinyint(4)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

其中,各个字段的含义如下:
Null:表示该列是否可以存储 NULL 值。
Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分,UNI 表示该列是 UNIQUE 索引的一部分,MUL 表示在列中某个给定值允许出现多次。
Default:表示该列是否有默认值,如果有,值是多少。
Extra:表示可以获取的与给定列有关的附加信息,如 AUTO_INCREMENT 等。

SHOW CREATE TABLE语句可以用来显示创建表时的CREATE TABLE语句:

SHOW CREATE TABLE <表名>\G;

提示:使用 SHOW CREATE TABLE 语句不仅可以查看创建表时的详细语句,而且可以查看存储引擎和字符编码。如果不加“\G”参数,显示的结果可能非常混乱,加上“\G”参数之后,可使显示的结果更加直观,易于查看。

eg.

mysql> show create table test_tbl\G;
*************************** 1. row ***************************
       Table: test_tbl
Create Table: CREATE TABLE `test_tbl` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)

(3)U(Update)修改

ALTER TABLE <表名> [修改选项]
修改选项的语法格式如下:
{ 
ADD COLUMN <列名> <类型> | CHANGE COLUMN <旧列名> <新列名> <新列类型> | ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT } | MODIFY COLUMN <列名> <类型> | DROP COLUMN <列名> | RENAME TO <新表名>
}

 添加字段:

ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名]
新字段名为需要添加的字段的名称;FIRST 为可选参数,其作用是将新添加的字段设置为表的第一个字段;AFTER 为可选参数,其作用是将新添加的字段添加到指定的已存在的字段名的后面。
 

eg.在表test_tbl的name后面添加新字段name_cp:

mysql> ALTER TABLE test_tbl ADD name_cp VARCHAR(20) AFTER name;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test_tbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| name_cp | varchar(20) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| sex     | tinyint(4)  | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

修改字段名称:

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

其中,旧字段名指修改前的字段名;新字段名指修改后的字段名;新数据类型指修改后的数据类型,如果不需要修改字段的数据类型,可以将新数据类型设置成与原来一样,但数据类型不能为空。

 eg.修改name的名称改为names

mysql> ALTER TABLE test_tbl
    -> CHANGE name names VARCHAR(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test_tbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| names   | varchar(20) | YES  |     | NULL    |       |
| name_cp | varchar(20) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| sex     | tinyint(4)  | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec) 

修改/删除字段默认值:

ALTER TABLE <表名> ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }

eg.将字段sex的默认值改为2

mysql> ALTER TABLE test_tbl ALTER sex SET DEFAULT 2;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test_tbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| names   | varchar(20) | YES  |     | NULL    |       |
| name_cp | varchar(50) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| sex     | tinyint(4)  | YES  |     | 2       |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

修改字段类型:

ALTER TABLE <表名> MODIFY <字段名> <数据类型>

其中,表名指要修改数据类型的字段所在表的名称,字段名指需要修改的字段,数据类型指修改后字段的新数据类型。

 eg.修改name_cp的数据类型varchar(50)

mysql> ALTER TABLE test_tbl 
    -> MODIFY name_cp varchar(50);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test_tbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| name_cp | varchar(50) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| sex     | tinyint(4)  | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

删除字段:

ALTER TABLE <表名> DROP <字段名>;

其中,字段名指需要从表中删除的字段的名称。

 eg.删除sex字段

mysql> ALTER TABLE test_tbl
    -> DROP sex;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test_tbl;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | YES  |     | NULL    |       |
| names   | varchar(20) | YES  |     | NULL    |       |
| name_cp | varchar(50) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

修改表名:

ALTER TABLE <旧表名> RENAME [TO] <新表名>

其中,TO 为可选参数,使用与否均不影响结果。

 eg.修改表名test_tbl改为test_tb;

mysql> ALTER TABLE test_tbl
    -> RENAME TO test_tb;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| board          |
| data           |
| test_tb        |
| test_tbl_cp    |
+----------------+
4 rows in set (0.00 sec)

 (4)D(Delete)删除表

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]


对语法格式的说明如下:
表名1, 表名2, 表名3 ...表示要被删除的数据表的名称。DROP TABLE 可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。
IF EXISTS 用于在删除数据表之前判断该表是否存在。如果不加 IF EXISTS,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上 IF EXISTS 后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。

两点注意:
用户必须拥有执行 DROP TABLE 命令的权限,否则数据表不会被删除。
表被删除时,用户在该表上的权限不会自动删除。

eg.删除表test_tbl_cp

mysql> DROP TABLE test_tbl_cp;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| board          |
| data           |
| test_tb        |
+----------------+
3 rows in set (0.00 sec)