语法格式:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
例如:
select * from department
create table department (
departid int primary key identity,
name nvarchar(50) null
)
插入department表语句如下:
insert into department
values
('财务部'),
('销售部'),
('生产车间');
top n语句基本语法
语法格式:
select [top n] 字段 from 表名
top n 用于指定查询结果返回的行数。
例如:
查看files表前3行数据的名字
select top 3 name from files
create table files(
userid int primary key identity,
departid int null,
postname nvarchar(50) null,
duty nvarchar(50) null,
name nvarchar(50) null,
sex nvarchar(50) null,
email nvarchar(50) null,
tel nvarchar(50) null,
qq nvarchar(50) null,
phone nvarchar(50) null,
address nvarchar(50) null
)
向files表插入数据的语句如下:
insert into files
values
(2,'干部','高级','李晓玉','女','[email protected]','010-5888888','123333','131212121','北京'),
(5,'工人','中级','张明明','男','[email protected]','010-123123','8975675','137123671','北京'),
(5,'工人','中级','王静','女','[email protected]','010-2131233','123123345','13712123123','北京'),
(1,'干部','中级','张山','男','[email protected]','010-122134','2613786','13718912367','哈尔滨')
查询files记录的姓名、性别和职称列,语句如下:
select name,sex,duty from files
select distinct duty from files
查询files表中职工的姓名、性别和职称,并分别取适当的名字,语句如下:
select name as 姓名,sex as 性别,duty as 职称 from files
注:在select语句中,不区分大小写,但是标点符号必须是英文符号。
wherez子句的一般语法格式为:
select …… from …… where <条件>
where子句中可以使用的条件如下表:
<>:不等于
!=:不等于
!>:不大于
!<:不小于
查询departidf不为5的员工基本信息,语句如下:
select * from files where departid <> 5
select * from files where departid != 5
between……and……表示在……和……之间,包括两个端点的值。
not between表示返回不在某一范围内的数据。
查询departid在1到2员工的基本信息,语句如下:
select * from files where departid between 1 and 2
使用in或not in关键字来限定查询条件,更直观地查询表达式是否在列表值中。
查询departid为1和5的员工的基本信息,语句如下:
select * from files where departid in (5,1)
相当于
select * from files where departid=5 or departid=1
where子句中使用like或not like与通配符搭配使用,可以实现模糊查询。
SQL中常用的通配符有“%”和“_”2个。
%:表示任意个字符。
_:表示任意的一个字符。
查询姓张的员工的基本信息,语句如下:
select * from files where name like '张%'
select * from files where name like '张_'
where子句中可用的逻辑运算符包括and、or、not。
and(逻辑与)连接两个条件,两个条件同时成立才输出结果。
or(逻辑或)连接两个条件,两个条件中任意一个成立,都输出结果。
not(逻辑非)对给定的条件结果取反。
查询files表中中级职称的人员姓名,语句如下:
select * from files where duty='中级'
select name from files where duty='中级' and sex='男'
select * from files where not sex='男'
在where子句中可以使用is null或is not null条件查询某一数据是否为null。
查询files表职称为空的员工的基本信息,语句如下:
select * from files where duty is null
year(),求日期型字段中的年份,结果是一个数值型数据。
getdate(),取系统的日期时间。
select中常用的聚合函数有sum、avg、max、min、count。
查询files表职工的出生年份,语句如下:
select name,year(getdate())-year(birthday) as 年龄 from files
查询files表职工的年龄,语句如下:
select name,year(getdate())-year(birthday) as 年龄 from files
alter table files add birthday datetime
插入有关birthday字段的数据,语句如下:
insert into files
(departid,birthday)
values
(6,'2000-01-21');
count统计行数。
统计files表男性职工人数,语句如下:
select count(*) as 男职工人数 from files where sex='男'
avg求列的平均值。
查询files表员工平均年龄,语句如下:
select avg(year(getdate())-year(birthday)) as 平均年龄 from files
max、min求列的最大值和最小值。
查询files表最大年龄的员工,语句如下:
select max(year(getdate())-year(birthday)) as 最大年龄 from files
查询files表最小年龄的员工,语句如下:
select min(year(getdate())-year(birthday)) as 最小年龄 from files
sum按列求和。
求files表年龄的总和,语句如下:
select sum(year(getdate())-year(birthday)) as 年龄总和 from files
group by将查询的结果进行分组,通常与一些聚合函数配合使用。
语法格式:
group by 字段名;
group by 字段名 having 条件;
where和having的不同之处
where用于select语句中,表示查询要满足的条件。
having 条件只能与group by分组配合使用,表示将分组后满足条件的记录输出。
查询files表各个职称的人数,语句如下:
select duty,count(*) as 人数 from files group by duty
select duty,count(*) as 人数 from files group by duty having count(*)<5
select departid,count(*) as 人数 from files group by departid
oeder by子句将查询的结果进行排序。升序使用关键字asc,降序使用关键字desc。
可以在order by中指定多个字段,检索结果首先按第一个字段进行排序,对于第一个字段的值相同的那些数据,则按第二个字段值排序。
order by子句必须写在where子句之后。
如果省略asc或desc,系统默认升序。
语法格式:
order by 字段名;
order by 字段名1,字段名2;
查询员工的姓名和生日,结果按生日降序排列,语句如下:
select name,duty,birthday from files order by birthday desc
查询员工的姓名、职称及生日,结果先按职称排序,职称相同的则按生日由小到大排序,语句如下:
select name,duty,birthday from files order by duty,birthday
注:
字符串排序按照ASCII码排序。例如:高级,为g;中级为z;g的ASCII码小于Z的ASCII码,又按照默认的升序排序所以,高级在中级的上面。
order by排序之后的表,可以使用into将结果保存到另一张表。
语法格式:
into 表名;
查询员工的姓名、职称及生日,结果先按职称排序,职称相同的则按生日由小到大排序,结果保存到al表,语句如下:
select name,duty,birthday into al from files
order by duty,birthday
嵌套查询是在一个select语句中,可嵌套着另外的子查询,就是嵌套查询。
嵌套查询一般用于查询的内容来自多表时,且多张表有代表意义上相同的字段内容的情况。
新建数据库stupersoninfor,其数据库有3张表:
课程表course(cno,cname)
成绩表grade(sno,cno,sgrade)
学生信息表stuinfor(sno,sname,sex,sage,major,class)
子查询的分类
查询选修c1课程的学生信息,语句如下:
select * from stuinfor where sno in(select sno from grade where cno='c1')
查询选修成绩为90分以上的学生姓名,语句如下:
select sname from stuinfor where sno in(select sno from grade where sgrade>90)
查询有课的学生的姓名、学号、专业和班级,语句如下:
select sname,sno,major,class from stuinfor where exists(select stunifor.sno=grade.sno from grade)
分析:有选课在成绩表一定有记录,哪怕成绩为0,也是有选课的。
查询学生的姓名、选课课程号、成绩。其中学生的姓名由学生信息表派送而来,语句如下:
select grade,cno,
(select sanme from stuinfor where stuinfor.sno=grade.sno)
from grade
查询每个学生的年龄及与平均年龄的差值,语句如下:
select sage,(select avg(sage) from stuinfor) as 平均年龄,
sage-(select avg(sage) from stuinfor) as 差龄
from stuinfor;
创建一个表ss,其中有字段学号和姓名,将stuinfor表中的学号和姓名字段存放到表ss中,语句如下:
create table ss (sno int,sname varvhar(50))
insert into ss
select sno,sname from stuninfor;
内连接通过比较两个表共同拥有的列的值,把两个表连接起来返回满足条件的行。
语法格式:
select 字段 from 表名1 [inner] join 表名2 on 表名1.共同有的字段= 表名2.共同有的字段
如果查询中还有其他条件,则使用where子句。
查询部门为财务部的人员的姓名,语句如下:
select files.name from files join department on files.departid=department.departid
where department.name='财务部'
此外,还可以用子查询的方法,语句如下:
select name from files where departid in
(select departid from department where name='财务部')
一般性连接是用where指明连接条件。
语法格式:
select 字段 from 表名1,表名2 where 表名1.共同有的字段= 表名2.共同有的字段
查询部门为财务部的人员的姓名,语句如下:
select files.name from files,department
where department.departid=files.departid
and department.name='财务部'
内连接VS一般性连接
语法格式不同。具体采用哪种方法,可以随自己喜好选择。
交叉连接通过在FROM子句中使用关键字“CROSS JOIN”来连接两张表,从而实现一张表的每一行与另一张表的每一行的笛卡尔乘积,并返回两张表的每一行相乘的所有可能的搭配结果,交叉连接的结果是两个表的笛卡尔积。
语法格式:
SELECT * FROM tbl1 CROSS JOIN tbl2;
或
SELECT * FROM tbl1, tbl2;
查询表files和department表的信息,语句如下:
select * from files,department
或
select * from department cross join files
交叉连接一般没有意义的。
外连接首先将连接的两张表分为基表和参考表,然后再以基表为依据返回满足和不满足条件的记录。
左外连接:在FROM子句中使用关键字“LEFT OUTER JOIN”来连接两张表,以左表为基表,匹配左表中的每一行和右表中符合条件的行;
语法格式:
select 字段 from tb1 as a left [outer] join tb2 as b on a.共同字段=b.共同字段
files表和department表左外连接查询,语句如下:
select * from department a left join files b
on a.departid=b.departid
左外连接:在FROM子句中使用关键字“RIGHT OUTER JOIN”来连接两张表,以右表为基表,匹配左表中的每一行和右表中符合条件的行;
语法格式:
select 字段 from tb1 as a right [outer] join tb2 as b on a.共同字段=b.共同字段
select * from department a right join files b
on a.departid=b.departid
使用union运算可以将两个或多个select语句的结果组合成一个结果集,即集合连接。
当使用union时,需遵循一下两个规则。
(1)所以查询中的列数和列的顺序必须相同。
(2)所有查询中按顺序对应列的数据类型必须兼容。
select departid from department
union
select departid from files
union集合并了department和files共同字段departid记录。
1 简单查询。* 显示所有字段。
2 条件查询,where子句。where子句可以使用比较运算符、范围运算符、列表运算符、模糊匹配符、逻辑运算符和空值判断符。
2 统计查询,count实现计数;avg实现求平均值;max,min实现求最大值、最小值;sum实现求和。
3 分组查询,group by实现分组,having实现分组之后的筛选。
4 排序查询,order by。默认为升序(asc),降序(desc)。into子句实现排序之后表的导出。
5 子查询,实现查询内容来自多张表。用in将多个查询关联起来。也可以用exists、any、all等谓词来关联。
6 内连接,用join……on指明连接条件。
7 一般性连接,用where子句实现,若查询中还有其他条件,则写在where子句之后,用and连接,推荐使用一般性连接,使用简单、灵活。