SQL必知必会 | 3

一、什么是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.自连接可以对多个表进行操作,也可以对同一个表进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值