sql基本语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql基本语法相关的知识,希望对你有一定的参考价值。

--查询
select DB_ID(‘B2C‘)

--检查数据库是否存在
if DB_ID(‘B2C‘) is not null

--使用数据库
use B2C

--单引号表示字符串,双引号则不是 U 表示用户表
select OBJECT_ID(‘UserName‘,‘U‘)  
--主键约束Primary key
--唯一约束Unique
--外键约束foreign key () references
--检查约束Check
--非空约束

--Select 语句的元素
--From
--Where
--Group by
--Having
--Select
--Order by

--表达式
select  orderdate,year(orderdate) as 订单年份
from Orders;
--选择
select orderdate,year(orderdate) as 订单年份
from Orders
where year(orderdate)=2006

--查询同一年出生的员工人数
select YEAR(birthdate),COUNT(*)
from Employee
group by YEAR(birthdate)

--百分比
select top (20) percent lastname,firstname
from hr.employees

--开窗函数 over
select lastname,firstname,count(*) over ()
from hr.employees

--带有总价的订单
--partition by  相当于做一个相对的选择,选出等于的值
select lastname,firstname,val
,sum(val) over( partition by custid) as 顾客总价
,sum(val) over() as 总价
from Sales.OrderValues

--排名函数
--row_number 行号  必须与 over 配合
--rank       排名
--dense_rank 密集排名
--ntile      分组
select row_number() over( order by lastname ),lastname,firstname
       rank()       over( order by country) as 排名,
       dense_rank() over( order by country) as 密集排名,
       ntile(5)     over( order by country) as 分组,
from hr.employees

--排名结合部分
select row_number() over( order by country)
       row_number() over( partition by country order by country),
       country,lastname,firstname
      from hr.employees

--between and
select *
from OrderValues
where val between 1000 and 200

--in 枚举值
select *
from OrderValues
where custid in (1,2,8)

--like 字符串匹配  % 任意多个任意字符  _任意一个任意字符

--简单表达式
select lastname,region,
 case  region          -switch
       when ‘WA‘ then ‘华盛顿‘   --case
       else ‘其他特区‘
  end
from employees

--搜索表达式
select lastname,region,
case
     when region=‘WA‘ then ‘华盛顿特区‘
     when region is null then ‘位置地区‘
     else ‘其它地区‘
end
from employees;

--定义变量
declare @s char(10),
--赋值之后,实际上已经填满了10个字符
set @s=‘hello‘
print @s
set @s = @s+‘world‘
print @s

--注意:在SQL 中,下标从1开始
select productname,substring(productname,9,10)
from production.Products

--left 表示左边
select productname, left(productname,8)
from production.Products

--right 表示取右边的部分
select productname,right(productname,8)
from production.Products

--模版在前,源字符串在后,空格出现在名字中的位置,从1开始
select productname,charindex(‘‘,productname)
from production.Products

--将产品名称中的product 替换为产品名
select productname,replace(productname,‘Product‘,‘产品名‘)
from production.Products

--stuff 替换
select productname,stuff(productname,8,1,‘ : ‘)
from production.Products

--转换大写 和 小写
select productname,upper(productname),lower(productname)
from production.Products

--去空格
select  datalength(rtrim(string))
select ltrim(rtrim(string))

--字符串方式表示日期
select orderid,orderdate
from Sales.orders
where orderdate > ‘20080301‘

--cast 转换 datetime   这个和上面一个是等价的
select orderid,orderdate
from Sales.orders
where orderdate > cast (‘20080301‘ as datetime)

-- datepart 取日期中的一部分
select getdate()

