SQL从入门到放弃系列——SQL函数[七]

算术函数。
字符串函数。
日期函数。
转换函数。
聚集函数。

算术函数

ABS()

取绝对值。

SELECT ABS(-2),运行结果为 2。

MOD()

取余。

SELECT MOD(101,3),运行结果 2。

ROUND()

四舍五入为指定小数位。两个参数,分别是字段名、小数位数。

SELECT ROUND(37.25,1),运行结果 37.3。

字符串函数

CONCAT()

拼接字符串。

SELECT CONCAT('abc', 123),运行结果为abc123。

LENGTH()

计算字符串长度。一个汉字算三个字符,数字或字母算一个。

SELECT LENGTH('你好'),运行结果为 6。

CHAR_LENGTH()

计算字符串长度。汉字、数字、字母均算一个。

SELECT CHAR_LENGTH('你好'),运行结果为2。

LOWER()

将字符串转为小写。

SELECT LOWER('ABC'),运行结果为 abc。

UPPER()

将字符串转为大写。

SELECT UPPER('abc'),运行结果 ABC。

REPLACE()

替换函数,3个参数。分别是:要替换的表达式或字段名、想要查找的被替换的字符串(旧)、替换成哪个字符串(新)。

SELECT REPLACE('fabcd', 'abc','123'),运行结果为f123d。

SUBSTRING()

截取字符串,3个参数。分别是:待截取的表达式或字段名、开始截取的位置、想要截取的字符串长度。

SELECT SUBSTRING('fabcd', 1,3),运行结果为fab。
扩展:instr函数

instr是一个非常好用的字符串处理函数,几乎所有的字符串分隔都用到此函数。instr函数在Oracle中是返回要截取的字符串在源字符串中的位置。

举例Oracle11:

查找’5040203’这个节点及其以下的记录:

SELECT
	*
FROM
	SA_ORG
WHERE
	"INSTR" (ORG_TREE, '5040203') > 0
ORDER BY
	ORG_TREE

日期函数

CURRENT_DATE()

系统当前日期。

CURRENT_TIME()

系统当前时间,不含日期。

CURRENT_TIMESTAMP()

系统当前日期+时间。

EXTRACT()

抽取具体的年月日。

SELECT EXTRACT(YEAR FROM '2019-06-01'),返回结果为2019。

DATE()

SELECT DATE('2019-04-01 12:00:00:05'),返回结果为 2019-04-01。

YEAR()

返回时间的年份部分。

MONTH()

返回时间的月份部分。

DAY()

返回时间的天数部分。

HOUR()

返回时间的小时部分。

MINUTE()

返回时间的分钟部分。

SECOND()

返回时间的秒部分。

转换函数

转换函数可以转换数据之间的类型,常用的函数:

CAST()

数据类型转换,参数是一个表达式,表达式通过AS关键词分割了两个参数,分别是原始数据、目标数据类型。

例如:

SELECT CAST(123.123 AS INT),运行结果会报错。
SELECT CAST(123.123 AS DECIMAL(8,2)),运行结果为123.12。

CAST函数在转换数据类型时,不会四舍五入,如果原始数值有小数,那么转换为整数的时候就会报错。在MySQL和SQLServer中可以采用DECIMAL(a,b)指定转化的小数类型。DECIMAL(8,2)表示精度为8位(整数加小数位共8位),小数位为2位的数据类型。

COALESCE()

返回第一个非空数值。

SELECT COALESCE(null,1,2),运行结果为1。

关于DATE()函数

举个例子简单感受一下,MySQL5中,表testdate中字段sdate为varchar类型,字段date为datetime类型。

原始数据:

mysql> SELECT * FROM testdate;
+------+------------+---------------------+
| id   | sdate      | date                |
+------+------------+---------------------+
|    1 | 20190601   | 2019-06-01 14:37:54 |
|    2 | 20190602   | 2019-06-02 14:38:10 |
|    3 | 2019-06-03 | 2019-06-03 14:42:03 |
+------+------------+---------------------+
3 rows in set (0.00 sec)

mysql>

使用和不适用DATE函数的区别

