Select的基本语法 and join detail---join 使用详解方式 选择自 softj 的 Blog

本文详细介绍了SQL查询的基础语法及高级应用,包括条件筛选、数据排序、数据分组、使用函数、联接操作等内容,并提供了丰富的示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.Select的基本语法
 Select col1,col2.....coln
 [into     newTable]    '将查到的数据插入到新表中
 [From     tab1,tab2....tab3]     '目标表
 [where     @condition]            '查询条件
 [Group     by    col1,col2....coln]    '按指定列分组
 [Having    @condition]                   '在使用函数(Avg,Count)时使用having
 [Order     by     col1,col2.....coln]   '按指定的列排序
* 列(col)可以是表中的所有列,也可以是派生的列(有数个表列运算后产生的列)
* 新的表  在select 命令中被选择的数据库的表。
* 条件 数据选择时的筛选条件,你可以设定大于,小于或等于基本判断条件。
*Order by Group by 当选定要选择的列和条件后,可以对选取的数据进行排序和分组
*Having 通常和Group by 搭配使用,用来当做条件选择,就象Where条件一样。

2 基本查询
 2-1 选取全部的数据   Select * from table
 2-2 选取指定列           Select col from table
 2-3 选取不重复的 Select distinct col from table 
 2-4 指定某一列的显示格式 Select emp_Name ,Convert(char(8),birthDay,11)---将birthDay字段显示为char形式
 2-5 数据排序 Select emp_Name from employee  Order by emp_Name DESC | ASC -----Desc为降序,Asc为升序,默 认为升序
 2-6 使用函数    Select Count(*)  from sales where tot_amt >5000  ---定单金额大于5000的行数
 2-7选取前几行数据   Select Top 10 OrderId from Oders
 2-8 数据分组
        可以利用Group by 子句对Select 命令所选取得到的数据做分组,分组后的数据可显示出来,或是利用
         Sum(),Avg()等函数针对特定的列计算每组数据总和或平均值。
        Select       col1 ,col2
        form         tab
        group by  col1
    在group by 子句中的字段必须是在Select 中出现的,例如
  Select         pro_id, Sum(qty*unit_price) as tot_amt
  form           sailes                 ----显示产品销售明细表中的每个产品的订贷金额总和,
  group   by   pro_id              -----并按从大到小排序
  order    by   tot_amt DESC
 

Select   pro_id ,Count(*) From stock
group   by prod_id                                    ----Group by 子句经常和Having搭配,用来找出
Having  Count(*)>1                                  -----每一个组中满足指定条件的数据。该命令显示同一型号产品有两家
order by Prod_id                                      ------以上的供应商


3 加上选择条件 当你只想选取表的部分数据时可以加上选择条件,也就是加上WHERE子句
  逻辑运算符 等于 =  ,不等于 <> 或 != ,大于 > ,小于<,大于等于 >=,小于等于 <= ,介于 Between ,
                        不介于 Not Between , In (Not In) 列值是否存在于所列的清单内,Is null 列值是否为Null
4  使用统配符
     %  零个或多个字符
     _    单一任何字符
    /      特殊字符
    []     在某一范围内的字符,如[0-9] 或[acfk]
    [^]  不在某一范围内的字符,如[^0-9] 或[^acfk]
 注意:当使用统配符来比较数据时,由于在这种情况下SQL SERVER 无法使用主键值和索引加快数据的查询
              而是一个一个的查询。

5  表的Join
   在多个表之间查询时就要对多个表进行Jion查询
   如: select * from stock
             join product 
             on  stock.prod_id =product.prod_id
 

  join 两个以上的表,在stock ,product我们显示了产品的中文名称,也希望把供应商的名字显示出来。
   那就必须将供应商表(supplier)也拉过来一起做join
  select   product.prod_name,supplier.sup_name,stock.stk_qty
  From   stock
  Join      product     on  stock.prod_id = product.prod_id
  Join      supplier     on  stock.sup_id   = supplier.sup_id
 
