一、什么是SQL函数?为什么使用SQL函数可能会带来问题?
SQL中的函数一般是在数据上执行的,可以很方便的转换和处理数据。
我们可以把SQL内置函数分为四类:
1.算术函数
函数名 | 定义 |
---|---|
ABS() | 取绝对值 |
MOD() | 取余 |
ROUND() | 四舍五入为指定小数位数,要有两个参数:字段名称、小数位数 |
2.字符串函数
函数名 | 定义 |
---|---|
CONCAT() | 将多个字符串拼接起来 |
LENGTH() | 计算字段长度,一个汉字算三字符,一个数字或字母算一字符 |
CHAR_LENGTH() | 计算字段长度,汉字、数字、字母都算一个字符 |
LOWER() | 将字符串中的字符转化为小写 |
UPPER() | 将字符串的字符转化为大写 |
REPLACE() | 替换函数,有三个参数:要替换的表达式或字段名、要查找的被替换字符串、替换成哪个字符串 |
SUBSTRING() | 截取字符串,有三个参数:待截取的表达式或字段、开始截取的位置、要截取的字符串长度 |
3.日期函数
函数名 | 定义 |
---|---|
CURRENT_DATE() | 系统当前日期 |
CURRENT_TIME() | 系统当前时间,没有具体的日期 |
CURRENT_TIMESTAMP() | 系统当前时间,包括具体的日期+时间 |
EXTRACT() | 抽取具体的年、月、日 |
DATE() | 返回时间的日期部分 |
YEAR() | 返回时间的年份部分 |
MONTH() | 返回时间的月份部分 |
DAY() | 返回时间的天数部分 |
HOUR() | 返回时间的小时部分 |
MIUNTE() | 返回时间的分钟部分 |
SECOND() | 返回时间的秒部分 |
4.转换函数
函数名 | 定义 |
---|---|
CAST() | 数据类型转换,参数是一个表达式,通过AS关键词分割2个参数:原始数据和目标数据类型 |
COALESCE() | 返回第一个非空数值 |
显示英雄物攻成长精确到小数点后一位:
SELECT name, ROUND(attack_growth, 1) FROM heros
显示英雄最大生命值的最大值:
SELECT MAX(hp_max) FROM heros
显示最大生命值最大的英雄及对应数值:
SELECT name, hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros)
显示英雄名字及名字字数:
SELECT CHAR_LENGTH(name), name FROM heros
显示某个时间之后上线的所有英雄:
SELECT * FROM heros WHERE DATE(birthdate)>'2021-07-05’
大部分DBMS会有自己特定的函数,采用SQL函数的代码可移植性是很差的,因此使用函数的时候需要特别注意。在Linux和Windows环境下,你可能会遇到不同的大小写问题。
这里有一个有关命名规范的建议:
1.关键字和函数名称全部大写;
2.数据库名、表名、字段名称全部小写;
3.SQL语句必须以分号结尾。
二、什么是SQL的聚集函数,如何利用它们汇总表的数据?
聚集函数:
函数 | 说明 |
---|---|
COUNT() | 总行数 |
MAX() | 最大值 |
MIN() | 最小值 |
SUM() | 求和 |
AVG() | 平均值 |
查询最大生命值大于6000,且有次要定位的英雄数量:
SELECT COUNT(role_assist) FROM heros WHERE hp_max > 6000
ps:COUNT(role_assist)会忽略值为NULL的数据行,COUNT(*)只统计数据行数,不管某个字段是否为NULL
查询射手(主要定位或次要定位是射手)的最大生命值的最大值:
SELECT MAX(hp_max) FROM heros WHERE role_main = ‘射手’ or role_assist='射手’
查询不同的生命最大值的英雄数量:
SELECT COUNT(DISTINCT hp_max) FROM heros
查询不同的生命最大值英雄的平均生命最大值且保留小数点后两位:
SELECT ROUND(AVG(DISTINCT hp_max), 2) FROM heros
对英雄的主要定位分组并统计每组英雄数量:
SELECT COUNT(*), role_main FROM heros GROUP BY role_main
对于分组的筛选,我们一定要用HAVING,而不是WHERE。HAVING支持所有WHERE的操作。
你要记住,在SELECT查询中,关键字的顺序是不能颠倒的,它们的顺序是:
SELECT…FROM…WHERE…GROUP BY…HAVING…ORDER BY…
三、子查询的种类都有哪些,如何提高子查询的性能?
子查询从数据表中查询了数据结果,如果只执行一次,然后作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询。
如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后将结果反馈给外部,这种嵌套的执行方式就成为关联子查询。
比较集合子查询:
关键字 | 作用 |
---|---|
IN | 是否在集合中 |
ANY | 要与比较操作符一起使用,与子查询返回的任何值做比较 |
ALL | 要与比较操作符一起使用,与子查询返回的所有值作比较 |
SOME | 实际是ANY的别名,作用相同,一般使用ANY |
四、常用的SQL标准有哪些,在SQL92中是如何使用连接的?
SQL主要有两个标准:SQL92和SQL99。当然除了这两个,还存在SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2001、SQL:2016等其他标准。
SQL92中有5种连接方式:笛卡尔积、等值连接、非等值连接、外连接(左连接、右连接)和自连接。
1.笛卡尔积也称为交叉连接,作用是可以把任意表进行连接,即使这两张表不相关。
2.两张表的等值连接就是用两张表中都存在的列进行连接。我们也可以对多张表进行等值连接。
3.当我们进行多表查询的时候,如果连接多个表的条件是等号时,就是等值连接,其他的运算符连接就是非等值连接。
4.除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。两张表的外连接,会有一张表是主表,另一张是从表。如果是多张表的外连接,则第一张表是主表,即显示全部的行,剩下的表则显示对应连接的信息。
在SQL92中采用(+)代表从表所在的位置,且只有左外连接和右外连接,没有全外连接。左外接连,就是指左边的表是主表。
5.自连接可以对多个表进行操作,也可以对同一个表进行操作。