学习笔记--【MS SQL 学习:3】

SQL 关联与函数

JION:

先列出可以使用的不同的 SQL JOIN 类型:

INNER JOIN:如果表中有至少一个匹配,则返回行

LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

FULL JOIN:只要其中一个表中存在匹配,则返回行

SELF JOIN:用于将表连接到自己,就好像该表是两个表一样,临时重命
名了SQL语句中的至少一个表

CARTESIAN JOIN:从两个或多个连接表返回记录集的笛卡儿积

1.SQL INNER JOIN 语法(内部连接)

SELECT column_name(s)
    FROM table1
    INNER JOIN table2 ON table1.column_name = table2.column_name;

2.SQL LEFT JOIN 语法(左连接)

SELECT column_name(s)                
    FROM table1                
    LEFT JOIN table2                
    ON table1.column_name=table2.column_name;

3.SQL RIGHT JOIN 语法(右连接)

SELECT column_name(s)
    FROM table1
    RIGHT JOIN table2 ON table1.column_name = table2.column_name;

4.SQL FULL OUTER JOIN 语法(外连接)

SELECT column_name(s)
    FROM table1
    FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

5.Self JOIN语法(自连接)

SELECT column_name(s)
    FROM table1 T1, table1 T2
    WHERE condition;

函数:

时间函数

ETDATE()	返回当前的日期和时间
DATEPART()	返回日期/时间的单独部分
DATEADD()	在日期中添加或减去指定的时间间隔
DATEDIFF()	返回两个日期之间的时间
CONVERT()	用不同的格式显示日期/时间

SQL Server 使用下列数据类型在数据库中存储日期或时间值:

DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:唯一的数字

窗口函数 、分析排名函数

OVER()函数
CUME_DIST 计算的逻辑是:小于等于当前值的行数/分组内总行数

PERCENT_RANK 计算的逻辑是:(分组内当前行的RANK值-1)/ (分组内总行数-1),排名值是RANK()函数排序的结果值。
PERCENTILE_CONT和PERCENTILE_DISC都是为了计算百分位的数值,比如计算在某个百分位时某个栏位的数值是多少。

在一次查询中,对数据表进行排序,把已排序的数据从上向下看作是一个序列,对当前行而言,在序列上方的为后,在序列下方的为前。

在同一分组内,对于当前行,Lag()函数用于获取从当前行开始向后(或向上)计数的第N行,Lead()函数用于获取从当前行开始向前(或向下)计数的第N行。

RANK、NTILE、DENSE_RANK和ROW_NUMBER,和OVER()函数搭配使用,按照特定的顺序排名。

ROW_NUMBER函数实际上是一个序列,每个分组内都会创建一个序列,序列从1开始,按照顺序依次 +1 递增。

ROW_NUMBER ( ) 
    OVER ( [ PARTITION_BY_clause ] order_by_clause )
分组内序列的最大值就是该分组内的行的数目。

RANK函数用于排名时,不会返回连续的整数。RANK函数的语法是:在分组内,按照特定的顺序排名,序号从1依次递增,排名函数以tie为单位,每个tie中的所有行的排名是相同的,排名可能是不连续的。

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

排名的算法是:

step1:按照指定的分区字段分组,在每个分组内按照指定的字段排序。
step2:在每个分组内,如果相邻的两行或多行相同在排序字段上的值相同,那么这些行称作一个tie,每个tie中的所有行都会获得相同的排名。
step3:后面的排名会计算每个tie中的行数,RANK函数不总是返回连续的整数,例如,班级中,A,B分数都是100分,C的分数是90分,那么A和B的排名是1,C的排名是3。

DENSE_RANK函数用于排名时,会返回连续的整数。每个tie占用一个排名,每个tie中的所有行的排名是相同的。排名值是连续的

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
排名的算法是:

step1:按照指定的分区字段分组,在每个分组内按照指定的字段排序。
step2:在每个分组内,如果相邻的两行或多行相同在排序字段上的值相同,那么这些行称作一个tie,每个tie中的所有行都会获得相同的排名。
step3:后面的排名会计算每个tie中的行数,RANK函数总是返回连续的整数,例如,班级中,A,B分数都是100分,C的分数是90分,那么A和B的排名是1,C的排名是2。

在每个分组中,NTILE按照指定的顺序,把数据行分为N个小组(tile),NTILE返回小组编号。在每个分组内,具有相同的小组编号的数据行,位于同一个小组。注意:小组的编号是按照行数,而不是按照列值。在同一分组内,存在两行的列值相同,而小组编号不同。

NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
如果分区中的行数不能被integer_expression整除,那么会导致小组相差一个成员:较大的小组按OVER子句指定的顺序位于较小的小组之前。 例如,如果把8行分为3个小组,前2个小组有3行,后一个小组有2行。