--年,月,日,小时,分钟,秒
select datepart(year,getdate()),
       datepart(month,getdate()),
       datepart(day,getdate()),
       datepart(hour,getdate()),
       datepart(minute,getdate()),
       datepart(second,getdate()
       
--特殊
select datepart(dayofyear,getdate()),-- 从年初到现在的天数
       datepart(weekday,getdate()),--星期几,从星期天开始为1
       datepart(week,getdate()) --今年的第几周

select year(getdate()),month(getdate()),day(getdate()

--日期加和减  日期加法 单位
select getdate(),dateadd(month,2,getdate()) -- 加两个月
       dateadd(year,3,getdate()),
       dateadd(minute,30,getdate())
       
--日期减法 单位
select datediff(year,‘19491001‘,getdate())

--计算今年多少岁
select datediff(year,‘19800101‘,getdate())

--练习1
select *
from Sales.Orders
where year(orderdate)=2007 and month(orderdate)=7

select *
from Sales.Orders
where datepart(year,orderdate)=2007 and
      datepart(month,orderdate)=6
--还可以 ‘200706‘
--将日期转换成字符串
select *
from Sales.Orders
where left(convert(nvarchar,(orderdate),112),6)=‘200706‘

select getdate(),convert(nvarchar,getdate(),112),
       left(convert(nvarchar,getdate(),112),6)
       
select convert(int,‘99‘)+100
select cast(‘99‘ as int)+100

select orderid,sum(unitprice * qty)
from Sales.Orderdatails
group by orderid
having sum(unitprice *qty) >10000
order by sum(unitprice * qty) desc

--3-1交叉连接和内连接
--连接查询  cross 翻译十字   所以的都做了一次匹配
select empid,shipperid
from Hr.employees cross join Sales.Shippers

--内连接  必须符合特定条件的组合
select c.categoryid,productid,p.productname,c.categoryname
from production.Categories c inner join production.products p
on c.categoryid=p.categoryid

--查询每个顾客的名称,已经下过多少张订单
select distinct c.custid,contactname,orderid,
       count(*) over(partition by o.custid)
       from Sales.Customers c inner join Sales.Orders o
       on c.custid=o.custid
       
--插入10 条记录
insert into digits (digit)
values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

--生成数字
select d1.digit,d2.digit, d3.digit* 10 + d2.digit*10 +d1.digit
from digits di cross join digits d2
  cross join digits d3

--实现1-1000
select row_number() over(order by d1.digit) as digit
from digits d1 cross join digits d2
     cross join digits d3
     order by digit

--查询每张订单多少钱
select distinct o.orderid,orderdate,
     sum(qty * unitprice) over(partition by o.orderid)
from Sales.Orders o inner join Sales.OrderDatails d
on o.orderid=d.orderid

--左外连接
select count(*)
from Sales.Customers c left outer join Sales.Order o
on c.sutid =o.custid

--右外连接
select count(*)
from Sales.Customers c right outer join Sales.Order o
on c.sutid =o.custid

--组函数不包含 Null
select  distinct c.contactname,
count(o.orderid) over(partition by c.custid)  ordercount
from Sales.Customers c left outer join Sales.Orders o
on c.custid=o.custid
order by ordercount

--查询一下所有的雇员都处理过订单
 select e.empid,count(o.orderid),lastname
 from hr.employee e left outer join sales.orders o
      on e.empid=o.empid
group by e.empid,lastname
having count(o.orderid)=0

--将员工表和订单表做一个外连接
select e.empid,e.lastname
from left outer join sales.orders o
where o.orderis is null

--查询有顾客但是没有供应商的国家
select distinct c.country as 客户国家,s.country as 供应商国家
from Sales.Customers c left outer join Production.Suppliers s
     on c.country=s.country
where c.country is null

--全外连接,查询所有的国家,有无供应商,有无顾客
select distinct c.country as 客户国家,s.country as 供应商国家
from Sales.Customers c full outer join Production.Suppliers s
    on c.country=s.country
    
--2008年中 ,每天有多少订单
select orderdate,count(*)
from sales.orders
where orderdate between ‘20080101‘ and ‘20081231‘
group by orderdate

select orderdate,count(*) over (partition order by orderdate)
from sales.orders
where orderdate between ‘20080101‘ and ‘20081231‘

--创建一个表,向表里写入400条数据
create table nums
(
n int
)
declare @i int
set @i=1
while @i<400
 begin
set @[email protected]+1
insert into values(@i)
end

--制作一个连续的日期

select dateadd(day,n,‘20071231‘)
from nums

--与订单表做一个连接
select dateadd(day,nums.n,‘20071231‘) noorderdate
from nums left outer join salas.orders
     on dateadd(day,nums.n,‘20071231‘)=sales.orders.orderdate
where sales.orders.orderid is null
order by noorderdate


--子查询
select lastname
where birthdate=(select max(birthdate) from hr.employees)

--独立子查询 没有用到外部的子查询叫独立子查询


--相关子查询  解释: 子查询查询出现了子查询以外的查询叫做相关子查询
select custid,contactname,
(
select count(*)
from Sales.Orders
where Sales.Orders.custid=Sales.Customerscustid
) as ordercount
from Sales.Customers

--还有一些复杂的情况考虑
--多值子查询   这里用 exists 也可 是否存在
select distinct country
from Sales.Customers
where country not in
(
select distinct country
from Production.Suppliers
)
--使用相关子查询
select distinct country
from Sales.Customers c
where
not exists
(
select country from Production.Suppliers s
 where s.country=c.country
 )


--高级子查询

--查询一个数字的上一个数和下个数   使用相关子查询
select orderid,
  (
    select max(orderid)
    from Sales.orders innerT
    where innerT.orderid < outerT.orderid
  ) as prevOrder,
  (
  select min(orderid)
  from Sales.orders innerT
  where innerT.orderid> outerT.orderid
  ) as nextOrder
  from Sales.Order outerT


select e.empid,fistname,lastname
from Sales.Orders o right outer join Hr.Employees e
 on o.empid=e.empid and o.orderdate>=‘20080501‘
 where o.orderid is null

--客户表中出现过,雇员表中没有出现过的国家
select distinct country
from Sales.Customers
where country not in (
 select country
  from hr.employees
)
--考虑用连接
select c.country
from Sales.Cutomers c left outer join Hr.Employees e
   on c.country =e.country
   where c.country is null



--派生表 其实就是特殊的子查询
--用在from 之后的子查询
--特殊之处
-- 1.必须起别名,派生表必须起别名, 表达式必须起别名
select *
from (
   select custid,count(*) over(partition by country) as num
   from Sales.Customers
   where country=‘USA‘
)  t
--或者在外面起别名 t 的后面(custid,num)

--表表达式
--公用表表达式CTE 跟派生表很相似

--派生表实现
select  *
from
(
  select companyname,country
  from Sales.Customers
  where country =‘USA‘
) t

--使用CTE
--先定义子查询,命名
with usa_customers
as
(
 select companyname,country
 from Sales.Customers
  where country=‘USA‘
)
select * from usa_customers

with usa_customers
as
(
select companyname as 公司名,country 国家
from Sales.Customers
where country=‘USA‘
)
select * from usa_customers

--在CTE 使用参数
declare @country nvarchar(30);
set @country=‘USA‘;
with usa_customers(公司名,国家)
as
(
select companyname,country
from Sales.Customers
where [email protected]
)
select * from usa_customers;

select year(orderdate),custid,count(*) orderdate
from Sales.Orders
group by year(orderdate),custid
having count(*)>10

select year(orderdate),custid
from Sales.Orders

select orderyear,custid,count(*)
from
(
 select year(orderdate) orderyear,custid
 from Sales.Orders
) as t1
group by orderyear,custid

select orderyear,custid,orderdate
from
(
 select orderyear,custid,count(*) as ordercount
 from
 (
 select year(orderdate) orderyear,custid
 from Sales.Orders
 ) as t1
 group by orderyear,custid
) as t2
where ordercount>10


--使用CTE
with withyearorders (orderyear,custid)
as
(
select year(orderdate),custid
from Sales.Orders
),
yearorders
as
(
 select orderyear,custid,count(*) as ordercount
 from withyearorders
 group by orderyear,custid
),
yearOrder10
as
(
 select orderyear,custid,ordercount
 from yearoders
 where ordercount>10
)
select * from yearOrder10

--派生表查询
select t1.orderyear,t2.orderyear,t1.custcount-t2.custcount
from
)
select year(orderdate) as orderyear,count(distinct custid) countcount
from Sales.Orders
group by year(orderdate)
) as t1
left outher join
)
select year(orderdate) as orderyear,count(distinct custid) countcount
from Sales.Orders
group by year(orderdate)
) as t2
on t1.orderyear=t2.orderyear+1