mysql> use sqltest;
Database changed
mysql> SELECT * FROM    testdate WHERE date > '20190602';
+------+------------+---------------------+
| id   | sdate      | date                |
+------+------------+---------------------+
|    2 | 20190602   | 2019-06-02 14:38:10 |
|    3 | 2019-06-03 | 2019-06-03 14:42:03 |
+------+------------+---------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM    testdate WHERE DATE(date) > '20190602';
+------+------------+---------------------+
| id   | sdate      | date                |
+------+------------+---------------------+
|    3 | 2019-06-03 | 2019-06-03 14:42:03 |
+------+------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM    testdate WHERE sdate > '20190601';
+------+----------+---------------------+
| id   | sdate    | date                |
+------+----------+---------------------+
|    2 | 20190602 | 2019-06-02 14:38:10 |
+------+----------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM    testdate WHERE DATE(sdate) > '20190601';
+------+------------+---------------------+
| id   | sdate      | date                |
+------+------------+---------------------+
|    2 | 20190602   | 2019-06-02 14:38:10 |
|    3 | 2019-06-03 | 2019-06-03 14:42:03 |
+------+------------+---------------------+
2 rows in set (0.00 sec)

mysql>
结论:

当无法确认一个字段的数据类型是字符串还是datetime类型时,如果对日期部分进行比较,使用DATE()函数来比较是更安全的。

使用SQL函数可能带来的问题

不同DBMS之间差异很大,只有少数函数是被DBMS同时支持的,所以使用SQL函数的代码可移植性很差,在使用函数的时候需要特别注意。

SQL大小写规范问题

MySQL在Linux系统中,库名、表名、变量名是严格区分大小写,字段名不区分大小写;

在Windows系统中,全部不区分大小写。

因此,需要一个命名规范:

  1. 关键字、函数名全部大写;
  2. 库名、表名、字段名全部小写;
  3. SQL语句以分号结尾。

聚集函数

聚集函数共5个。

COUNT()

统计总行数。

MAX()

最大值。

MIN()

最小值。

SUM()

求和。

AVG()

平均值。

注意

AVG、MAX、MIN聚集函数会自动忽略值为NULL的行

比如:

张三语文成绩90分,李四成绩60分,王五成绩为null,则avg(score)是(90+60)/2。

MAX和MIN函数也可以用于字符串类型的统计

如果是英文字母,按照A-Z的顺序排列,越往后越大。如果是汉字按照全拼拼音排列。

比如:

SELECT MIN(CONVERT(name USING gbk)), MAX(CONVERT(name USING gbk)) FROM heros

需要把字段统一转为gbk,使用convert函数再max、min。

对数据分组,并进行聚集统计

对数据进行分组,需要用GROUP BY字句。

比如按照英雄的主要定位和次要定位分组,并统计每组英雄的数量。

SELECT COUNT(*) num, role_main from heros GROUP BY role_main

HAVING过滤分组

当创建很多分组时,需要对分组进行过滤,过滤分组用HAVING。HAVING和WHERE都起到过滤的作用,不同的是:WHERE作用于数据行,HAVING作用于分组。

比如按照英雄的主要定位、次要定位分组,并且筛选分组中英雄数量大于5的组,最后按照分组中的英雄数量从高到低排序。

SELECT COUNT(*) num, role_main, role_assist from heros GROUP BY role_main, role_assist HAVING num > 5 ORDER BY num DESC

SELECT查询中的关键字顺序

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

思考

1、筛选最大生命值大于6000的英雄,按照主要定位分组,选择分组英雄数量大于5的分组,按照英雄数量由高到低排序,并显示每个分组的英雄数量、主要定位和平均最大生命值。

SELECT COUNT(*) num, role_main, AVG(hp_max) from heros GROUP BY role_main HAVING num > 5 ORDER BY num DESC

2、筛选最大生命值与最大法力值之和大于7000的英雄,按照攻击范围进行分组,显示分组的英雄数量,以及分组英雄的最大生命值与最大法力值之和的平均值、最大值、最小值,并按照分组的英雄数由高到低排序,其中聚集函数的结果保留小数点后两位。

