SQL 介绍
# SQL 介绍
# SQL 是什么?分类?
# 结构化查询语言
结构化查询语言(Structured Query Language)
- DSL 语言
- 是一种所有关系型数据库的查询规范,不同的数据库都支持。
- 通用的数据库操作语言,可以用在不同的数据库中。
- 不同的数据库 SQL 语句有一些区别,称为方言
DSL & DPL
- DSL:Domain-specific Language,特定领域语言,如 Groovy(Gradle使用的)
- DPL:通用编程语言,如 Java 等
# 分类
SQL语句分类
- DDL(Data Definition Language):数据定义语言 数据库、表的操作:CREATE / DROP / ALTER
- DML(Data Manipulation Language):数据操作语言 对表记录的操作:SELECT / INSERT / UPDATE / DELETE
- DQL(Data Query Language):数据查询语言,对表的记录进行查询
- DCL(Data Control Language):数据控制语言 确认或者取消对数据库中的数据进行的变更;对用户权限的设置; COMMIT / ROLLABCK / GRANT / REVOKE
# 标准 SQL & 语法
每隔几年,ANSI(美国国家标准协会)或 ISO(国际标准化组织)等便会修订 SQL 的标准,进行语法的修订并追加新功能。《SQL基础教程》编写时(2016 年 5 月)使用的是 2011 年修订的最新版本(SQL:2011)。但是,SQL 的标准并不强制RDBMS必须使用国际标准化组织(ISO)为 SQL 制定了相应的标准,以此为基准的 SQL 称为标准 SQL
标准SQL语法:
SQL语句可以在单行或多行书写,以**
;结尾**在 SQL 语句中直接书写的字符串、日期或者数字等称为常数
- 字符串、日期 需要用单引号
''括起来 - 数字不需要,直接写
- 字符串、日期 需要用单引号
只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称。名称必须以半角英文字母开头
单词之间需要使用半角空格或者换行符进行分隔。MySQL 中也可以使用双引号做为分隔符。
注释的三种写法
- 单行(MySQL需加空格):
--空格; - 多行:
/* */; - mysql特有:
#
- 单行(MySQL需加空格):
SQL不区别大小写(建议关键字使用大写,表名、别名、字段名等小写)。但是插入的数据是区分大小写的!
# MySQL语句使用注意事项
MySQL的基本运行过程就是:通过客户端程序发送命令给服务器程序,服务器程序按照接收的命令去操作实际的数据。在我们使用黑框框启动了MySQL客户端程序之后,界面上会一直显示一行字儿:mysql>,这是一个提示符,你可以在它后边输入我们的命令然后按下回车键就把命令从客户端程序发送到了服务器程序,在书写命令的时候需要注意下边这几点:
# 命令结束符号
在书写完一个命令之后需要以下边这几个符号之一结尾:
;\g\G
比如说我们执行一个简单的查询当前时间的命令:
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
其中的SELECT意味着这是一个查询命令,NOW()是MySQL内置的函数,用于返回当前时间。结果中1 row in set (0.00 sec)的意思是结果只有1行数据,用时0.00秒。使用\g可以起到一样的效果:
mysql> SELECT NOW()\g
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
\G有一点特殊,它并不以表格的形式返回查询结果,而是以垂直的形式将每个列都展示在单独的一行中:
mysql> SELECT NOW()\G
*************************** 1. row ***************************
NOW(): 2018-02-06 17:51:51
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
如果查询结果的列数非常多的话,使用\G可以让我们看清结果。
# 命令可以随意换行
并不是按了回车键就提交命令了,只要按回车键的时候输入的语句里没有;、\g或者\G这些语句结束符号,该语句就算是没结束。比如上边查询当前时间的命令还可以这么写:
mysql> SELECT
-> NOW()
-> ;
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 17:57:15 |
+---------------------+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
10
11
# 可以一次提交多个命令
我们可以在一条语句里写多个命令(命令之间用上面说的结束符分隔),比如这样:
mysql> SELECT NOW(); SELECT NOW(); SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
连着输入了3个查询当前时间的命令,只要没按回车键,就不会提交命令。把命令都写在文件里再批量执行同理。
# 使用\c放弃本次操作
如果你想放弃本次编写的命令,可以在输入的命令后边加上\c,比如这样:
mysql> SELECT NOW()\c
mysql>
2
如果不使用\c,那客户端会以为这是一个多行命令,还在一直傻傻的等你输入命令~
# 命令大小写问题
MySQL默认对命令的大小写并没有限制,也就是说我们这样查询当前时间也是可以的:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-02-06 18:23:01 |
+---------------------+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
不过按照习俗,这些命令、函数什么的都是要大写的,而一些名称类的东西,比如数据库名,表名、列名啥的都是要小写的
# 字符串的表示(推荐单引号)
在命令里有时会使用到字符串,我们可以使用单引号''或者双引号""把字符串内容引起来,比如这样:
mysql> SELECT 'aaa';
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
mysql>
2
3
4
5
6
7
8
9
这个语句只是简单的把字符串'aaa'又输出来了而已。但是一定要在字符串内容上加上引号,不然的话MySQL服务器会把它当作列名,比如这样就会返回一个错误:
mysql> SELECT aaa;
ERROR 1054 (42S22): Unknown column 'aaa' in 'field list'
mysql>
2
3
但是MySQL中有一种叫ANSI_QUOTES的模式,如果开启了这种模式,双引号就有其他特殊的用途了,至于是什么用途对于小白的你并不重要,你也不需要理解什么是个ANSI_QUOTES模式,重要的建议你最好使用单引号来表示字符串~
# MySQL 大小写问题 🔥
MySQL 在 Windows 下都不区分大小写,在 Linux 下,MySQL 对表名和数据库名是区分大小写的。
关于表名大小写的问题:
- Oracle:
SELECT * FROM HEROS与SELECT * FROM heros一样,因为 Oracle 会自动把SELECT * FROM heros转化为SELECT * FROM HEROS进行查询。数据库中存的表是大写的。 - MySQL:
SELECT * FROM HEROS与SELECT * FROM heros是否一样取决于参数lower_case_table_names,如lower_case_table_names=1,这两个查询是一样的。SELECT * FROM HEROS会自动转化为SELECT * FROM heros。因为数据库中存的表名是小写的。否则就有区别了。
关于字符大小写的问题:
- Oracle:
SELECT * FROM heros WHERE role_main = 'ZHANGSHI'与SELECT * FROM heros WHERE role_main = 'zhangshi'不一样,字符大小写敏感 - MySQL:
SELECT * FROM heros WHERE role_main = 'ZHANGSHI'与SELECT * FROM heros WHERE role_main = 'zhangshi'是否一样与该字段的collate定义有关