前言
尽管平时开发中常常接触 MySQL,但大多数的数据库操作都是通过 ORM 映射实现的,本人并没有从底层接触 SQL。
本文继 高级程序员的 SQL 拾遗 -①(增删改查)
次要内容包含:建库、建表、字段、束缚、查问等
理论开发过程中,与增删改查相比,建表、删表、束缚之类的这些低频操作更加不重要,因为数据库大部分工夫还是在增删改查(精确的说是查)。
所以本文的内容更不须要记,只需了解即可。
得益于弱小的可视化工具 Navicat(或者 PHPMyAdmin),咱们能够用鼠标实现建表,并转换成 SQL 语句。
能够说,如果会用 Navicat,SQL 语句就不须要记住了(因为能够用软件生成)。
一、玩转 Navicat
这个软件有 30 试用版,也能找到谐和版,可自行搜寻。
关上软件连贯到 MySQL 服务后,左侧会显示以后 MySQL 的所有数据库:
新建数据库(图形化)
在左侧任意数据库上右键 -> 新建数据库,输出信息即可。
(在此处须要科普一下,为什么要用 utf8mb4?
因为 MySQL 内置的 utf8 是阉割版,用 3 字符示意
而真正的 UTF- 8 是 1~4 可变字符,换言之 MySQL 的 utf8 并不能示意所有 UTF- 8 字符
而 utf8mb4 才是真正 4 字符的 UTF-8
这是 MySQL 的一个坑)
能够看到表 test1 曾经显示进去了,
这个操作用命令行怎么实现呢?
首先须要理解一下什么叫做“查问”
查问(Query)
SQL 终端输出的一组能够实现特定性能的 SQL 语句称为一个查问。
留神此处的 Query 并不是增删改查的查(SELECT),也绝不仅限于查。
能够了解成,所有 SQL 语句的执行过程都是查问过程。
也就是粗犷的简化成,查问 == 执行 SQL 语句
Query 不仅包含了 CRUD,还包含各种库操作、表操作。
接下来,在查问中用 SQL 建一个名为 test2 的数据库。
新建数据库(命令行)
首先在 Navicat 中新建查问(也就是新建一个输出 SQL 语句的性能)
输出 SQL 代码后执行
// 建设数据库
CREATE DATABASE 数据库名
// 示例:建设名为 test2 的数据库
CREATE DATABASE test2
刷新后就会呈现新增的数据库。
双击新建的库后,图标变成绿色,文章前面的内容都能够通过在此数据库的 Query 中操作。
同理,删除数据库的语句是:
·“
// 删除数据库
DROP DATABASE 数据库名
// 删除名为 test2 的数据库
DROP DATABASE test2
演示 Navicat 生成 SQL 语句
这是软件最神奇之处。
首先新建表,而后任意编辑表内字段。
编辑实现后不须要保留,此时点击 SQL 预览。
此时就能够发现,软件曾经主动为咱们生成了 SQL 语句:
这对于初学者学习 SQL 十分有帮忙,有利于在大脑中疾速建设某种性能和 SQL 代码的关联。
到此如果看明确并纯熟应用 Navicat,前面的内容就不必看了(不是)。
二、常见表操作
创立(CREATE)
当初咱们能够拿出方才 Navicat 生成的 SQL 代码来看看:
// 软件生成的 SQL 语句
CREATE TABLE `test2`.` 无标题 ` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NULL,
`sex` int(1) NULL,
`phone` varchar(255) NULL,
PRIMARY KEY (`id`)
);
咱们能够演绎出,创立表的写法是:
// 创立数据表
CREATE TABLE ` 数据库名 `.` 数据表名 ` (
` 字段 1` 字段 1 的属性,
` 字段 2` 字段 2 的属性,
......
` 字段 n` 字段 n 的属性,
)
留神此处相似单引号的符号并不是单引号'
,而是 TAB 上方的那个键。
助记:
- CREATE 指令实用于所有示意新增的性能,如新增数据库、数据表、索引等
- 库的操作对象是 DATABASE,而表的操作对象是 TABLE
- 新建数据表时须要写上表的字段和属性,而新建数据库不须要
用这种办法创立一个名为 table1 的数据表,接下来筹备看如何删除它。
删除(DROP)和清空(TRUNCATE)
SQL 的写法具备很强的规律性,咱们就是要把这种法则找进去以便了解和记忆。
// 删除某个数据表
DETELE TABLE 数据表名
// 举例:删除 table1 数据表
DETELE TABLE table1
助记:
- 和 CREATE 用法雷同,DROP 实用于所有示意删除的性能,如删除数据库、表、索引
- 库的操作对象是 DATABASE,标的操作对象是 TABLE
- 对于数据库和数据表,删除的语句构造都是 DELETE + 操作对象 + 对象名
对于表有一种非凡的操作,能够艰深的了解成清空表,即只删除数据不删除构造:
// 状况某个数据表的数据,但不扭转其构造
TRUNCATE TABLE table_name
// 举例:清空 table1
TRUNCATE TABLE table1
助记:
- 清空数据只能够对数据表应用
- 状况语句构造和删除语句只有指令不同,其余雷同
小结
此处类比数据库的建设、删除,总结了数据表的建设、删除、清空操作。
三、字段操作
前置条件:建一张名为 table2 的表,任意设置一些字段,相似如下:
软件主动生成了如下的 SQL 语句,如果读者懒得手动加字段,能够间接执行即可取得和本文一样的环境。
// 软件生成的 SQL 语句
CREATE TABLE `test2`.` 无标题 ` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) NULL COMMENT '姓名',
`age` int(11) NULL COMMENT '年龄',
`number` varchar(11) NULL COMMENT '学号',
PRIMARY KEY (`id`)
);
所以咱们又能总结出增加一个字段的写法:
// 最精简的字段写法
` 字段名 ` 类型(长度) 是否为空束缚,
// 带正文的字段写法
` 字段名 ` 类型(长度) 是否为空束缚 COMMENT '正文内容',
这里肯定要睁大眼睛,字段名是 TAB 上方的符号,而正文是单引号!
当初曾经晓得字段的写法,那么字段类型共有多少种呢?
实际上很多,图片里只是一小部分。
但最罕用的依然是 int、varchar、date、timestrap,
至于其余类型,须要用到的时候,先用 navicat 增加一个,再看看生成的 SQL 即可。
这就叫授人以渔(确信)。
束缚
“师爷,你给翻译翻译,什么叫束缚?”
“束缚就是束缚呗。”
束缚实质是对字段取值范畴的限定,
如果没有束缚,字段能够取其类型中的任何值
但有时不容许字段呈现 NULL 或者反复值等状况,这时就须要束缚了。
常见束缚包含:
- NOT NULL 不容许容许字段为空
- UNIQUE 不容许反复的值(例如学生的学号)
- DEFAULT 默认值
- 主键束缚
- 外键束缚
非空、惟一值、默认值很好了解。
在 Navicat 中点击设计表,增加两个字段,别离设置非空和默认值:
主动生成了以下 SQL 语句:
// 主动生成的 SQL 语句
ALTER TABLE `test2`.`table2`
ADD COLUMN `test_null` varchar(255) NOT NULL AFTER `number`,
ADD COLUMN `test_default` varchar(255) NULL DEFAULT 123123123 AFTER `test_null`;
这样就能够演绎出这些束缚的写法:
- 非空束缚应用
NOT NULL
,否则写NULL
- 默认值应用
DEFAULT 默认值
- 惟一值 Navicat 没有间接设置的选项,实际上应用
UNIQUE
接下来有一个问题:多种束缚同时写的时候,有没有程序要求?
来做个测试,同时设置非空和默认值,生成的语句,能够看到 null 在前,default 在后:
// 主动生成的 SQL 语句
ALTER TABLE `test2`.`table2`
ADD COLUMN `test_default` varchar(255) NOT NULL DEFAULT 123123123 AFTER `name`;
接下来调换地位,在 Query 中执行:
// 调换束缚的程序
ALTER TABLE `test2`.`table2`
ADD COLUMN `test_default` varchar(255) DEFAULT 123123123 NOT NULL AFTER `name`;
是能够胜利的,SQL 开发者没那么傻,必定会想到这一点。
小结
咱们能够调整上文提到的个别字段的写法:
// 个别状况下字段写法,其中束缚能够扭转程序
` 字段名 ` 类型(长度) 束缚 1 约数 2 ... COMMENT '备注内容',
四、总结
和上一篇文章不同,本文的内容简直齐全不必记,一是因为都是低频操作,二是因为曾经有很智能的生成工具,咱们不是 DBA,不会天天和建表删表打交道。
笔者认为更重要的是讲述如何生成 SQL,把握这项操作后,无论是什么没见过语句,都能够灵便面对了。