--多个CTE 复用
with yearcust
as
(
 select year(orderdate) as orderyear,count(distinct custid) countcount
from Sales.Orders
group by year(orderdate)
)
select curr.orderyear,curr.custcount,prev.oderyear,prev.custcount
 curr.custcount-prev.custcount
from  yearcust as curr left outer join yearcust prev
 on curr.orderyear=prev.orderyear+1
 
 
 --自连接,连接两遍的表其实是同一张表,一定要起别名
 select e.empid,e.lastname,e.mgrid,e.empid,m.lastname
 from Hr.Employees e inner join Hr.Employees m
 on e.mgrid=e.empid
 
 
 --查询员工的下属 递归
 with emplist
 as
 (
  -- 起点 ,仅仅执行一次
  select empid,lastname,mgrid
  from Hr.Employees
  where mgrid=2
  union all   --合并
  --可能多次执行,直到查询结果为空
  select e.empid,e.lastname,e.mgrid
  from Hr.Employees e inner join emplist m
  on e.mgrid=m.empid
 )
 select * from emplist
 option (maxrecursion 6);  --限制递归次数
 
 
 --View 视图
 --把查询保存在数据库中,起名字,视图
 create view usacustomers
 as
 select companyname,country
 from Sales.Customers
 where country=‘USA‘
 
 go  --前面是单独的,后面再执行
 
 create view myOrderValues
 as
 select o.oderid,custid,empid,shipperid,orderdate,
    sum(d.qty * d.unitprice) as    val
 from Sales.Orders o inner  join Sales.OrderDatails d
  on o.orderid=d.orderid
  group by o.orderid,custid,empid,shipperid,orderdate
 
