尼采般地抒情

尼采般地抒情

尼采般地抒情

音乐盒

站点信息

文章总数目: 313
已运行时间: 1541

基本词汇

查询就是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 身高>=(
    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 >any(
    select sal 
    from scott.emp 
    where 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。

该类子查询使用较少

评论区