SQL语句的编写规范
编写规范:
-
SQL语句中出现的所有表名、表别名、字段名、序列等数据库对象都应小写;
-
SQL语句中出现的系统保留字、内置函数名、SQL保留字、绑定变量等都应大写;
-
SQL语句中出现的变量参数应采用驼峰命名法命名,并反映变量的实际意义;
-
SQL语句中的表别名应简短明了,宜反映表名的实际意义;
-
如果一行有多列并超过80个字符,基于列对齐原则,应采用下行缩进;
-
缩进应为1个Tab或者4个字符;
-
同层次的SQL语句缩进应保持一致(纵向对齐);
-
SELECT/FROM/WHERE/ORDER BY/GROUP BY等子句应独占一行;
-
SELECT子句内容如果只有一项,应与 SELECT 同占一行;
-
SELECT子句内容如果多于一项,每一项都应独占一行,并在对应 SELECT的基础上向右缩进2个Tab或者8个字符;
-
FROM子句内容如果只有一项,应与 FROM同占一行;
-
FROM子句内容如果多于一项,每一项都应独占一行,并在对应FROM的基础上向右缩进1个Tab或者4个字符;
-
WHERE子句内容如果只有一项,应与 WHERE同占一行;
-
WHERE子句的条件如果有多项,每一个条件应独占一行,并以AND开头,并在对应WHERE的基础上向右缩进1个Tab或者4个字符;
-
(UPDATE)SET子句内容如果有一项,应与 SET同占一行;
-
(UPDATE)SET子句内容如果有多项,每一项应独占一行,并在对应SET的基础上向右缩进1个Tab或者4个字符;
-
INSERT子句左/右括号以及每个表字段应独占一行,其中括号无缩进,表字段在对应括号的基础上向右缩进1个Tab或者4个字符;
-
VALUES子句左/右括号以及每一项的值应独占一行,其中括号无缩进,每一项的值在对应括号的基础上向右缩进1个Tab或者4个字符;
-
SQL语句中不应出现空行;
-
SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较运算符(=、<=、>=、>、<、<>、BETWEEN AND)、IN、LIKE等运算符前后都应加一空格;
-
SQL语句中逗号后应加一空格;
-
不等于应统一使用符号“<>”;
示例:
SELECT
e.employee_id,
e.first_name,
e.last_name,
d.department_name,
s.salary,
s.bonus,
(s.salary + s.bonus) AS total_compensation
FROM
employees AS e
INNER JOIN
departments AS d ON e.department_id = d.department_id
LEFT JOIN
salaries AS s ON e.employee_id = s.employee_id
WHERE
d.department_name IN ('Sales', 'Engineering')
AND s.salary > 50000
AND (s.bonus IS NOT NULL AND s.bonus > 5000)
ORDER BY
total_compensation DESC,
e.last_name ASC
LIMIT 10;
常用的基础函数
由于不同数据库实现的SQL方言之间的函数存在一定差异,因此这里仅列出MySQL与SQL Server的常用基础函数,其他数据库实现的常用函数需查阅对应的官方文档。
MySQL
类别 | 函数 | 描述 |
---|---|---|
数值函数 | ABS(x) | 返回x的绝对值 |
数值函数 | BIN(x) | 返回x的二进制(OCT返回八进制,HEX返回十六进制) |
数值函数 | CEILING(x) | 返回大于x的最小整数值 |
数值函数 | EXP(x) | 返回值e(自然对数的底)的x次方 |
数值函数 | FLOOR(x) | 返回小于x的最大整数值 |
数值函数 | GREATEST(x1, x2, …, xn) | 返回集合中最大的值 |
数值函数 | LEAST(x1, x2, …, xn) | 返回集合中最小的值 |
数值函数 | LN(x) | 返回x的自然对数 |
数值函数 | LOG(x, y) | 返回x的以y为底的对数 |
数值函数 | MOD(x, y) | 返回x/y的模(余数) |
数值函数 | PI() | 返回pi的值(圆周率) |
数值函数 | RAND() | 返回0到1内的随机值,可通过提供一个参数(种子)生成指定的随机数 |
数值函数 | ROUND(x, y) | 返回参数x的四舍五入的有y位小数的值 |
数值函数 | SIGN(x) | 返回代表数字x的符号的值 |
数值函数 | SQRT(x) | 返回一个数的平方根 |
数值函数 | TRUNCATE(x, y) | 返回数字x截短为y位小数的结果 |
聚合函数 | AVG(X) | 返回指定列的平均值 |
聚合函数 | COUNT(X) | 返回指定列中非NULL值的个数 |
聚合函数 | MIN(X) | 返回指定列的最小值 |
聚合函数 | MAX(X) | 返回指定列的最大值 |
聚合函数 | SUM(X) | 返回指定列的所有值之和 |
聚合函数 | GROUP_CONCAT(X) | 返回由属于一组的列值连接组合而成的结果,非常有用 |
文本函数 | ASCII(char) | 返回字符的ASCII码值 |
文本函数 | BIT_LENGTH(str) | 返回字符串的比特长度 |
文本函数 | CONCAT(s1, s2, …, sn) | 将s1, s2, …, sn连接成字符串 |
文本函数 | CONCAT_WS(sep, s1, s2, …, sn) | 将s1, s2, …, sn连接成字符串,并用sep字符间隔 |
文本函数 | INSERT(str, x, y, instr) | 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果 |
文本函数 | FIND_IN_SET(str, list) | 分析逗号分隔的list列表,如果发现str,返回str在list中的位置 |
文本函数 | LCASE(str)或LOWER(str) | 返回将字符串str中所有字符改变为小写后的结果 |
文本函数 | LEFT(str, x) | 返回字符串str中最左边的x个字符 |
文本函数 | LENGTH(s) | 返回字符串str中的字符数 |
文本函数 | LTRIM(str) | 从字符串str中切掉开头的空格 |
文本函数 | POSITION(substr, str) | 返回子串substr在字符串str中第一次出现的位置 |
文本函数 | QUOTE(str) | 用反斜杠转义str中的单引号 |
文本函数 | REPEAT(str, x) | 返回字符串str重复x次的结果 |
文本函数 | REVERSE(str) | 返回颠倒字符串str的结果 |
文本函数 | RIGHT(str, x) | 返回字符串str中最右边的x个字符 |
文本函数 | RTRIM(str) | 返回字符串str尾部的空格 |
文本函数 | STRCMP(s1, s2) | 比较字符串s1和s2 |
文本函数 | TRIM(str) | 去除字符串首部和尾部的所有空格 |
文本函数 | UCASE(str)或UPPER(str) | 返回将字符串str中所有字符转变为大写后的结果 |
日期函数 | CURDATE()或CURRENT_DATE() | 返回当前的日期 |
日期函数 | CURTIME()或CURRENT_TIME() | 返回当前的时间 |
日期函数 | DATE_ADD(date, INTERVAL int keyword) | 返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化) |
日期函数 | DATE_FORMAT(date, fmt) | 依照指定的fmt格式格式化日期date值 |
日期函数 | DATE_SUB(date, INTERVAL int keyword) | 返回日期date减去间隔时间int的结果(int必须按照关键字进行格式化) |
日期函数 | DAYOFWEEK(date) | 返回date所代表的一星期中的第几天(1~7) |
日期函数 | DAYOFMONTH(date) | 返回date是一个月的第几天(1~31) |
日期函数 | DAYOFYEAR(date) | 返回date是一年的第几天(1~366) |
日期函数 | DAYNAME(date) | 返回date的星期名 |
日期函数 | FROM_UNIXTIME(ts, fmt) | 根据指定的fmt格式,格式化UNIX时间戳ts |
日期函数 | HOUR(time) | 返回time的小时值(0~23) |
日期函数 | MINUTE(time) | 返回time的分钟值(0~59) |
日期函数 | MONTH(date) | 返回date的月份值(1~12) |
日期函数 | MONTHNAME(date) | 返回date的月份名 |
日期函数 | NOW() | 返回当前的日期和时间 |
日期函数 | QUARTER(date) | 返回date在一年中的季度(1~4) |
日期函数 | WEEK(date) | 返回日期date为一年中第几周(0~53) |
日期函数 | YEAR(date) | 返回日期date的年份(1000~9999) |
控制流函数 | CASE WHEN [test1] THEN [result1]… ELSE [default] END | 如果test1是真,则返回result1,否则返回default |
控制流函数 | CASE [test] WHEN [val1] THEN [result]… ELSE [default] END | 如果test和valN相等,则返回result,否则返回default |
控制流函数 | IF(test, t, f) | 如果test是真,返回t;否则返回f |
控制流函数 | IFNULL(arg1, arg2) | 如果arg1不是空,返回arg1,否则返回arg2 |
控制流函数 | NULLIF(arg1, arg2) | 如果arg1=arg2返回NULL;否则返回arg1 |
SQL Server
类别 | 函数 | 描述 |
---|---|---|
数值函数 | trunc(45.923, 1) | 按指定精度截断十进制数,结果:45.9,此为Oracle函数 |
数值函数 | mod(1600, 300) | 求除法余数,结果:100 |
数值函数 | abs(numeric_expr) | 求绝对值 |
数值函数 | ceiling(numeric_expr) | 取大于等于指定值的最小整数 |
数值函数 | avg(numeric_expr) | 取平均数 |
数值函数 | exp(float_expr) | 取指数 |
数值函数 | floor(numeric_expr) | 小于等于指定值的最大整数 |
数值函数 | pi() | 3.1415926… |
数值函数 | power(numeric_expr, power) | 返回power次方 |
数值函数 | rand([int_expr]) | 随机数产生器 |
数值函数 | round(numeric_expr, int_expr) | 按int_expr规定的精度四舍五入 |
数值函数 | sign(int_expr) | 根据正数,0,负数,返回+1,0,-1 |
数值函数 | sqrt(float_expr) | 平方根 |
聚合函数 | count() | 返回组中的总条数,count(*)包括NULL值和重复值项 |
聚合函数 | max() | 返回组中的最大值,空值将被忽略 |
聚合函数 | min() | 返回组中的最小值,空值将被忽略 |
聚合函数 | sum() | 返回组中所有值的和,空值将被忽略 |
聚合函数 | avg() | 返回组中所有值的平均值,空值将被忽略 |
文本函数 | datalength(Char_expr) | 返回字符串包含字符数,不包含后面的空格 |
文本函数 | substring(expression, start, length) | 取子串 |
文本函数 | right(char_expr, int_expr) | 返回字符串右边int_expr个字符 |
文本函数 | left(character_expression, integer_expression) | 返回左起integer_expression个字符 |
文本函数 | ltrim() | 去掉字符串头部的空格 |
文本函数 | rtrim() | 去掉字符串尾部的空格 |
文本函数 | str(float_expression, [length, decimal]) | 把数值型数据转换为字符型数据 |
文本函数 | upper(char_expr) | 转为大写 |
文本函数 | lower(char_expr) | 转为小写 |
文本函数 | space(int_expr) | 生成int_expr个空格 |
文本函数 | replicate(char_expr, int_expr) | 复制字符串int_expr次 |
文本函数 | reverse(char_expr) | 反转字符串 |
文本函数 | stuff(char_expr1, start, length, char_expr2) | 将字符串char_expr1中从start开始的length个字符用char_expr2代替 |
文本函数 | ltrim(char_expr) rtrim(char_expr) | 去掉空格 |
文本函数 | ascii(char) char(ascii) | 取ascii码,根据ascii码取字符 |
文本函数 | char() | 将ASCII码转换为字符 |
文本函数 | charindex(char_expr, expression) | 返回char_expr的起始位置 |
文本函数 | patindex("%pattern%", expression) | 返回指定模式的起始位置,否则为0 |
日期函数 | getdate() | 返回日期 |
日期函数 | getutcdate() | 获取UTC时间 |
日期函数 | day(getdate()) | 取出天 |
日期函数 | month(getdate()) | 取出月 |
日期函数 | year(getdate()) | 取出年 |
日期函数 | datename(datepart, date_expr) | 返回名称如June |
日期函数 | datepart(datepart, date_expr) | 取日期一部分 |
日期函数 | datediff(datepart, date_expr1, date_expr2) | 日期差 |
日期函数 | dateadd(datepart, number, date_expr) | 返回日期加上number |
类型转换函数 | convert(datetype[(n)], expr[, stylus]) | 类型转换 |
类型转换函数 | cast(expr AS datatype[(n)]) | 类型转换 |
系统函数 | suser_name() | 用户登录名 |
系统函数 | user_name() | 用户在数据库中的名字 |
系统函数 | user | 用户在数据库中的名字 |
系统函数 | show_role() | 当前用户的规则 |
系统函数 | db_name() | 数据库名 |
系统函数 | object_name(obj_id) | 数据库对象名 |
系统函数 | col_name(obj_id, col_id) | 列名 |
系统函数 | col_length(objname, colname) | 列长度 |
系统函数 | valid_name(char_expr) | 是否是有效标识符 |
系统函数 | newid() | 返回一个GUID(全局唯一标识符)值 |
系统函数 | isnumeric(expr) | 判断表达式是否为数值类型或可转换成数值 |
系统函数 | isdate(expr) | 确定输入表达式是否为有效日期或可转换成日期 |