--删除视图
drop view dbo.usacustomers

create view CustOrders
as
select o.custid,datediff(month,datediff(month,0,o.orderdate),0) as ordermonth,
sum(od.qty) as qty
from Sales.Orders as o inner join
Sales.OrderDetails as od on od.orderid=o.orderid
group by o.custid,datediff(month,datediff(month,0,o.orderdate),0)


select empid,max(orderdate) as maxorderdate
from Sales.Orders
group by empid

select o.empid,o.orderdate,o.orderid,o.custid
from
(
select empid,max(orderdate) as maxorderdate
from Sales.Orders
group by empid
) t
inner join Sales.Order o
on o.orderdate=t.maxorderdate and o.empid=t.empid


with empmaxorder
as
(
select empid,max(orderdate) as maxorderdate
from Sales.Orders
group by empid
)
select o.empid,o.orderdate,o.orderid,o.custid
from Sales.Orders o inner join empmaxorder em
on o.empid=em.empid and o.oderdate=em.maxorderdate;

select orderid,orderdate,custid,empid
 row_number() over( order by orderdate,orderid) as rownumber
 from Sales.Orders
 
 with numorders
 as
 (
 select orderid,orderdate,custid,empid
 row_number() over(order by orderdate,orderid) as rownum
 from Sales.Orders
 )
 select orderid,orderdate,custid,empid,rownum
 from numorders
 where rownum between 11 and 20
 
 --递归CTE
 with mangers
 as
 (
    --入口点
    select empid,mgrid,firstname,lastname
    from Hr.Employees
    where empid=9
    union all
    --递归查询
    select e.empid,e.mgrid,e.firsname,lastname
    from mangers m inner join Hr.Employees e
    on m.mgrid = e.empid
 )
 select empid,mgrid,firsname,lastname
 from mangers
 
 go
 
 create view Sales.VEmpOrders
 as
 select empidi,year(orderdate) as orderyear,sum(qty) as qty
 from Sales.Orders o inner join Sales.orderdateils od
 on o.orderid=od.orderid
 group by empid,year(orderdate)
 
 
 --连续聚合
 
 select empid,orderyear,qty
 (
 select sum(qty)
 from Sales.VempOrders innerT
 where innerT.empid=outerT.empid
        and innerT.orderyear<=outerT.orderyar
 ) as runqty
 from Sales.VempOrders outerT
 order by empid,orderyear
 
 
 with  vorders
 as
 (
 select empidi,year(orderdate) as orderyear,sum(qty) as qty
 from Sales.Orders o inner join Sales.orderdateils od
 on o.orderid=od.orderid
 group by empid,year(orderdate)
 )
  select empid,orderyear,qty
 (
 select sum(qty)
 from vorders innerT
 where innerT.empid=outerT.empid
        and innerT.orderyear<=outerT.orderyar
 ) as runqty
 from vorders outerT
 order by empid,orderyear
 
 go
 
 --定义一个表函数
 create function production.topProducts
 (
 @supid  int,
 @num int
 )
 returns table
 as
  return
  select top(@num) *
  from Production.Products
  where [email protected]
  order by unitprice desc
 
 --调用 表函数
 select *
  from  production.topProducts(5,2)
 
 
 
 --交叉连接
 select s.supperlierid,companyname,
 productid,productname,unitprice
 from Production.Suppliers s
 cross apply production.topProducts(s.supplierid,2)
 
 
 --透视,逆透视及分组集合   表的转置
 
 --分组查询
 select empid ,custid,sum(qty) sumqty
 from dbo.orders
 group by empid,custid
 
 --对雇员进行分组
