基本词汇
查询就是SELECT语句
SELECT [ ALL | DISTINCT ][ TOP expression [ PERCENT ] [ WITH TIES ] ]<列名> /*指定要选择的列及其限定*/[ INTO <表名> ] /*INTO子句,指定结果存入新表*/[ FROM <查询对象> ] /*FROM子句,指定表或视图*/[ WHERE <条件> ] /*WHERE子句,指定查询条件*/[ GROUP BY <分组表达式>] /*GROUP BY子句,指定分组表达式*/[ HAVING <分组统计条件>] /*HAVING子句,指定分组统计条件*/[ ORDER BY <排序表达式> [ ASC | DESC ] ] /*ORDER子句,指定排序表达式和顺序*/
说明:所有被使用的子句必须按语法说明中显示的顺序严格地排序。例如,一个HAVING子句必须位于GROUP BY子句之后,并位于ORDER BY子句之前。 SELECT语句返回一个表的结果集,通常该结果集被称为表值表达式。
distinct
where
条件
select distinct Snamefrom Studentwhere Sdept='CS'
as
SELECT id AS userId,username AS unameFROM users;
查询出来的列名,就变成了别名。AS其实可以省略,但可能会出现问题。
SELECT id username FROM users;
这样会将username视作id的别名。
like
SELECT 书名 AS BookName, 作译者 AS Author, 出版社 AS PressFROM TBookWHERE 书名 LIKE '%SQL Server%'
select Sname, Sno, Ssexfrom Studentwhere Sname not like '刘_'
is not
select Sno, Cnofrom SCwhere Grade is not null
and、or
select Sname, Ssexfrom Studentwhere Sdept='CS' or Sdept='MA' or Sdept='IS'
键可以不用引号,但是值要引号 列名又空格也需要加引号
top
前五行数据
select top 5 *from rating
not in
select Sname, Ssexfrom Studentwhere Sdept not in ('CS', 'MA', 'IS')
多表查询
- 有公共的列,在前面表名以示区分
- 指明两个表的公共相等的列
select TLend.ISBN, TLend.借书时间, TLend.借书证号, TLend.图书ID, TLend.应还时间,TReader.姓名from TReader,TLend, TBookwhere TReader.借书证号 = TLend.借书证号and TBook.ISBN = TLend.ISBNand TLend.借书证号 = '081101'and TBook.书名 = 'SQL Server实用教程(第3版)'
join on
select 姓名from TReader join HLendon TReader.借书证号 = HLend.借书证号where (还书时间 - 借书时间)>5
count
select count(*) 读者总数from TReader
order by
排序ORDER BY
select Sno, Gradefrom SCwhere Cno='3'order by Grade desc
SELECT *FROM usersORDER BY id DESC;
可以排序多个字段,如果第一个字段能排出结果,就不会用到第2个字段。比如:
select *from Studentorder by Sdept asc, Sage desc
limit
限制返回记录的数量LIMIT
LIMIT有两种语法结构,第一种比较常见。
[LIMIT {[offset,] row_count|row_count OFFSET offset}]
起始位置,偏移量
SELECT * FROM users ;SELECT * FROM users LIMIT 3,2;SELECT * FROM users LIMIT 2;
3,2:表示从第3条开始返回,返回两条记录。注意记录从0开始编号,即结果集中的从第0条开始。
如果LIMIT后面只有一个参数,认作是偏移量,起始位置缺省为0。
union
合并查询结果UNION
在多条查询语句之间,使用UNION关键字会合并所有查询结果。
默认会去掉重复行,如果不想去掉重复行,请使用UNION ALL
需要注意的是,要联合的查询结果必须有相同的列数(列名可以不同)
去重效率比不去重效率低
group by
[GROUP BY {col_name|position} [ASC|DESC],...]
select 专业, count(*) 不同专业人数from TReadergroup by 专业
having
与GROUP BY分组联用。只对部分记录做分组操作。有两种用法,比如:
SELECT sex,ageFROM usersGROUP BY sexHAVING age > 35;SELECT sexFROM usersGROUP BY sexHAVING count(id) >=2;
- 第一种,注意后面的HAVING的字段必须在前面SELECT部分出现才行。
- 第二种,在HAVING后面使用聚合函数,前面无需出现相应字段。
asc、desc
排序升序asc、降序descSELECT *FROM TReaderWHERE 专业='计算机'ORDER BY 出生时间 desc
子查询
子查询(Subquery)是指嵌套在查询内部,且必须始终出现在圆括号内。外面的查询并非只是指的查找。可以包含的关键字或条件:
DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等
外层的查询可以是:
SELECT、INSERT、UPDATE、SET、DO
①使用比较运算符的子查询
- 比较运算符
=,>,<,>=,<=,<>,!=,<=>
SELECT *FROM avWHERE 身高>=(SELECT AVG(身高)FROM av);
- 修饰比较运算符
使用ANY、SOME、ALL,ANY和SOME是等价的。
| ANY | ALL | |
|---|---|---|
| >,>= | 最小值 | 最大值 |
| <,<= | 最大值 | 最小值 |
| =,<=> | 任意值 | |
| <>,!= | 任意值 |
select emp.empno,emp.ename,emp.job,emp.salfrom scott.empwhere sal >any(select salfrom scott.empwhere job="MANAGER");
等价于下边两步的执行过程:
(1)执行“select sal from scott.emp where job=”MANAGER””
(2)查询到3个薪水值2975、2850和2450,父查询执行下列语句:
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450;
②使用[not]in的子查询
operand comparison_operator [NOT] IN (subquery)
=ANY和IN等效
!=ALL和NOT IN等效
③使用[not]exists的子查询
如果子查询返回任何行,EXISTS将返回TRUE,否则返回FALSE。
该类子查询使用较少
