e的SQL鱼句10月份总结

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表格整理出,为方便对应标出了颜色。
应注意:以黄色数据为例,左边数据2条*右边数据2条,执行后黄色部分4条结果的对应方式
多个连接条件用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表格整理出,为方便对应标出了颜色。
注意粉色部分,左2*中2*右1=执行结果4条数据
自连接与非自连接没有运行出来。

自然连接中是以具有相同名字的列为连接条件的,还可以***使用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])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章