select empid,sum(qty)
from dbo.orders
group by empid

--增加顾客的列 1 号顾客  使用相关子查询
select empid,
(
 select sum(qty)
 from dbo.orders innerT
 where custid=1 and innerT empid=outerT empid
) as A,
(
select sum(qty)
 from dbo.orders innerT
 where custid=2 and innerT empid=outerT empid
 ) as B,
 (
  select sum(qty)
  from dbo.orders innerT
  where custid=3 and innerT empid=outerT.empid
  ) as C
  from dbo.orders outerT
  group by empid
 

select empid,
        sum(case when custid=1 then qty end) as A,
        sum(case when custid=2 then qty end) as B,
        sum(case when custid=3 then qty end) as C,
        sum(qty)
from dbo.orders
group by empid



使用 pivot 语法实现透视
select empid,count(*)
        count(case when year(orderdate)=2006 then orderdate end)
        as nums2006,
        count(case when year(orderdate)=2007 then orderdate end)
        as nums2007,
        (
        select count(*)
        from Sales.Orders innerT
        where innerT.empid=outerT.empid and year(orderdate)=2008
        ),
        sum(qty)
from sales.orders outerT
group by empid


select empid,[1],[2],[3]
from (
    --仅仅返回透视中用到的列
    select empid,qty,custid
    from dbo.orders
)  t   --分组是隐含的,对表中除掉聚合和条件的列进行聚合
 pivot(
   sum(qty)            --聚合函数
   from custid in([1],[2],[3]) --准备做列名
 ) as p;
   

select empid,[2006],[2007],[2008]
from
    (
    select empid,year(orderdae) orderyear,orderid
    from Sales.Orders
    ) as t
    piovt
      (
        count(orderid)
        from orderyear in([2006],[2007],[2008])
      ) as p
order by empid;


---计算每个客户每年的支出金额
select custid, year(orderdate) as orderyear,sum(od.qty *od.unitprice) totalprice
from Salas.Orders o inner join Sales.ORderDatails od
group by custid,year(orderdate)
      

select custid,[2006],[2007],[2008]
from (
 select custid, year(orderdate) as orderyear,sum(od.qty *od.unitprice) totalprice
from Salas.Orders o inner join Sales.ORderDatails od
group by custid,year(orderdate)  
) t
pivot(
sum(totalprice)
for orderyear in([2006],[2007],[2008])
) p;


if DB_ID(‘school‘) is not null
 begin
   use master;
  drop database school;
  end

create database school;

use school;

--schema , 默认 dbo
create schema student;
go

if object_id(‘student.Students‘,‘U‘) is not null
    drop table student.Students;
