前言
尽管平时开发中常常接触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// 举例:清空table1TRUNCATE 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,把握这项操作后,无论是什么没见过语句,都能够灵便面对了。