SELECT
	COUNT(*) num,
	ROUND(AVG(hp_max + mp_max), 2) avg,
	ROUND(MAX(hp_max + mp_max), 2) max,
	ROUND(MIN(hp_max + mp_max), 2) min
FROM
	heros
WHERE
	(hp_max + mp_max) > 7000
GROUP BY
	attack_range
ORDER BY
	num DESC

(本文完)

SQL从入门到放弃系列——数据过滤[六]

采用比较运算符、逻辑运算符、通配符进行过滤。

比较运算符

比较数值大小。数值类型可以是整数,浮点数,字符串,布尔类型等。

等于=

小于<

大于>

不等于<>或!=

大于等于(不小于)>=或!<

小于等于(不大于)<=或!>

指定两个数之间BETWEEN

为空IS NULL

 

逻辑运算符

定义where子句中多个条件间的关系。

并且AND

或者OR

非NOT

在指定范围内IN

优先级

()优先级最高,其次and,然后or。

 

通配符

就是对文本类型字段进行模糊查询。通配符就是%。

说明:

不同DBMS对通配符的定义不同。

Access通配符采用星号*,而不是百分号%。

另外,还有下划线_通配符。和%的区别在于,%代表一个或多个字符,_只代表单个字符。

比如,查找英雄名字除了第一个字以外,包含“太”字的英雄:

SQL:SELECT name FROM heros WHERE name LIKE '_% 太 %'

此外,在Access中使用问号?代替下划线_。在DB2中不支持下划线通配符,因此需要针对不同的DBMS查阅相对应的DBMS文档。

注意:

即使对like检索的字段进行了索引,索引的价值也可能失效。

比如like ‘%太%’或like’%太’的时候会进行全表扫描;

但是使用like ‘太%’,同时检索的字段进行了索引,则不会进行全表扫描。

 

补充

对where子句建立索引

提高效率就是要避免全表扫描,考虑在WHERE级OEDER BY涉及到的列上添加索引

(本文完)

SQL从入门到放弃系列——数据检索[五]

SELECT查询基础语法。
排序检索数据。
提升SELECT查询效率。

SELECT 查询的基础语法

查询列

SQL:SELECT * FROM heros

起别名

SQL:SELECT name AS n, hp_max AS hm, mp_max AS mm, attack_max AS am, defense_max AS dm FROM heros

查询常数

增加一个虚拟列

SQL:SELECT '王者荣耀' as platform, name FROM heros

去除重复行

SQL:SELECT DISTINCT attack_range FROM heros

distinct需要放到所有列的前面,否则会报错。

 

如何排序检索数据

SQL:SELECT name, hp_max FROM heros ORDER BY hp_max DESC

排序的列名可以有一个或多个,以第一个为优先排序。

ASC递增(正序),DESC递减(倒序)。

order by位于最后一个子句否则报错。

order by的字段不一定在select后,也可以使用非选择列排序。

 

约束返回结果的数量

其实就是分页,通过约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果知道返回结果的数量只有一条,就可以使用LIMIT 1,告诉SELECT语句只需要返回一条记录即可。不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。

MySQL、PostgreSQL、MariaDB、SQLite中使用关键字LIMIT进行分页

SQL:SELECT name, hp_max FROM heros ORDER BY hp_max DESC LIMIT 5

SQLServer和Access使用TOP关键字

SQL:SELECT TOP 5 name, hp_max FROM heros ORDER BY hp_max DESC

DB2使用FETCH FIRST 5 ROWS ONLY关键字

SQL:SELECT name, hp_max FROM heros ORDER BY hp_max DESC FETCH FIRST 5 ROWS ONLY

Oracle使用ROWNUM统计行数

SQL:SELECT name, hp_max FROM heros WHERE ROWNUM <=5 ORDER BY hp_max DESC

 

SELECT的执行顺序

关键字顺序

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

SELECT的执行顺序

FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT

例如

SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

 

补充

SELECT COUNT(*) > SELECT COUNT(1) > SELECT COUNT(具体字段)之前看到的,好像Mysql对count(*)做了单独的优化?

(本文完)

SQL从入门到放弃系列——DDL建库和建表[四]

