公告栏

此网站主题为本人手写主题, 主题待开源···

音乐盒

站点信息

文章总数目: 308
已运行时间: 1187
目录
  1. 基本词汇
    1. distinct
    2. where
    3. as
    4. like
    5. is not
    6. and、or
    7. top
    8. not in
    9. 多表查询
    10. join on
    11. count
    12. order by
    13. limit
    14. union
  2. group by
    1. having
    2. asc、desc
  3. 子查询
    1. ①使用比较运算符的子查询
    2. ②使用[not]in的子查询
    3. ③使用[not]exists的子查询
尼采般地抒情

尼采般地抒情

尼采般地抒情

公告栏

此网站主题为本人手写主题, 主题待开源···

站点信息

文章总数目: 308
已运行时间: 1187

基本词汇

查询就是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 Sname
        from Student
        where Sdept='CS'

as


SELECT id AS userId,username AS uname 
    FROM users;


查询出来的列名,就变成了别名。AS其实可以省略,但可能会出现问题。


SELECT id username  FROM users;


这样会将username视作id的别名。


like

SELECT 书名 AS BookName, 作译者 AS Author, 出版社 AS Press
FROM TBook
WHERE 书名 LIKE '%SQL Server%'
select Sname, Sno, Ssex
    from Student
    where Sname not like '刘_'

is not

select Sno, Cno
    from SC
    where Grade is not null

and、or

select Sname, Ssex
    from Student
    where Sdept='CS' or Sdept='MA' or Sdept='IS'

键可以不用引号,但是值要引号

列名又空格也需要加引号

top

前五行数据

select top 5 *
    from rating

not in

select Sname, Ssex
    from Student
    where Sdept not in ('CS', 'MA', 'IS')

多表查询

  • 有公共的列,在前面表名以示区分
  • 指明两个表的公共相等的列


select TLend.ISBN, TLend.借书时间, TLend.借书证号, TLend.图书ID, TLend.应还时间,TReader.姓名
from TReader,TLend, TBook
where TReader.借书证号 = TLend.借书证号
    and TBook.ISBN = TLend.ISBN
    and TLend.借书证号 = '081101'
    and TBook.书名 = 'SQL Server实用教程(第3版)'


join on

select 姓名
    from TReader join HLend
    on TReader.借书证号 = HLend.借书证号
    where (还书时间 - 借书时间)>5


count

select count(*) 读者总数
    from TReader

order by

排序ORDER BY

select Sno, Grade
    from SC
    where Cno='3'
    order by Grade desc


SELECT * 
        FROM users 
    ORDER BY id DESC;


可以排序多个字段,如果第一个字段能排出结果,就不会用到第2个字段。比如:


select *
    from Student
    order by Sdept asc, Sage desc


因为年龄age有相同的,继续排序就要用到id的降序。

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 TReader
    group by 专业


having


与GROUP BY分组联用。只对部分记录做分组操作。有两种用法,比如:


SELECT sex,age 
    FROM users 
  GROUP BY sex 
  HAVING age > 35;
SELECT sex 
    FROM users 
  GROUP BY sex 
  HAVING count(id) >=2;


  • 第一种,注意后面的HAVING的字段必须在前面SELECT部分出现才行。
  • 第二种,在HAVING后面使用聚合函数,前面无需出现相应字段。

asc、desc

排序升序asc、降序desc

SELECT *  
    FROM TReader
    WHERE 专业='计算机'
    ORDER BY 出生时间 desc

子查询

子查询(Subquery)是指嵌套在查询内部,且必须始终出现在圆括号内。外面的查询并非只是指的查找。可以包含的关键字或条件:


DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等


外层的查询可以是:

SELECT、INSERT、UPDATE、SET、DO


①使用比较运算符的子查询


  • 比较运算符

=,>,<,>=,<=,<>,!=,<=>

SELECT * 
    FROM av 
  WHERE 身高&gt;=(
    SELECT AVG(身高) 
    FROM av);
  • 修饰比较运算符

使用ANY、SOME、ALL,ANY和SOME是等价的。

ANY

ALL

>,>=

最小值

最大值

<,<=

最大值

最小值

=,<=>

任意值

<>,!=

任意值


select emp.empno,emp.ename,emp.job,emp.sal 
    from scott.emp 
  where sal &gt;any(
    select sal 
    from scott.emp 
    where job=&quot;MANAGER&quot;);

等价于下边两步的执行过程:

(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。

该类子查询使用较少

评论区

Twikoo giscus