T-SQL:数据查询

取出一张表中所有数据

select * from 表名;
select * from Employee;

这样做会占用不必要的cpu资源和内存资源,而且会占用一定的网络带宽。应该只查询需要的列。少使用*。

查询所需要的列

select 列名 from 表名;
select Number from Employee;
select Name,Age fromEmployee;

计算字段

常量字段

selct 'CowNew集团'9180000000,Name from Employee;

这里的’CowNew集团’和918000000并不是一个实际的存在的列,但是在查询出来的数据中它们看起来是一个实际存在的字段,这样的字段被称为“常量字段” (也称为“常量值” ) ,它们完全可以被看成一个值确定的字段,比如可以为常量字段指定别名。

字段间计算

select Number,Name,Age * Salary from Employee;

字符串的拼接

select '工号为'+Number+'的员工姓名为'+Name from Employee;

别名

列名 as 别名
表 as 别名

select Name as 姓名 from Employee;

top

top 数字 (percent) 列名
select top 2 * from Employee;--返回前两条数据
select top 2 Name from Employee;
select top 50 percent * from Employee;--返回前百分之五十的数据

distinct

用来去除重复数据,是对整个结果集进行数据重复抑制的,而不是针对某一列。

select distinct Department,SubCompany from Employee;

where子句(按条件过滤)

比较运算符(<,>,=,>=,<=,<>)

select Name from Employee
where salary<5000;

逻辑运算符(and,or,not)

select Name from Emploee
where Salary<5000 or Age>25;

in

相当于使用or语句连接多个等于判断
还可以让字段与其他表中的值进行匹配

select Name from Employee where Age in (23,25,28);

select Name from Employee where Age not in (23,25,28);

between…and

用来检测一个值是否处于某个范围中,包括范围的边界

select Name from Employee
where age between 23 and 27;

like(_,%,[],[^])

单字符:_
零个或多个字符:%
[]:指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。
[^]:不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。

select Name from Employee
where Name like '%n_';

select Name from Employee
where Name like '[^SJ]%';

null值判断(is null)

select LastName,FirstName from Persons
where Address is null;

select LastName,FirstName from Persons
where Address is not null;

聚合函数(max,min,avg,sum,count,count(*))

max(列名),min(),avg(),sum(),count()如果null值出现在这些函数中,null值将会被忽略
count(*)统计结果的总条数,不会忽略空值

select max(Salary) as max_Salary from Employee;
select count(distinct Department) from Employee;

grouy by子句(分组查询)

常常和聚合函数一起使用
group by子句必须放到select语句之后,如果有where子句,则必须放到where语句之后。
没有出现在group by子句中的列(聚合函数除外)不能放到select语句后的列表中。

select SubCompany,Age,count(*) as CountOfThisSubCompAge
from Employee
group by SubCompany,Age;

having子句

因为聚合函数不能再where语句中使用,必须使用having子句来代替。
having子句要位于group by子句后边
having子句中不能包含未分组的列名

select Age,count(*) as CountOfThisAge from Employee
group by Age
having count(*)=1;

order by子句(排序)

order by子句位于select语句的末尾,指定按照一列或多列进行排序。
asc:升序,默认为升序,可省略
desc:降序
首先按照第一个排序规则排序,如果按照第一个排序规则无法区分两条记录的顺序,则按照第二个排序规则进行排序。。。

select Name from Employee
order by Age desc,Salary;

执行顺序

from -> where -> group by -> having -> select -> order by
但当有top时,top选取的是经过order by排序好的

union(联合结果集)

合并两个或多个select语句的结果集。
条件:每个结果集必须有相同的列数,相容的数据类型。
union运算符合并了两个查询结果结果集,其中完全重复的数据被合并为了一条。如果要返回所有记录,在后边添加all。

select Name,Age from Employee
union all
select Name,Age from TempEmployee;

联合结果集在制作报表的时候经常被用到,可以将没有直接联系的数据显示到同一张报表中。