如果分区中的中行数能被integer_expression整除,那么每个小组具有相同的行数。

特别地,NTILE(4) 把一个分组分成4份,叫做Quartile。

数据类型转换

 

CASE

CASE WHEN 条件 
     THEN 结果
     ELSE 结果
END

MERGE

MERGE INPUT_table a USING source_table c
ON a.column=c.column
WHEN MATCHED
    THEN UPDATE SET 
        t.category_name = s.category_name,
        t.amount = s.amount
WHEN NOT MATCHED
    THEN INSERT (category_id, category_name, amount)
         VALUES (s.category_id, s.category_name, s.amount)
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

日期函数

DATENAME
以字符串形式返回日期部分

DATEPART
以整数形式返回日期部分

DAY
以整数形式返回指定日期

MONTH
以整数形式返回指定日期的月份

YEAR
以整数形式返回日期的年份

DATEDIFF
返回两个日期之间的日期部分的差值。

DATEDIFF_BIG
返回两个日期之间的日期部分的差值
DATEADD
将值添加到日期部分并返回新的日期值。

EOMONTH
返回包含指定日期的月份的最后一天,并带有可选的偏移量。

SWITCHOFFSET
更改DATETIMEOFFSET值的时区偏移量并保留UTC值。

TODATETIMEOFFSET
将datetime2值转换为datetimeoffset值。

分组

SELECT
    d1,
    d2,
    d3,
    aggregate_function (c4)
FROM
    table_name
GROUP BY
    GROUPING SETS (
        (d1,d2),
        (d1),
        (d2),
        ()
     );

与上文相同

GROUP BY
    CUBE (d1, d2);

其他

ISNULL: 当第一个字段为null时获取后面的内容

GETDATE():返回当前系统的日期和时间,

Truncate table table_name; 清空表内容

select distinct  去重

WITH AS短语,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到。 可以使SQL语句的可读性更高,也可以在UNION ALL的不同部分,作为提供数据的部分。 对于UNION ALL,使用WITH AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。

COUNT():计数,
MAX():最大,
MIN():最小,
AVG():均值, 
SUM():求和,
LAST():最后一个值,
FIRST():第一个值,
LOWER(s):转为大写,
LCASE(s):转为小写,
UCASE():转为大写,
LCASE()转为小写,
MID():用于从文本字段中提取字符,
LEN():返回文本字段中值的长度,
ROUND():用于把数值字段舍入为指定的小数位数, 
FORMAT():用于对字段的显示进行格式化, 
SQRT:用于计算得出任何数值的平方根,
RAND:用于产生 0 至 1 之间的随机数,
CONCAT:用于将两个字符串连接为一个字符串,
SQL REPLACE():字符串替换函数,
SQL TRIM():去除字符串头尾空格

CUME_DIST
计算一组值中的值的累积分布

DENSE_RANK
为结果的分区内的每一行分配一个排名值,排名值没有间隙。

FIRST_VALUE
获取结果集的有序分区中第一行的值。

LAG
提供对当前行之前的给定物理偏移的行的访问。

LAST_VALUE
获取结果集的有序分区中最后一行的值。

LEAD
提供对当前行之后的给定物理偏移量的行的访问。

NTILE
将有序分区的行分配到多个组或存储桶中。

PERCENT_RANK
计算一组值中值的百分比排名。

RANK
为结果集的分区中的每一行分配一个排名值。

ROW_NUMBER
为结果集的分区内的行分配唯一的顺序整数,第一行从1开始。


TOP

SELECT - 从数据库中提取数据
SELECT TOP 子句用于指定要返回的记录数量。
SELECT TOP子句在包含数千条记录的大型表上很有用。返回大量记录会影响性能。

注:并不是所有的数据库系统都支持SELECT

TOP子句。MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。

以下SQL语句从"Customers"表中选择前三个记录:
SELECT TOP 3 * FROM Customers;

注: LIMIT作为一种简单的分页方法,主要是为了减少数据返回的时间,如果您查询一个非常大的表(例如一个有数十万或数百万行的表)而不使用限制,那么您可能会等待很长时间才能显示所有的结果,所以使用LIMIT可以减少查询数据返回的时间,提高效率。

运算符:加减乘除求余、大于小于等于、and、or、all 、any 、between 、exists 、in、 like 、not 、is null、unique

IS NULL
IS NULL运算符用于将值与NULL值进行比较。

EXISTS
EXISTS运算符用于搜索指定表中是否存在满足特定条件的行。
集合
UNION - 将两个或多个查询的结果集合并到一个结果集中。INTERSECT - 返回两个或多个查询的结果集的交集。
EXCEPT - 查找两个输入查询的两个结果集之间的差集。

IF EXISTS(SELECT * FROM sysobjects WHERE name='PK_stuNo' and xtype='PK')
  Alter TABLE stuInfo
    Drop Constraint PK_stuNo
