订单表 tblOrder

create table tblOrder(
F_OrderID      int  primary key,
F_CategoryID   int,
F_OrderName    varchar(50)
);
 
订单类别表 tblCategory
create table tblCategory(
F_CategoryID   int  primary key,
F_CategoryName   Varchar(50)
);

有两表结构图

(1) F_OrderID 字段后面的PK是代表什么?Varchar(50)与Char(50)、Nvarchar(50)有什么区别?
    PK 意思是 主键. 也就是 一个 主键,在这个表里面, 最多只能找到 一行数据.
    Varchar(50)  可变长字符串, 长度为 50字节。
    Char(50)  固定长度字符串, 长度为 50字节。 假如内容不足50,会自动补空格
    Nvarchar(50)  可变长字符串, 长度为 50字  == 100字节。

(2) 请编写一条Sql语句,列出所有F_OrderName以abc开头的并且F_CategoryName以xyz结尾的所有订单,并以F_CategoryName升序F_OrderName降序排列。

   select * from tblOrder

       where F_OrderName like 'abc%' and F_OrderName like '%xyz'
        order by F_CategoryName  ASC, F_OrderName DESC ;

在这两个字段上建立索引是不是会加快查询速度?

   对于 普通的索引,在 F_OrderName  上面建索引,可加快。

在 F_CategoryName 上面建, 无效果。 (Oracle 的一种特殊的反向索引,可以加快)

(3) 请编写一条Sql语句,列出tblOrder表第31到第40条记录,F_OrderID为主键,注:F_OrderID可能是不连续的。写出两种以上你认为性能最好的sql语句。
  SELECT TOP 10
  *
FROM
(
SELECT TOP 40 *  FROM tblOrder ORDER BY F_OrderID
) subQuery
ORDER BY
  F_OrderID  DESC

SELECT

  *
FROM
(
SELECT TOP 40 *  ,
  ROW_NUMBER() OVER(ORDER BY F_OrderID )  AS  no
)  FROM tblOrder ORDER BY F_OrderID
) subQuery
WHERE
  no between 31 and 40

(4) sql语句里inner join,left join,right join的区别
A inner join B  意思是, A 与 B 表, 大家都有的数据, 才检索出来。
A left join  B  意思是, A 与 B 表, 大家都有的数据, 以及 A 有 B没有的, 都检索出来。
A right join  B  意思是, A 与 B 表, 大家都有的数据, 以及 A没有 B有的, 都检索出来。

A full  join  B  意思是, A 与 B 表, 大家都有的数据, 以及 A 有 B没有的,A没有 B有的, 都检索出来。