sql函数相关

每个数据库相关的博客我都要写sql执行顺序:

1.FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1

2ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
3.JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
4.WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
5.GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
6.HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。
7.SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
8.DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
9.ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
10.LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

写的顺序:select … from… where… group by… having… order by… limit [offset,]
(rows)
执行顺序:from… where…group by… having… select … order by… limit

首先数据库拥有很多内置的常用的函数 比如时间函数:NOW DATE();返回行数:COUNT() 等等:
具体的内建函数分为两类:如下
Aggregate 函数:计算从列中取得的值,返回一个单一的值。

AVG() - 返回平均值
COUNT() - 返回行数
FIRST() - 返回第一个记录的值
LAST() - 返回最后一个记录的值
MAX() - 返回最大值
MIN() - 返回最小值
SUM() - 返回总和

Scalar 函数:基于输入值,返回一个单一的值。
Scalar 函数:

UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式

不熟悉的函数操作说明:
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

SELECT COUNT(column_name) FROM table_name;

SQL COUNT(*) 语法

COUNT(*) 函数返回表中的记录数:

SELECT COUNT(*) FROM table_name;

SQL COUNT(DISTINCT column_name) 语法

COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

SELECT COUNT(DISTINCT column_name) FROM table_name;

注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SQL FIRST() 语法:

SELECT FIRST(column_name) FROM table_name;

注释:只有 MS Access 支持 FIRST() 函数。
MySQL相同功能语法:SELECT column_name FROM table_name ORDER BY column_name ASC LIMIT 1;
SQL LAST() 语法:

SELECT LAST(column_name) FROM table_name;

注释:只有 MS Access 支持 LAST() 函数。
同,MySQL相同功能语法:select column_name from table_name order by column_name desc limit 1;

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
**SUM() 函数:**SUM() 函数返回数值列的总数。
SQL SUM() 语句:

select sum(column_name) from table_name;
简单,但是有时候有妙用

除此之外,还能自己写sql函数:
自定义函数分为二种,一种是标量值函数,另一种是表格值函数

1 .标量值函数 :返回一个标量值
语法:

Create function 函数名(参数)
Returns 返回值数据类型
as
begin
SQL语句(必须有return 变量或值)
End
看着不明不白的…举个栗子:

CREATE  FUNCTION MySTR(@strs VARCHAR(50))
RETURNS VARCHAR(50) 
AS
BEGIN
 DECLARE @str2 VARCHAR(30)
 SET @str2=@strs
 RETURN @str2
END
 --执行函数
SELECT dbo.MySTR('aa') AS result

在sql 语句也可以这样用:
DECLARE @str3 VARCHAR(30)
 SET @str3=(select name from userinfo where huji=dbo.MySTR('邯郸') and id=23 )
select @str3

2 表格值函数 ,表格值函数有二种(内联表格值函数,多句表格值函数)‘

a 内联表格值函数
语法:
create function 函数名(参数)
returns table
as
return(一条SQL语句)
示例:

CREATE  FUNCTION   tabcmess(@title VARCHAR(10))
RETURNS  TABLE 
AS 
return(select title,des from product where title like '%'+@title+'%')

–执行
SELECT * FROM tabcmess(‘aaa’)

b、 多句表格值函数

   create function 函数名(参数)
   returns 表格变量名table (表格变量定义)
as
   begin
    SQL语句
   end

示例:
复制代码

CREATE   function tabcmessalot (@title varchar(10))
Returns @ctable table(title varchar(10) null,des varchar(100) null)
As
Begin
Insert @ctable Select title,des from product WHERE title LIKE '%'+@title+'%'
return
End

–执行

SELECT * FROM tabcmessalot('aaa')

拆分函数

USE [XSMAN_DB]
GO
/****** Object:  UserDefinedFunction [dbo].[func_SplitToTable]    Script Date: 12/03/2012 23:25:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================  
-- Author:  cxy  
-- Create date: 2010-10-28  
-- Description: 根据分隔符分割字符串,返回表  
-- =============================================  
Create FUNCTION [dbo].[func_SplitToTable]  
(  
 @SplitString nvarchar(max),  
 @Separator nvarchar(10)=' '  
)  
RETURNS @SplitStringsTable TABLE  
(  
 [id] int identity(1,1),  
 [value] nvarchar(max)  
)  
AS  
BEGIN  
 DECLARE @CurrentIndex int;  
 DECLARE @NextIndex int;  
 DECLARE @ReturnText nvarchar(max);  
 SELECT @CurrentIndex=1;  
 WHILE(@CurrentIndex<=len(@SplitString))  
 BEGIN  
  SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);  
  IF(@NextIndex=0 OR @NextIndex IS NULL)  
   SELECT @NextIndex=len(@SplitString)+1;  
  SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);  
  INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);  
  SELECT @CurrentIndex=@NextIndex+1;  
 END  
 RETURN  
END

–执行函数 1
select * from dbo.func_SplitToTable(‘1,2’,’,’)
–执行函数 2
select * from dbo.func_SplitToTable(‘1-2-3’,’-’)
–执行函数 3
select * from dbo.func_SplitToTable(‘1 2 3’,’ ')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值