Note_Tech

All technological notes.


Project maintained by simonangel-fong Hosted on GitHub Pages — Theme by mattgraham

SQL - Function

Back


Group Function


SELECT columnname, function(columnname) ...
FROM tablename
WHERE condition
GROUP BY columnname1, columnname2
HAVING group_condition;


SUM


-- 总计某字段的所有值之和, ALL是默认值, 可以省略.
SELECT SUM(ALL col1)
FROM tablename;

-- 总计某字段的唯一值之和
SELECT SUM(DISTINCT col1)
FROM tablename;

-- 先计算两列和, 再总计两列和
SELECT SUM(col1 + col2)
FROM tablename;

-- 可以用于join
SELECT SUM(a.col1 + b.col2)
FROM tableA a JOIN tableB b
ON (a.col1 BETWEEN b.col3 AND b.col4)
WHERE a.col2 IS NOT NULL;


AVG


-- 总计某字段的所有值之均值, ALL是默认值, 可以省略.
SELECT AVG(ALL col1)
FROM tablename;

-- 总计某字段的唯一值之均值.
SELECT AVG(DISTINCT col1)
FROM tablename;

SELECT AVG(NVL(columnname, 0))
FROM tablename;
SELECT ROUND(AVG(NVL(col1, 0)))
FROM tablename;

COUNT

  1. Count the records that have non-NULL values in a specified field. 计算非空值.

  2. Count the total records that meet a specific condition, including those containing NULL values. 给定条件下,计算空值.


-- 总计某字段的所有值的个数, ALL是默认值, 可以省略. 此时只计算非空值.
SELECT COUNT(ALL col)
FROM tbname;

-- 计算唯一值的个数, 此时只计算非空值.
SELECT COUNT(DISTINCT col)
FROM tbname;

-- 计算某列是空值的个数
SELECT COUNT(*)  --注意, 括号中是星号, 不能是列名, 此时是计算所有符合条件的记录; 当是列名时,只计算非空值.
FROM tbname
WHERE colname IS NULL;  -- 列名在where语句中
-- WHERE colname IS NOT NULL;  --计算非空值个数的条件

-- 排除可能的空值方法: 使用NVL将空值转换,再计算个数
SELECT COUNT(NVL(colname,0))
FROM tbname;


MAX


-- 返回某字段的最大值, ALL是默认值, 可以省略.
SELECT MAX(ALL col1)
FROM tablename;

-- 返回某字段的唯一值的最大值
SELECT MAX(DISTINCT col1)
FROM tablename;

-- 先计算两列和, 再返回之和的最大自
SELECT MAX(col1 + col2)
FROM tablename;

MIN


-- 返回某字段的最小值, ALL是默认值, 可以省略.
SELECT MIN(ALL col1)
FROM tablename;

-- 返回某字段的唯一值的最小值
SELECT MIN(DISTINCT col1)
FROM tablename;

-- 先计算两列和, 再返回之和的最小值
SELECT MIN(col1 + col2)
FROM tablename;


Nesting Group Functions

-- 两层嵌套
SELECT AVG(SUM(quantity * paideach))
FROM orders o JOIN orderitems oi
ON o.order#=oi.order#
GROUP BY o.order#; --该处分组依据是order#, 则AVG是以order#的个数为除数, 如果换做其他列, 可能会因为NULL值而结果不同.


Datetime Function

SELECT NOW()
SELECT TIMEOFDAY()
SELECT CURRENT_TIME
SELECT CURRENT_DATE

EXTRACT()

SELECT EXTRACT(YEAR FROM CURRENT_DATE);
SELECT EXTRACT(MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DATE FROM CURRENT_DATE);
SELECT EXTRACT(QUARTER FROM CURRENT_DATE);
SELECT EXTRACT(DOW FROM CURRENT_DATE);    --weekday, sunday(0) to Saturday(6)
SELECT EXTRACT(HOUR FROM CURRENT_DATE);
SELECT EXTRACT(MINUTE FROM CURRENT_DATE);
SELECT EXTRACT(SECOND FROM CURRENT_DATE);

AGE()

SELECT AGE(datetime_col)

Mathematical Function


String Function


TO_CHAR()

TO_CHAR(date_col,patern)

CASE

-- general CASE stetement
CASE
  WHEN condition_1 THEN sql_code_1
  WHEN condition_2 THEN sql_code_2
  ELSE other_sql_code
END

-- CASE expression
CASE expression
  WHEN value_1 THEN sql_code_1
  WHEN value_2 THEN sql_code_2
  ELSE other_sql_code
END
-- General CASE statement
SELECT customer_id,
CASE
	WHEN customer_id <= 100 THEN 'Premium'
	WHEN customer_id BETWEEN 100 AND 200 THEN 'Plus'
	ELSE	'Normal'
END AS customer_class
FROM customer;

-- CASE expression
SELECT customer_id,
CASE customer_id
	WHEN 2 THEN 'Winner'
	WHEN 5 THEN 'Second Place'
	ELSE 'Normal'
END AS raffle_results
FROM customer;
-- userful trick
-- count rows met condition without using count()
SELECT
SUM(CASE rental_rate
	WHEN 0.99 THEN 1
	ELSE 0
END) AS bargains,
SUM(CASE rental_rate
	WHEN 2.99 THEN 1
	ELSE 0
END) AS regular,
SUM(CASE rental_rate
	WHEN 4.99 THEN 1
	ELSE 0
END) AS premium
FROM film;

COLAESCE

-- Syntax
COALESCE(arg_1, arg_2)

-- use case
SELECT COALESCE(1, 2)   -- 1
SELECT COALESCE(NULL, 1, 2)   -- 2
SELECT COALESCE(NULL, NULL)   -- Null

CAST

-- CAST function
SELECT CAST('5' AS INTEGER)
SELECT CAST(col_name AS TIMESTAMP)
FROM tb_name;

-- CAST operator
SELECT '5'::INTEGER;

-- Use case
SELECT CHAR_LENGTH(CAST(inventory_id AS VARCHAR))
FROM rental;


NULLIF

-- Syntax
NULLIF(arg_1, arg_2)

-- Example
-- 该处存在'B'不存在的情况, 则会发生除数为零的错误
-- 使用NULLIF函数则当除数为零时, 返回null
-- 由于其中一个运算数是null, 所以select返回null
SELECT (
SUM(CASE WHEN department = 'A' THEN 1 ELSE 0 END)/
	NULLIF(SUM(CASE WHEN department = 'B' THEN 1 ELSE 0 END),0)
) AS department_ratio
FROM depts;

TOP