select语句详解(包括JOIN的用法等)

来源:互联网 发布:跑步圣经网 淘宝 编辑:程序博客网 时间:2024/04/29 21:21

一、SQL语言中的语言可以从功能上分为3类:

  数据定义语言 DDL
  数据处理语言 DML
  数据控制语言 DCL

数据处理语言(Data Manipulation Language,简写DML)

是指用来查询、添加、修改和删除数据库中数据的语句,它们是SELECT、INSERT、UPDATE、DELETE等。


二、SELECT语句  

   SELECT语句用来从数据库中检索满足特定条件的记录。一个SELECT语句主要包含如下几部分:
从哪个或哪些表或视图中提取数据
选取表中的哪些列
选择满足什么条件的数据

查询结果以什么顺序显示


三、用下面三个具体的表来描述SELECT语句

假定本节例子中所使用的数据均从图书管理数据库book_manage中的三个表中选取 




四、 SELECT语句的格式
SELECT  select_list    (1)
  [INTO new_table_name]    (2)
    FROM table_list    (3)
  [WHERE conditions]    (4)
  [GROUP BY group_by_list]    (5)
  [HAVING search_conditions]     (6)
  [ORDER BY order_list   [ASC | DESC] ]    (7)


关于(1):

*:

select_list可以是“*”,表示所有列。

举例: SELECT * FROM tb_pubinfo

显示tb_pubinfo数据表中的全部列。


DISTINCT:

从查询结果中删除两行完全相同的数据

举例:SELECT DISTINCT PublishID  FROM tb_bookinfo     


TOP n:

只显示查询结果的前n行,n是一个正整数。

举例:SELECT TOP 3 bookID,bookname  FROM tb_bookinfo  (注意:指明要显示的字段)


AS:

可以为每个表起一个别名。
  一旦为某个表起了别名后,就只能使用其别名。AS关键字也可以省略。
例:为tb_bookinfo 数据表定义了别名b
SELECT b.bookID, b.bookname FROM tb_bookinfo AS b


AS还可以为查询中出现的字段起一个别名,使得显示结果中标题出现的不是字段名,而是别名。
例:
SELECT bookID AS 书号,bookname AS 书名 FROM  tb_bookinfo
执行以上语句,用“书号”替换了“bookID”,用“书名”替换了“bookname”。


关于(2):

INTO语句可以使得查询结果生成一个新表。

举例:

SELECT bookID AS 编号,bookname AS 书名 INTO tb_new_bookinfo FROM tb_bookinfo

这样,会以编号、书名为列,生成一个新表,表名为tb_new_bookinfo


关于(3):

FROM table_list
这是一个必选项,指明了从哪些表中取数据,并且可用关键字AS为表起别名。


关于(4):

可选项WHERE
WHERE子句用来设置一个筛选条件,使得查询结果中仅包含那些满足条件的数据。

例:
SELECT bookID,bookname,price FROM
      tb_bookinfo WHERE price>20
与其等价的语句为
SELECT bookID,bookname,price FROM tb_bookinfo WHERE NOT price<=20


AND:

SELECT bookID,bookname,price FROM tb_bookinfo WHERE price>20 AND publishID=’P102’
在tb_bookinfo 数据表中找出所有单价大于20并且出版社编号为P102的图书


IN:

在WHERE条件中使用运算符IN
SELECT * FROM tb_bookinfo WHERE authorID IN ('A002','B001')
  执行结果返回tb_bookinfo 数据表中所有作者编号为A002或B001的那些行。


LIKE:

LIKE运算符可以与%通配符一起使用,放在WHERE子句中做查询。
SELECT * FROM tb_bookinfo WHERE bookname LIKE ‘计%’
  执行结果返回tb_bookinfo 数据表中所有书名以“计”开头的书。


关于(5):

可选项GROUP BY
GROUP BY子句用来进行分类汇总。

例:
SELECT publishID,AVG(price) FROM 
            tb_bookinfo GROUP BY publishID
 在tb_bookinfo 数据表中查询各出版社的图书的平均单价。


关于(6):

可选项HAVING
HAVING子句与WHERE子句类似,但HAVING子句可以使用累计函数(如SUM,AVG等函数)。

例:在tb_bookinfo 数据表中查询平均单价大于25元的各出版社。
SELECT publishID AS 出版社编号,
   AVG(price) AS 平均价格
 FROM tb_bookinfo 
 GROUP BY publishID 
 HAVING AVG(price) >25


关于(7):

可选项ORDER BY
用来按升序(ASC)或降序(DESC)来显示结果。

例:
   SELECT * FROM tb_bookinfo ORDER BY price DESC


PS:Select语句基本结构中包含了7个子句,这些子句的排列顺序是固定的,其中除了FROM子句外,其他子句都可省略,但若出现,则必须按照基本结构中的顺序排列


五、SELECT语句中,使用JOIN语句

  在from子句中指定了多个数据源时,通常还需要使用JOIN指定数据源之间的联接条件。


 在JOIN联接时,将第一个表中的每一条记录依次与第二个表中的每一条记录联接成一条新的记录。

  如果A、B表中分别有10条记录,则联接后可得100条记录。


在两个表联接之后,可使用ON指定条件进行筛选。


连接分为内连接和外连接。
  外连接又分为左连接、右连接和全连接。


以下例子中所使用的数据表来自company数据库中的2个表TBL_A和TBL_B。


①内连接:
  结果中只包含两个表中同时满足条件的行。
  SELECT TBL_A.emp_id, 
                   TBL_A. emp_name, 
                   TBL_A. emp_age, 
                   TBL_B.specialty   --注意:这里不要有“,”
         FROM TBL_A INNER JOIN  TBL_B 
         ON TBL_A.emp_id = TBL_B.emp_id
   

②左连接
  结果中包含位于关键字LEFT OUTER JOIN左侧的表中的所有行,以及该关键字右侧的表中满足条件的行。
  SELECT TBL_A.emp_id,
                  TBL_A.emp_name,
                  TBL_A.emp_age, 
                  TBL_B.specialty, 
                  TBL_B.level 
     FROM TBL_A LEFT OUTER JOIN TBL_B 
     ON TBL_A. emp_id = TBL_B. emp_id


③右连接
  结果集中包含位于关键字RIGHT OUTER JOIN右侧的表中的所有行,以及该关键字左侧的表中满足条件的行。
SELECT TBL_A.emp_id,
                TBL_A.emp_name,
                TBL_A.emp_age, 
                TBL_B.specialty, 
                TBL_B.level 
   FROM TBL_A RIGHT OUTER JOIN TBL_B 
    ON TBL_A.emp_id = TBL_B.emp_id


④全连接
  结果中包含两个表中的所有行。
SELECT TBL_A.emp_id,
                TBL_A.emp_name,
                TBL_A.emp_age, 
                TBL_B.specialty, 
                TBL_B.level 
   FROM TBL_A FULL OUTER JOIN TBL_B 
    ON TBL_A.emp_id = TBL_B.emp_id


0 0