SQL Server学习进程(五)--T-SQL查询语句

语句模板查询

/*

select [all | distinct] --all 结果集中可包含重复行,distinct则相反
[top n [percent]]
{* | <字段>} 
[into 表名] 
from table_name | view_name | from 表1 别名1,表2 表名2 [,...n]
[where ]
[group by <字段名>] [having ]
[order by <字段名>] [asc | dec]

 */

select * from 饲养员 --*代表统配查询所有字段


select * from 姓名,年龄,家庭地址 from 饲养员 --查询选定字段

select DISTINCT 性别 from 饲养员 --结果去重


select all 性别 from 饲养员


select top 2 * from 饲养员 --查询前2个记录

select top 50 percent * from 饲养员 --查询前50%的记录

修改列标题

1.使用关键字AS,AS也可省略

select a.ID as '编号',a.性别 as 'SEX' from 饲养员 a

select a.ID '编号',a.性别 'SEX' from 饲养员 a

2.使用等号“=

select '编号'=a.ID ,'SEX=a.性别 ' from 饲养员 a”

查询结果中显示字符串

select '姓名:',班级名,'辅导员编号:',辅导员 from 班级信息 --加入字符串为字段添加注释


select a.名字 ,a.性别,a.年龄,a.年龄+10 现在的年龄 from 饲养员 a --注意此处别名没有加引号'',引号可省略

条件查询

条件可为 >,<,=,>=,<=,<>,IN,BETWEEN AND,LIKE(%,_),[],[^字符集合],IS NULL,EXISTS,

排序

1.根据单列排序

select * from 饲养员 order by 年龄 --默认从上到下升序

2.根据多列排序

select * from 饲养员 order by 年龄,ID --默认从上到下升序


select * from 饲养员 order by ID,年龄 --这两个语句查询结果不同,


3.select * from 饲养员 order by 年龄 desc--默认从上到下降序

分组

SELECT 性别,COUNT(*) AS 人数 order by 性别 

多字段分组

SELECT 性别,年龄,COUNT(*) AS 人数 order by 性别,年龄

使用HAVING对分组结果过滤

SELECT 年龄,COUNT(*) AS 人数 order by 年龄 having count(*)>5 --只查询分组人数大于5的分组

where 与 having 的区别

having用在数据分组后进行过滤1,即用来选择分组;而where在分组前用来选择记录。另外where排除的记录不再包括在分组中。

--使用union合并查询结果集

 /* 

SELECT column,column1,column2.... from table1

 UNION [ ALL ] --不使用all,去重复,有all,只是把选择集合并到一起,不去重

 SELECT column,column1,column2.... from table2 --table1与table2可以相同;合并时两个表对应的列数与数据类型要相同

 */
 select s_id,s_name,f_price from fruits where f_pruits<90
 union all
 select s_id,s_name,f_price from fruits where s_id=101
 -- 常见聚合函数 AVG()/MIN()/MAX()/SUM()/COUNT()

聚合函数常和 group by 联用

count(*)计算总的行数,不管是否为NULL,count(字段名):计算指定列下的总行数,忽略NULL

select avg(年龄) as 平均年龄 from 饲养员 where 性别='男'
select 性别, avg(年龄) as 平均年龄 from 饲养员 group by 性别
子查询

子查询即在查询中加入查询作为过滤条件

----内连接
 --相等连接
 select a.姓名,a.性别,b.分数
from 学生信息 a  (inner) join 成绩信息 b --inner可省略
on a.学号=b.学生编号
--不等连接
select a.s_id,s_name,f_name,f_price 
from fruits a inner join suppliers  b
on fruits.s_id <> suppliers,s_id;
--带选择条件的连接
select fruits.s_id,suppliers.s_city
from fruits inner join suppliers
on fruits.s_id=suppliers.s_id and fruits.s_id=101;

--外连接:
左外连接(left outer join),右外连接(right outer join),全外连接(full outer join)
select a.column_name,a.column_name[,...column_nem],b.column_name[,...n]
from table_name a full outer join[left outer join][right outer join] table_name b
on a.s_id=b.s_id

--四种排序方法 
ROW_NUMBER()/RANK()/DENSE_RANK()/NTILE(n) n为记录分成的组数
SELECT ROW_NUMBER() OVER (ORDER BY s_id asc) as ROWID,s_id,f_name from fruits
--ROWED 数值依次为:1,2,3,4,5,6,7,8,9,1,0,11,12
SELECT RANK() OVER (ORDER BY s_id asc) as RANKID,s_id,f_name from fruits
--ROWED 数值依次为:1,1,1,4,4,4,7,7,9,9,11,12 数字相同是因为s_id相同
SELECT DENSE_RANK() OVER (ORDER BY s_id asc) as DENSEID,s_id,f_name from fruits
--DENSEID数值依次为:1,1,1,2,2,2,3,3,4,4,5,6
SELECT NTILE(5) OVER (ORDER BY s_id asc) as DENSEID,s_id,f_name from fruits
--DENSEID数值依次为:1,1,1,2,2,2,3,3,4,4,5,5

动态查询

DECLARE @id int;

DECLARE @sql varchar(8000);

select @id=101;

select @sql='SELECT name,age, FROM 饲养员 WHERE ID = ';

exec(@sql + @ id);

你可能感兴趣的:(数据库)