《SQL必知必会》笔记一:1-10课

〇、基础常识

0.1 大小写

SQL不区分大小写,但一般关键字使用大写,分行书写。主要可以增加美观和可读性。

 

一、简单查询语句

1.1 简单查询

SELECT ...,  ..., ...
FROM ...;

1.2 排序

ORDER BY ...
ORDER BY ... DESC, ...

默认是升序排列。如果需要按照某个键值降序排列,则在该键值后加上DESC。

1.3 过滤

WHERE  ... > 2
WHERE  ... BETWEEN 1 AND 2
WHERE  ... != 1

逻辑关系有:>、 >=、<、<=、==、!=。

可以再加上AND和OR来实现多组的过滤。

1.4 IN操作符

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name DESC;

实际上该功能也可以使用OR来完成。、

但是IN操作符的优点是:(1)IN操作符比一般OR操作符的执行速度更快

           (2)IN的最大优点是可以包含其他SELECT语句,能够更动态的建立WHERE子句。

1.5 NOT操作符

NOT否定其后所跟的任何条件。

SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'    /*不等于*/
ORDER BY prod_name;


SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;

上述两个代码的作用是一样的。

 1.6 通配符与LIKE操作符

通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
下面是几种通配符:%、_ 、[ ]、
 
%匹配多个字符,但下划线只匹配单个字符。
/*以Fish开头的词*/
SELECT prod_id, prod_name 
FROM Products 
WHERE prod_name LIKE 'Fish%';

WHERE prod_name LIKE '%bean bag%';
SELECT prod_id, prod_name 
FROM Products 
WHERE prod_name LIKE '__ inch teddy bear';
/*找出所有名字以 J 或 M 起头的联系人*/
SELECT cust_contact
FROM Customers 
WHERE cust_contact LIKE '[JM]%' 
ORDER BY cust_contact;
/*找出所有名字不以 J 或 M 起头的联系人*/
SELECT cust_contact 
FROM Customers 
WHERE cust_contact LIKE '[^JM]%' 
ORDER BY cust_contact;
 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

1.7 计算字段

拼接与别名

SELECT Concat(vend_name, ' (', vend_country, ')') 
FROM Vendors 
ORDER BY vend_name;
//输出如下所示
Bear Emporium (USA ) 
Bears R Us (USA ) 
Doll House Inc. (USA )
//使用别名
SELECT Concat(vend_name, ' (', vend_country, ')') 
       AS vend_title 
FROM Vendors 
ORDER BY vend_name;

算术计算

SELECT prod_id, 
 quantity, 
 item_price, 
 quantity*item_price AS expanded_price 
FROM OrderItems 
WHERE order_num = 20008;

//输出如下所示
prod_id quantity item_price expanded_price 
---------- ----------- ------------ ----------------- 
RGAN01 5 4.9900 24.9500 
BR03 5 11.9900 59.9500 
BNBG01 10 3.4900 34.9000 
BNBG02 10 3.4900 34.9000 
BNBG03 10 3.4900 34.9000

1.8 汇总数据

聚集函数(aggregate function):对某些行运行的函数,计算并返回一个值。
主要有:AVG(),返回某列的平均值;COUNT(),返回某列的行数
         MAX(),返回某列的最大值;MIN(),返回某列的最小值;
              SUM(),返回某列值之和
 
SELECT AVG(prod_price) AS avg_price 
FROM Products
WHERE vend_id = 'DLL01';
//输出
avg_price 
------------- 
6.823333

/*返回 Customers 表中顾客的总数*/
SELECT COUNT(*) AS num_cust 
FROM Customers;
/*只对具有电子邮件地址的客户计数*/
SELECT COUNT(cust_email) AS num_cust 
FROM Customers;

SELECT MAX(prod_price) AS max_price 
FROM Products;

SELECT MIN(prod_price) AS min_price 
FROM Products;

SELECT SUM(item_price*quantity) AS total_price 
FROM OrderItems 
WHERE order_num = 20005;

/*组合聚合函数*/
SELECT AVG(DISTINCT prod_price) AS avg_price 
FROM Products 
WHERE vend_id = 'DLL01';

SELECT COUNT(*) AS num_items, 
 MIN(prod_price) AS price_min, 
 MAX(prod_price) AS price_max, 
 AVG(prod_price) AS price_avg 
FROM Products;

1.9 数据分组

GROUP BY 子句和 HAVING 子句。
GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前。
 
HAVING 非常类似于 WHERE。事实上,目前为止所学过的所有类型的 WHERE 子句都可以用 HAVING 来替代。
唯一的差别是,WHERE过滤行,而 HAVING 过滤分组。
/*按照供应商进行分组*/
SELECT vend_id, COUNT(*) AS num_prods 
FROM Products 
GROUP BY vend_id;
/*HAVING保留两个及以上订单的那些分组*/
SELECT cust_id, COUNT(*) AS orders 
FROM Orders 
GROUP BY cust_id 
HAVING COUNT(*) >= 2;

/*复杂组合*/
/*WHERE 子句过滤所有 prod_price 至少为 4 的行,然后按 vend_id
分组数据,HAVING 子句过滤计数为 2 或 2 以上的分组。*/
SELECT vend_id, COUNT(*) AS num_prods 
FROM Products 
WHERE prod_price >= 4 
GROUP BY vend_id 
HAVING COUNT(*) >= 2;

SELECT order_num, COUNT(*) AS items 
FROM OrderItems 
GROUP BY order_num 
HAVING COUNT(*) >= 3 
ORDER BY items, order_num;

 

 

 

posted @ 2022-03-10 19:56  零纪年  阅读(66)  评论(0编辑  收藏  举报