--考虑定义一张表
create table student.Students
(
studid int identity(1,1) not null,-- 非空约束
studentname nvarchar(20) not null,
classid int,
--外键约束
constraint fk_classid foreign key(classId)
references classs(id),
--性别
gender nvarchar(1),
--检查约束
constraint ck_gender  check(gender in(‘男‘,‘女‘)),
 --唯一约束
constraint uq_name unique(studentname),
--主键约束,主键中能存在一组,但是唯一约束可以由多组
constraint pk_id primary key(studid)
);
go
--插入数据  全部字段都赋值
insert into student.Students values(1,‘tom‘);



--通常使用指定字段名的方式
insert into student.Students(studentname,studid)
values(‘alice‘,2)

--另外一种写法
insert student.Students(studid,studentname)
select ‘‘,‘‘ union,
select ‘‘,‘‘ union,
select ‘‘,‘‘ union,
select ‘‘,‘‘ union





select * from student.Students;


--事务和并发

--隐式事务

--显示事务,明确指出事务的起止边界
begin transaction
delete from Sales.Shippers where shipperid=4
delete from Sales.Shippers where shipperid=5
--回滚
rollback
--提交
commit

--事务必须有四个属性
--原子性(Atomicity),一致性(Consistency),隔离性(Isolation)
--持久性(Durabillity) 这四个属性的首字母可以缩写成ACID


--设置隔离级别可以读取未提交的数据
set transaction isolation level read uncommitted


--其实就是加锁,加上共享锁
--普通情况下,查询的时候,系统加上共享锁,查询结束,
--锁撤销
--我们现在,希望在查询结束之后,共享锁依然存在,保证数据不被修改

set transaction isolation level repeatable read;




--可编程对象
--定义变量
declare @i int
set @i=10
print @i;

declare @i varchar(20)
set @i=‘Hello,world‘;
print @i;

declare @i nchar(20) --固定长度
set @i=‘Hello‘;      --已经占用了所有的空间
set @[email protected]+‘,world‘;
print @i;

--还可以使用select 对变量赋值
select @i=99;
print @i;

--当前时间
declare @now datetime
set @now=getdate();
print @now;


--查询顾客的数量,保存到变量中使用
declare @customerCount int;
select @customerCount= count(*)   --赋值语句
from Sales.Customers;
print @customerCount;

--选择结构
--条件
--取得当前时间的分钟部分
declare @mi int;
set @mi=datepart(minute,getdate());
if @mi>10
  begin
    print ‘下课‘
  end
else
  begin
    print ‘继续学习‘
  end
 
break



--游标

select companyname
from sales.customers

--简单变量,标量
declare @name nvarchar(100)
select @name=companyname
from sales.customers;
print @name;

--使用游标   是把数据逐条查询出来
--1. 声明游标,基于查询  
declare c cursor
    for
    select custid, companyname
    from sales.customer
    
declare @name nvarchar(100);
declare @id int;
--2.在使用之前,必须打开游标
open c;
--3. 从游标中读取查询数据,每次可以读取一条记录
fetch next from c into @id,@name
--4. 注意fetch 并不一定获取实际的数据
while @@fetch_status=0   --成功获取了数据
begin
 print @name;
  -- 燃火,试探获取下一条数据
  fetch next from c into @id,@name;
end
--5. 游标使用完毕,一定要关闭
close c;
--6.释放游标
deallocate c;


--局部临时表  名字前面有一个#表示局部临时表
create table #temptable
(
  num  int
)
--使用与表相同
insert into #temptable (num) values(1),(1),(2),(3),(5);

--全局临时表
--使用方式名字前面有两个##
create table ##globaltable
(
 name nvarchar(20)
)
--表变量
declare @table table
(
 num int
)
insert into @table (num) values(1),(1),(2),(3),(5)
select * from @table

--静态SQL

--动态SQL
declare @sql nvarchar(200)
set @sql=‘select companyname from seles.customers‘
print @sql;
--将一个字符串看成一个SQL 语句动态执行
exec(@sql);


--sql 注入攻击