select '正式员工最高年龄',max(Age) from Employee
union
select '正式员工最低年龄',min(Age) from Employee
union
select '临时工最高年龄',max(Age) from TempEmployee
union
select '临时工最低年龄',min(Age) from TempEmployee
正式员工最高年龄26
正式员工最低年龄46
临时工最高年龄23
临时工最低年龄29

表连接

跟据两个或多个表中列之间的关系,从这些表中查询数据。
表连接就像连接两张数据表的连线,线的两端是分别在两张表的特定的字段上的。

inner join(内连接)

两表都有匹配记录时返回行。
若有两表有相同字段,为避免歧义,要指定所属的表。
inner可省略

inner join 关联的表名
on 条件

select top 30
    *
from
    Student
    inner join
    Course
    on Student.classId=Course.classId

    inner join
    Score 
    on Student.stuId=Score.stuId;

left outer join(左外部连接)

outer可省略
从左表返回所有的行,即使右表中没有匹配项

right outer join(右外部连接)

从右表返回所有的行,即使右表中没有匹配项

full outer join(全外部连接)

只要其中一个表存在匹配,就会返回行

cross join(交叉连接)

没有on,所有记录都包含在结果集中

SELECT Customer.Id, Customer.Name, Customer.Age,
Order.Id, Order.Number, Order.Price
FROM Customer
     cross join Order

子查询

SQL 语句允许将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询。
若结果集为单行单列(标量子查询),则可放在select或where语句中
若结果集为多行单列,可放在where语句中,配合in使用
若结果集中有多列多列(就相当于一个表,派生表),一般作为数据源进行再一次检索。
若要多次使用可用with子句为子查询定义一个别名,通过别名来引用这个子查询

with

with 别名 as
(
子查询
)
紧跟查询
with person_tom as
(
select * from Person
where Name=’Tom’
)
select * from Person
where Age=person_tom.Age
or Salary=person_tom.Salary;

分页查询

select
    num
    , stuId
    , stuName
    , stuSex
    , stuBirthdate
    , stuStudydate
    , stuAddress
    , stuEmail
    , stuPhone
    , stuIsDel
    , stuInputtime
    , classId
from (
    select 
        row_number() over(order by stuid) as num
        , stuId
        , stuName
        , stuSex
        , stuBirthdate
        , stuStudydate
        , stuAddress
        , stuEmail
        , stuPhone
        , stuIsDel
        , stuInputtime
        , classId
    from 
        TestDataBase..Student
    where 
        stuIsDel = 0) as t
where 
    t.num between (10-1)*9+1 and 9*10;

每页m条,第n页
每一页的第一条就是上一页加一条,m*(n-1)+1

case语句

select 
    Name,
    (case name
    when 'Tom' then 'GoodBoy'
    when 'Lily' then 'GoodGirl'
    when 'Sam' then 'BadGirl'
    else 'Normal'
    end)as isgood
from Person

select 
    Name,
    Weight,
    (case
    when Weight<40 then 'thin'
    when Weight>50 then 'fat'
    else 'ok'
    end)as isnormal
from Person

select 
    stuName,
    (case stuSex 
    when 'm' then '男' 
    else '女'
    end)as stuSex
from Student;

case when 字段 is null then 显示其他 else 字段 end

日期函数

getdate():返回当前日期和时间
current_timestamp:和getdate()相同,是ansi sql
dateadd(标记,增量,时间):给时间加上增量。dateadd(month,11,’2001-2-28’)
datediff(day,’2014-3-2’,’2014-4-3’)//后面的日期减去前边的日期,返回天数
detepart(标记,时间)返回时间的一部分
convert(varchar(50),日期时间值,101)获得日期时间值得日期部分
convert(varchar(50),日期时间值,108)获得时间部分
datename(weekday,Birthday)//计算Birthday是星期几

类型转换函数

cast(expression as date_type)
convert(data_type,expersion)
expersion为待进行类型转换的表达式,type为转换的目标类型

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值