Self Join
   在表的Join 中,在同一个表中也可以做join,这种和自己Join的情形我们称之为self-join.
   由于self-join涉及的是两个相同的表,因此可以利用别名把同一个表当做不同的表做Join
  以下命令找出同一天进入公司的员工

   Select       A.emp_no ,A.emp_name,B.emp_no,B.emp_name,A.date_hired
   From         employee A
   Join           employee B
   On            (A.emp_no!=B.emp_no  and A.emp_name>B.emp_name and  A.date_hired >B.date_hired)
   Order  by  A.date_hired

Out Join
 Join 的结果是由两个或两个以上的表组合挑出合乎Join条件的数据。但是来自不同表的数据无法满足Join
 条件则丢弃,通常我们将这种叫inner join.
 另外一种叫out join ,这种方式的表有主从之分。他的处理方式是用主表的每行数据去match从属表的列,
 合乎条件和不合乎条件的都是我们得到的数据,只是不合乎条件的数据会被以null填上.



 join 方式
(1) cross join
      参与select语句所有表的的所有行的笛卡尔乘积
      select au_lname ,title
      from authors cross join  titiles

     outer  join 对参与join的两个表有主从之分,处理方式以主表的每条数据去match 从属表的列,合乎条件的数据是我们所要的答案,不合乎条件的也是我们要的答案,只不过哪些从属表选取的列将被添上null。
(2) left join
     左边的为主表,右边为从属表
     select a.cust_id ,b.order_date,b.tot_ant
     from customer a left join sales b
     on (a.cust_id =b.cust_id and b.order_date>''1996/10/15'')
     可以写为
     select a.cust_id,b.order_date,b.tot_ant
     from custom a
     left join (select * from sales where order_date>''1996/10/15'') b
    on a.cust_id =b.cust_id  
(3) right join
     左边的表为从属表,右边的表为主表
(4) self join
     self join 常用在同一表内不同数据间对同一列的比较
    select a.emp_no,a.emp_name,b.emp_no,b.emp_name,a.date_hired
    from employee a
    join employee b
    on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
    order by a.date_hired
   这样会重复数据,只要加上一句 and a.emp_name>b.emp_name
(5) full join
     不仅列出符合条件的数据,两边未符合join条件的数据也会一并列出。哪些未符合join条件的数据如果在select列中无法得到对应的值则填上null
    select a.cust_id,b.tot_amt
    from customer a full join sales b
    on a.cust_id=b.cust_id
有表
 id   ic  name  amount
      I    *        *
      c
      i
      c
      i
      i  
   要求结果为 
    ic  name  amount  ic   name  amount
    i                         c
    i                         c
    i
    i
  select aaa.*,bbb.*
  from ( select (select count(id) from  aa as  b where (b.id<a.id) and (ic=''i'')) as     newid, * from aa a where ic=''i'') aaa
  full join
   (select (select count(id) from aa as b where b.id<a.id and ic=''c'') as newid,* from
 aa a where ic=''c'') bbb
on aaa.newid=bbb.newid
order by aaa.name
6.使用 HASH 和 MERGE 联接提示
此示例在 authors、titleauthors 和 titles 表之间建立三表联接,以生成一个作者及其著作的列表。查询优化器使用 MERGE 联接将 authors 和 titleauthors (A x TA) 联接在一起。然后,将 authors 和 titleauthors MERGE 联接 (A x TA) 的结果与 titles 表进行 HASH 联结以生成 (A x TA) x T。


重要  指定联接提示后,要执行 INNER JOIN 时 INNER 关键字不再为可选,而必须显式说明。


USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + '' '' + LTRIM(a.au_lname)), 1, 25)
   AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER HASH JOIN titles t
   ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC

下面是结果集:

Warning: The join order has been enforced because a local join hint is used.
Name                      Title               
------------------------- --------------------
Abraham Bennet            The Busy Executive''s
Reginald Blotchet-Halls   Fifty Years in Bucki
Cheryl Carson             But Is It User Frien
Michel DeFrance           The Gourmet Microwav
Innes del Castillo        Silicon Valley Gastr
...                    ...
Johnson White             Prolonged Data Depri
Akiko Yokomoto            Sushi, Anyone?      

(25 row(s) affected)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值