declare @sql nvarchar(200);
set @sql=‘select custid,companyname from seles.customers where
 [email protected]‘;
 
 --用户输入查询的编号
 declare @input int;
 set @input=23;
 --原则,用户的输入是邪恶的
 --set @input=‘abc‘;
 --set @input=‘0 or 1=1‘;
 --set @input=‘0; select * from sales.customers‘;
 print @sql;
 
 --将一个字符串看成一个SQL 语句动态执行
 exec sp_executesql
        @[email protected];   --表示要执行的SQL语句
        @params= N‘@id as int‘;  --声明命令中需要的参数
        @[email protected];  --后面依次提供参数
 go
 

--调整价格写成一段程序,保存到数据库中
--存储过程
create procedure ModifyPrice
(
  @num  money
)
as
update production products
        set [email protected];

--存储过程保存在数据库中
exec dbo.ModifyPrice @num=10;

--参数问题
--1.传入参数
--  传统的参数,默认的参数就是传入参数
--2.传出参数
--  out,ref 参数

--查询顾客的数量
--与方法不同,存储过程没有通常意义上的返回类型和返回值
create procedure GetCustomerCount
(
@count int output  --参数有output 传出参数
)
as
declare @num int;
select @num=count(*) from sales.customers;
print @num;

--使用带有传出参数的存储过程
--必然使用变量来保存传出的结果
declare @mycount int;
--前面是参数定义的传出参数名称
--后面是 我们定义的用来保存传出结果的变量
exec dbo.GetCustomerCount @[email protected] output;
print @mycount


create procedure createuser
(
 @username nvarchar(100)
)
 as
    declare @namelen int;
    set @namelen=len(@username)
    if @namelen>=5
       return 0
    else
       return 1;
       
--调用 获取返回结果是否成功
declare @returnValue int;
exec @returnValue=createuser @username=‘23423432‘
print @returnValue

--创建函数
create function getminute
(
 @datevalue datetime   --传入参数
)
--函数可以直接返回一个值
returns int
as
 --函数体
begin
   declare @mi int
   set @mi=datepart(minute,@datevalue);
   return @mi;
end

--调用
select dbo.getminute(getdate())

--触发器
--创建一个日志表,记录对货运的操作
create table shipper_log
(
 logid int identity(1,1) primary key,
 opdate datetime default getdate(),
 opuse nvarchar(20),
 op nvarchar(20),
 shipname nvarchar(50),
 shipphone nvarchar(20)
 )
 --创建一个审核货运公司的触发器
 create trigger tg_ship
 --触发器没有参数,由于通过数据库系统调用
 on Sales.Shippers after insert,delete,update
 as
   insert into shipper_log(opuse,op,shipname,shipphone)
   select user_name(),‘插入‘,companyname,phone
   from inserted;
 
--标识问题
--获得系统提供的标识值,获取整个系统系统范围内
select @@identity

--应该使用这个,获取当前作用域中最新生成的标识值
select scope_identity();
 
 
select datepart(day,‘20161228‘,‘20140624‘)

--多表查询
with
a as (select ‘60000‘ cw1, 200 cw2, ‘2010-12-31‘ cw3),
b as (select ‘60000‘ CW1, ‘银行‘ CW2),
c as (select ‘银行‘ cw1, 121 cw2, ‘2010-12-31‘ CW3)
select a.cw1 ‘公司‘,a.cw2 ‘财务‘,b.CW2 ‘行业‘,c.cw2 ‘平均值‘
from a
inner join b on a.cw1=b.CW1
inner join c on b.CW2=c.cw1
where a.cw2>c.cw2

--参照更新格式
update a
set a.字段=b.字段
from a join b on a.xx=b.xx
where

--查询表中重复的数据
select 字段,sun(1) as c
from 表
group by 字段
having sum(1)>1

--高效分页
declare @pagesize int,@pageindex int
set @pagesize=20;
set @pageindex=1;
with temp
as
(
select ROW_NUMBER() over(order by id) [row_number],* from dbo.t_user
)
select * from temp where temp.row_number between @pagesize*(@pageindex-1)+1 and @pagesize*@pageindex

以上是关于sql基本语法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 最基本的SQL语法/语句

sql基本语法

SQL语句基本语法

oracle数据库的基本语法与SQL一样吗?

Mysql---基本SQL语法

SQL学习——基本语法