了解DDL基础语法。
使用DDL定义数据表时,都有哪些约束性。
使用DDL设计数据库时,都有哪些重要原则。

DDL的基础语法和设计工具

DDL(Data Definition Language)数据定义语言。它定义了数据库的结构和表的结构。

在DDL中,常用功能是增删改,分别对应create,drop,alter。在执行DDL时,不需要commit就可以完成任务。

对数据库进行定义

CREATE DATABASE nba;
DROP DATABASE nba;

对数据表进行定义

CREATE TABLE table_name;

 

创建表结构

一般使用Navicat,表结构转储为SQL文件后,发现表名和字段名都使用了反引号,这是为了避免它们的名称和MySQL保留字段相同。

CREATE TABLE `player` ( `pla...

建表例子:

CREATE TABLE player (
	player_id INT (11) NOT NULL auto_increment,
	player_name VARCHAR (255) NOT NULL
);

 

修改表结构

添加字段

ALTER TABLE player ADD (age INT(11));

修改字段名

ALTER TABLE player rename COLUMN age TO player_age;

修改字段数据类型

ALTER TABLE player MODIFY (player_age float(3,1));

删除字段,删除刚添加的player_age字段

ALTER TABLE player DROP COLUMN player_age;

 

数据表常见约束

创建数据表时对字段进行约束的目的在于保证RDBMS里面数据的准确性和一致性。

常见约束如下:

主键约束(primary key)

unique+not null

外键约束(foreign key)

确保表与表之间引用的完整性。一张表的外键是另一张表的主键。可重复,可为空。

唯一性约束(unique)

除主键外,对其他字段进行唯一性约束。

唯一性约束和普通索引(normal index)之间有区别:唯一性约束相当于创建了一个约束和普通索引,目的是保证字段的正确性;普通索引只是提升数据检索的速度,并不对字段的唯一性进行约束。

NOT NULL约束(not null)

定义字段必须有值不为空。

DEFAULT(default)

表明字段默认值。

CHECK约束

用于检查特定字段取值范围的有效性。CHECK约束的检查结果不能为false,例如对身高、年龄的数值进行CHECK约束。

 

设计数据表的原则

数据表越少越好

RDBMS的核心在于对实体和联系的定义,也就是E-R图。数据表越少,证明实体和联系设计的越简洁,方便理解和操作。

表中字段越少越好

字段越多,数据冗余的可能性越大。这个是相对的,通常在数据冗余和检索效率中进行平衡。

表中联合主键的字段个数越少越好

设置主键目的是确定唯一性,当一个字段无法确定唯一性的时候,就要采用联合主键的方式。联合主键的字段越多,占用索引空间越大,不仅会增加理解难度,还会增加运行时间和索引空间。

使用主键和外键个数越多越好

数据库的设计实际就是定义各种表,以及各种字段间的关系。关系越多,说明实体之间的冗余度越低,利用度越高。这样不仅保证了数据表之间的独立性,还能提升相互之间的关联使用率。

 

关于外键的争议

(本文完)

SQL从入门到放弃系列——SQL执行过程[三]

本文是Oracle和MySQL中SQL执行流程。
硬解析和软解析概念。
MySQL体系结构。
存储引擎概念,MySQL存储引擎。

Oracle中SQL是如何执行的

SQL在Oracle中的执行过程

  1. 语法检查:检查语法是否有误。
  2. 语义检查:检查SQL中访问对象是否存在。
  3. 权限检查:检查用户是否有访问数据权限。
  4. 共享池检查:一块内存池,主要用于缓存SQL语句和该语句的执行计划。Oracle通过检查内存池是否存在SQL语句执行计划,判断进行软解析还是硬解析。(软解析:Oracle对SQL语句进行hash运算,根据hash值在库缓存中查找是否存在SQL执行计划,如果存在就直接执行,进入执行器环节,就是软解析。如果没有找到SQL执行计划,Oracle需要创建解析树进行解析,生成执行计划,进入优化器环节,就是硬解析。)
  5. 优化器:创建解析树,生成执行计划。
  6. 执行器:执行SQL语句。

如何避免硬解析,尽量使用软解析呢

SQL执行过程中创建解析树,生成执行计划很消耗资源,所以应尽量避免硬解析。

例如:

select * from player where player_id = 10010;

绑定变量:

select * from player where player_id = :player_id

这两种查询效率在Oracle中完全不同。绑定变量的方式会在查询后,在共享池中缓存执行计划,也就是软解析。

通过绑定变量的方式可以减少Oracle的解析工作量,但是使用动态SQL方式,因为参数不同,会导致SQL执行效率不同,同时SQL优化也会比较困难。

 

MySQL中的SQL如何执行的

MySQL是CS架构,服务端程序使用的mysqld。由三层组成:

  1. 连接层:客户端和服务端建立连接,客户端发送SQL至服务端。
  2. SQL层:对SQL语句进行查询处理。
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取。

SQL语句在MySQL中的流程是:SQL语句=》缓存查询=》解析器=》优化器=》执行器。有一部分和Oracle中的SQL执行原理是一样的。不同的是,MySQL存储引擎采用插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时MySQL还允许开发人员设置自己的存储引擎。

 

常见的存储引擎

InnoDB存储引擎

它是MySQL5.5.8之后默认的存储引擎,支持事务、行级锁定、外键锁定等。

MyISAM存储引擎

它是5.5.8之前默认的存储引擎,不支持事务、不支持外键,但速度快、占用资源少。

Memory存储引擎

使用系统内存作为存储介质,以便得到更快响应速度。但是如果mysqld进程崩溃会导致所有数据丢失,因此只有当数据是临时的情况下才使用Memory存储引擎。

NDB存储引擎

也叫NDB Cluster存储引擎,主要用于MySQL Cluster分布式集群环境,类似于Oracle的RAC集群。

Archive存储引擎

它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。

注意

数据库的设计在于表的设计,而在MySQL中每张表的设计都可以采用不同的存储引擎,可以根据实际的数据处理需要选择存储引擎,这也就是MySQL的强大之处。

 

数据库管理系统(DBMS)

Oracle和MySQL的结构图

 

 

关键点是SQL执行原理

不同的DBMS的SQL执行原理是相通的,只是在不同的软件中,实现路径不同。

既然一条SQL语句会经历不同的模块,那在不同的模块中,SQL执行所用的资源(时间)是怎样的。

如何对MySQL中对一条SQL语句的执行时间进行分析

开启profiling可以让MySQL收集在SQL执行时所使用的资源情况。命令:

mysql>select @@profiling;

profiling=0代表关闭,设置为1即为打开。命令:

mysql>set profiling=1;

然后执行任意SQL:

mysql>select * from wucai.heros;

查看当前回话所产生的所有profiles,命令:

mysql>show profiles;

查看上一次查询的执行时间,命令:

mysql>show profile;

查询指定的Query ID(例如ID为2的查询),命令:

mysql>show profile for query 2;

结果是一样的。

 

Oracle和MySQL的异同

相同点

它们都是通过解析器=》优化器=》执行器这样的流程来执行SQL的。

异同点

软件实现层面的差异。

Oracle提出了共享池概念,通过共享池来判断是进行软解析还是硬解析。

MySQL在8.0版本后不再支持查询缓存,而是直接执行解析器=》优化器=》执行器的流程。各种存储引擎也是MySQL的一大特色,针对不同场景可以选择不同的存储引擎,可以对每张表选择适合的存储引擎。

 

为什么MySQL8.0之后不再支持缓存查询

因为一旦数据表有更新,缓存都将清空,因此只有数据表是静态的时候,或者数据表很少发生变化时,使用缓存查询才有价值,否则数据表经常更新,反而增加了SQL的查询时间。

(本文完)

SQL从入门到放弃系列——关于DBMS[二]

DBMS(DataBase Management System)数据库管理系统,它可以对多个数据库进行管理, 可以理解为:DBMS=多个数据库(DB)+管理程序。
虽然我们有时候把Oracle、MySQL等称之为数据库,但确切地讲,它们应该是数据库管理系统,即DBMS。

主流的DBMS

下图是2019年5月DB-Engines公布的DBMS排名:

可以看出关系型数据库是DBMS的主流,使用最多的是Oracle、MySQL和SQL Server。

数据库模式对比

关系型数据库(RDBMS)

就是建立在关系模型基础上的数据库,SQL就是关系型数据库的查询语言。

NoSQL泛指非关系型数据库

包括键值型数据库、文档型数据库、搜索引擎和列存储等,此外还包括图形数据库。

键值型数据库(Key-Value)

通过Key-Value键值对的方式存储数据,其中Key和Value可以是简单对象,也可以是复杂的对象。Key作为唯一的标识符,优点是查找速度快,明显优于关系型数据库,但他无法使用条件过滤,如果不知道去哪里找数据,就要遍历所有的键,这样会消耗大量的计算。使用场景是作为内容缓存。Redis是最流行的键值型数据库。

文档型数据库(Document)

用来管理文档,在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录,MongoDB是最流行的文档型数据库。

搜索引擎(Search Engine)

搜索引擎也是数据库检索中的重要应用,常见的全文搜索引擎有Elasticsearch、Splunk和Solr。虽然关系型数据库使用了索引提升检索效率,但是针对全文索引效率较低。搜索引擎的优势在于采用了全文搜索的技术,核心原理是“倒排索引”。

列式数据库(Wide Column)

列式数据库是相对于行式存储的数据库,Oracle、MySQL、SQL Server等数据库都是采用的行式存储(Row-Based),而列式数据库是将数据按照存储到数据库中,这样做的好处是可以大量降低系统的I/O,适合于分布式文件系统,不足之处在于功能相对有限。

为什么列式存储会大量降低系统的I/O呢?

行式储存是把一行的数据都串起来进行存储,然后存储下一行。

列式存储是把一列的数据都串起来进行存储,然后存储下一列。这样相邻数据的数据类型是一样的,因此也更容易压缩。压缩之后自然降低了I/O。

为什么都遵循SQL标准,SQL又是通用的标准语言,会存在这么多DBMS呢?

简单一句话:市场大,场景丰富。

补充

  1. Oracle收购MySQL后,MySQL的创造者担心MySQL有闭源的风险,因此创建了MySQL的分支项目MariaDB。MariaDB在绝大部分都与MySQL兼容,并增加了许多新特性,比如支持更多的存储引擎类型。
  2. 微软除了推出SQL Server,还推出了Access数据库,它是一种桌面数据库,同时具备后台存储和前台开发的功能,更轻量级,适合小型应用场景。但是后台存储空间有限,只有2G,其优势在于可以便捷地在前台界面开发。

(本文完)

SQL从入门到放弃系列——了解SQL[一]

SQL是关系型数据库的查询语言,很少变化,半衰期长。我们应当将20%的时间产生80%的效益,先把自己的时间和精力投入到这些不变的技术上。

SQL语言按照功能划分成4个部分

  1. DDL(Data Definition Language),数据定义语言。用来定义数据库对象,包括库,表,列。通过使用DDL,可以增删改库表结构。
  2. DML(Data Manipulation Language),数据操作语言。用来操作数据库相关记录,例如增删改表中的记录。
  3. DCL(Data Control Language),数据控制语言。用来定义访问权限和安全级别。
  4. DQL(Data Query Language),数据查询语言。用来查询想要的记录,是SQL语言重中之重。

SQL是我们和DBMS(数据库管理系统)交流的语言,在创建DBMS之前,要进行设计,就是传说中的数据库模型(数模)。采用的是ER(Entity Relationship Diagram),即实体-关系图的方式进行设计。通常设计数模工具用的是Powerdesigner,或Navicat,这两种最终都可以转成SQL。

实体-关系图的作用

用于描述模型,模型三要素包括实体、属性、关系。

实体就是要管理的对象也就是表,属性是标识每个实体的属性也就是字段,关系则是对象之间的关系也就是主外键关联关系(一对一,一对多,多对多)。

SQL规范

创建库表后进行SQL操作,通常SQL包括大小写,那么有什么规范呢?

关于SQL大小写:

  1. 表名、表别名、字段名、字段别名采用小写;
  2. SQL保留字、函数名、绑定变量等都大写。

(本文完)