TIPS:
语句关键字尽量大写,关键字不要分行也不要缩写,
字符串型和日期时间类型使用单引号 ’ ’
别名,使用双引号 " ",不要省略as
所有运算符或列值遇到null值,运算的结果都为null
SQL语句 | 功能 | 关键词举例 |
---|---|---|
DDL | 定义 | CREATE、DROP、ALTER |
DML | 操作 | INSERT、DELETE、UPDATE、SELECT |
DCL | 控制 | GRANT、ROVOKE、COMMINT、ROLLBACK、SAVEPOINT |
查询语句
代码执行记录
查询表的前五行ID:
SELECT TOP 5 [ID] FROM [test]
查询表的ID并把表头更名为ONE:
SELECT [ID] AS ONE FROM [test]
或用双引号
SELECT [ID] "ONE" FROM [test]
查询ID并去掉重复行:
SELECT DISTINCT [ID] FROM [test]
显示表结构代码没有执行出来:DESCRIBE 表名。
显示ID=62的名字:
SELECT [Name] FROM [test] WHERE [ID]=62
显示ID=62、63、64的名字:
SELECT [Name] FROM [test] WHERE [ID]IN (62,63,64)
显示ID介于62到65之间的名字:
SELECT [Name] FROM [test] WHERE [ID]BETWEEN 62 AND 65
ESCAPE转义字符串:
请注意区别“ % ”和“ _ ”的区别。“ % ”会通配显示多个字符,比如会显示出19、39、109、1279。“ _ ”会通配显示一个字符,比如会显示出19、39、79。
SELECT [ID] FROM [test] WHERE [ID] LIKE '%9'
SELECT [ID] FROM [test] WHERE [ID] LIKE '_9'
如果要查询的username中含有“ % ” 和“ _ ”的,需要使他们不再作为通配符。需将 “ % ”和“ _ ”在like中转义,以“ _ ”举例。
SELECT [ID] FROM [test] WHERE [ID] LIKE '/_9' escape '/'
显示ID为空的名字:
SELECT [Name] FROM [test] WHERE [ID] is NULL
显示ID不为空的名字:
SELECT [Name] FROM [test] WHERE [ID] is not NULL
异或显示不出来:XOR ??
排序数据,默认升序排列,降序需要加 DESC:
SELECT [ID] FROM [test] ORDER BY [ID]
SELECT [ID] FROM [test] ORDER BY [ID] DESC
多表查询
此后对代码不做删减,直接复制感受,因从实际项目中导出的数据,故表的名称列名比较长。
多表查询显示中,需要给表做连接,连接时WHERE处写 左表名.左表中的列名=右表名.右表中的列名,这里的表与列名中间用“. ”点来连接;代码之前的列与列、表与表用“,”逗号连接。
SELECT [ContractFilingBodyRemindID],[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind],
[test].[dbo].[ContractFilingBodyPayment]
WHERE [test].[dbo].[ContractFilingBodyRemind].[ContractFilingHeadID]=[test].[dbo].[ContractFilingBodyPayment].[ContractFilingHeadID]
显示结果用Excel表格整理出,为方便对应标出了颜色。
多个连接条件用AND操作符连接。
表的别名:
使用表名可简化查询,提高执行效率。代码中用一个字母缩写代表了一个表名。
SELECT d.[ContractFilingBodyRemindID],t.[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind] d,
[test].[dbo].[ContractFilingBodyPayment] t
WHERE d.[ContractFilingHeadID]=t.[ContractFilingHeadID]
查询多个表就需要多个连接条件。如三个表,条件处就需要用AND,**不是写成连等!!**连等的话会报错。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
x.[AnnexID]
FROM [test].[dbo].[ContractFilingBodyRemind] d,
[test].[dbo].[ContractFilingBodyPayment] t,
[test].[dbo].[ContractFilingBodyAnnex] x
WHERE d.[ContractFilingHeadID]=t.[ContractFilingHeadID]
AND t.[ContractFilingHeadID]=x.[ContractFilingID]
显示结果用Excel表格整理出,为方便对应标出了颜色。
自连接与非自连接没有运行出来。
自然连接中是以具有相同名字的列为连接条件的,还可以***使用ON子句创建连接***。
使用 ON 子句指定额外的连接条件是与其它条件分开的。ON 子句使语句具有更高的易读性。
SELECT d.[ContractFilingBodyRemindID],t.[ContractFilingBodyPaymentID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
多条件时多个ON子句
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
x.[AnnexID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
JOIN [test].[dbo].[ContractFilingBodyAnnex] x
ON t.[ContractFilingHeadID] = x.[ContractFilingID]
左连接是以左表的数据为基准,当右表没有对应数据显示为空。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
d.[ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
LEFT OUTER JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
执行结果如图,对比红色字体的数据。
右连接是以右表的数据为基准,当左表没有对应数据显示为空。
SELECT d.[ContractFilingBodyRemindID],
t.[ContractFilingBodyPaymentID],
t.[ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind] d
RIGHT OUTER JOIN [test].[dbo].[ContractFilingBodyPayment] t
ON d.[ContractFilingHeadID] = t.[ContractFilingHeadID]
执行结果如图,对比红色字体的数据。
最后编辑于2019年10月30日
函数
基本函数(杂)
追加补充(2019年10月31日)
1.UNION ALL操作符返回两个查询结果集的并集,对两个结果集的重复部分不去重。
函数 | 用法 |
---|---|
CONCAT(S1,S2,…,Sn) | 连接S1,S2,…,Sn为一个字符串 |
CHAR_LENGTH(s) | 返回字符串s的字符数 |
LENGTH(s) | 返回字符串s的字节数,和字符集有关 |
INSERT(str,index,len,instr) | 将字符串str从第index位置开始,len个字符长的子串替换为字符串instr |
UPPER(s)或UCASE(s) | 将字符串s的所有字母转成大写字母 |
LOWER(s)或LCASE(s) | 将字符串s的所有字母转成小写字母 |
LEFT(s,n) | 返回字符串s最左边的n个字符 |
RIGHT(s,n) | 返回字符串s最右边的n个字符 |
REPLACE(str,a,b) | 用字符串b替换字符串str中所有出现的字符串a |
STRCMP(s1,s2) | 比较字符串s1,s2 |
ABS(x) | 返回x的绝对值 |
RAND() | 返回0~1的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位的小数的值 |
SQRT(x) | 返回x的平方根 |
POW(x,y) | 返回x的y次方 |
IF(value,t,f) | 如果value是真,返回t,否则返回f |
IF NULL(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2…[ELSE result n]END | 相当于Java的if…else if…else |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1…[ELSE 值n]END | 相当于Java的switch…case… |
database() | 返回当前数据库名 |
version() | 返回当前数据库版本 |
user() | 返回当前登录用户名 |
分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
对数值型数据使用AVG()和SUM()函数。
对任意数据使用MAX()、MIN()和COUNT()函数。
SELECT AVG([ContractFilingBodyRemindID]),
MAX([ContractFilingBodyRemindID]),
MIN ([ContractFilingBodyRemindID]),
SUM([ContractFilingBodyRemindID])
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [RemindName] LIKE '赵宏%'
COUNT(*)返回表中记录总个数,COUNT(expr)返回expr不为空的记录总数。
SELECT COUNT(*)
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID]=19
子查询:
代码表示:返回[ContractFilingHeadID]与134相同的,[ContractFilingBodyRemindID]大于135的数据的[RemindNumber]和[RemindRemark]列。
SELECT [RemindNumber],[RemindRemark]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID] =
(SELECT [ContractFilingHeadID]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingBodyRemindID]=134)
AND [ContractFilingBodyRemindID] >
(SELECT [ContractFilingBodyRemindID]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingBodyRemindID]=135)
代码表示:返回[ContractFilingHeadID]最少的数据的[RemindNumber]和[RemindRemark]列。
SELECT [RemindNumber],[RemindRemark]
FROM [test].[dbo].[ContractFilingBodyRemind]
WHERE [ContractFilingHeadID] =
(SELECT MIN([ContractFilingHeadID])
FROM [test].[dbo].[ContractFilingBodyRemind])