Go
运算符	描述
ALL   	ALL运算符用于将值与另一个值集中的所有值进行比较。

AND 	AND运算符允许在SQL语句的WHERE子句中指定多个条件。

ANY 	ANY运算符用于根据条件将值与列表中的任何适用值进行比较。

BETWEEN ### BETWEEN运算符用于搜索在给定最小值和最大值内的值。

SQL BETWEEN 运算符

BETWEEN运算符用于选取介于两个值之间的数据范围内的值。
BETWEEN运算符选择给定范围内的值。值可以是数字,文本或日期。
BETWEEN运算符是包含性的:包括开始和结束值,且开始值需小于结束值。     

IN ### IN运算符用于将值与已指定的文字值列表进行比较。

SQL IN 运算符

IN 运算符允许您在 WHERE 子句中指定多个值。
IN 运算符是多个 OR 条件的简写。

SQL IN 语法
SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...);
或者
SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT);

LIKE ### LIKE运算符用于使用通配符运算符将值与类似值进行比较。

有两个通配符与LIKE运算符一起使用:
% - 百分号表示零个,一个或多个字符
_ - 下划线表示单个字符


LIKE              运算符       	    描述

WHERE CustomerName LIKE 'a%'    	查找以“a”开头的任何值
WHERE CustomerName LIKE '%a'	    查找以“a”结尾的任何值
WHERE CustomerName LIKE '%or%'  	在任何位置查找任何具有“or”的值
WHERE CustomerName LIKE '_r%'   	在第二个位置查找任何具有“r”的值
WHERE CustomerName LIKE 'a_%_%'	  查找以“a”开头且长度至少为3个字符的值
WHERE ContactName  LIKE 'a%o'	    找到以"a"开头,以"o"结尾的值

注意: MS Access使用问号(?)而不是下划线(_)。百分号和下划线也可以组合使用!

NOT	    NOT运算符反转使用它的逻辑运算符的含义。 例如:NOT EXISTS, NOT BETWEEN, NOT IN等等,这是一个否定运算符。

OR	    OR运算符用于组合SQL语句的WHERE子句中的多个条件。

UNIQUE ### UNIQUE运算符搜索指定表的每一行的唯一性(无重复项)。

UNION运算符用于组合两个或更多SELECT语句的结果集,而不返回任何重复的行。
UNION中的每个SELECT语句必须具有相同的列数
这些列也必须具有相似的数据类型
每个SELECT语句中的列也必须以相同的顺序排列
每个SELECT语句必须有相同数目的列表达式
但是每个SELECT语句的长度不必相同

SQL UNION 语法:
SELECT column_name(s) FROM table1 [WHERE condition]
UNION
SELECT column_name(s) FROM table2 [WHERE condition];

SQL UNION ALL 语法:
SELECT column_name(s) FROM table1 [WHERE condition] 
UNION ALL
SELECT column_name(s) FROM table2 [WHERE condition];

注:where后可跟运算符表达式不能跟函数,hving后可以跟任何条件

通配符:通配符用于替换字符串中的任何其他字符。

通配符与 SQL LIKE 运算符一起使用。
在 WHERE子句中使用LIKE运算符来搜索列中的指定模式。 
有两个通配符与 LIKE 运算符一起使用:
% - 百分号表示零个,一个或多个字符
_ - 下划线表示单个字符

注意:

MS Access 使用星号(*)通配符而不是百分比符号(%)通配符。 
MS Access 使用问号(?)而不是下划线(_)。
在MS Access和SQL Server中,你也可以使用:
[ charlist ] - 定义要匹配的字符的集合和范围
[^ charlist ]或[!charlist ] - 定义不匹配字符的集合和范围
通配符也可以组合使用!

表达式:有不同类型的sql表达式,如下所示:布尔型、数值型、日期

1.
SELECT column1, column2, columnN FROM table_name WHERE [CONDITION|EXPRESSION];

1.SQL布尔表达式基于匹配单个值获取数据。
句法:
SELECT column1, column2, columnN FROM table_name WHERE SINGLE VALUE MATCHING EXPRESSION;
例如:
SELECT * FROM CUSTOMERS WHERE SALARY = 10000;



2.数值表达式用于在任何查询中执行任何数学运算。
句法:
SELECT numerical_expression as  OPERATION_NAME [FROM table_name WHERE CONDITION] ;
例如:SELECT (15 + 6) AS ADDITION
SELECT COUNT(*) AS "RECORDS" FROM CUSTOMERS; 


3.日期表达式。日期表达式返回当前系统日期和时间值:
SELECT CURRENT_TIMESTAMP;
:+---------------------+
  | Current_Timestamp   |
  +---------------------+
  | 2009-11-12 06:40:23 |
  +---------------------+
  1 row in set (0.00 sec)
  
SELECT  GETDATE();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值