sql基础知识

排序:
order by 多个列名 默认asc即正序
若对多个字段进行倒序排列 必须每个字段对应一个desc关键字
eg:SELECT * FROM mcw_shop_merchandise ORDER BY style desc ,operator desc ;

范围检查between:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

检查是否为null: is null
SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

OR关键字:若第一个关键字满足 则不会判断第二个条件
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’;

AND 比OR的优先级更高: 下面这个条sqlwhere字句意思是:由供应商 BRS01 制造的价格为 10美元以
上的所有产品,以及由供应商 DLL01 制造的所有产品,而不管其价格如何。
换句话说,由于 AND 在求值过程中优先级更高,操作符被错误地组合了。

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’
AND prod_price >= 10;

解决办法就是加上():
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’)
AND prod_price >= 10;

NOT 操作符
WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的
任何条件。因为 NOT 从不单独使用(它总是与其他操作符一起使用),所
以它的语法与其他操作符有所不同。NOT 关键字可以用在要过滤的列前,
而不仅是在其后。
下面的例子说明 NOT 的用法。为了列出除 DLL01 之外的所有供应商制造
的产品,可编写如下的代码。
SELECT prod_name
FROM Products
WHERE NOT vend_id = ‘DLL01’
ORDER BY prod_name;

通配符:通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。

  1. 百分号(%)通配符:最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次
    数。例如,为了找出所有以词 Fish 起头的产品,可发布以下 SELECT 语句:

SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%’;

此例子使用了搜索模式’Fish%’。在执行这条子句时,将检索任意以
Fish 起头的词。%告诉 DBMS 接受 Fish 之后的任意字符,不管它有多
少字符。

通配符可在搜索模式中的任意位置使用,并且可以使用多个通配符。下
面的例子使用两个通配符,它们位于模式的两端:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘%bean bag%’;

  1. 下划线()通配符
    另一个有用的通配符是下划线(
    )。下划线的用途与%一样,但它只匹配
    单个字符,而不是多个字符。与%能匹配 0 个字符不同,_总是刚好匹配一个字符,不能多也不能少。

3.方括号([ ])通配符
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配
符的位置)的一个字符。
例如,找出所有名字以 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;

计算字段:
拼接函数:把多个列数据拼接为一个列数据
SELECT Concat(vend_name, ’ (’, vend_country, ‘)’)
FROM Vendors
ORDER BY vend_name;

sql可对列名进行加减乘除计算:还可加括号
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

字符串转大写:upper

eg:SELECT UPPER(name) as n FROM user where id=1;

其余函数:
LEFT()(或使用子字符串函数) 返回字符串左边的字符
LENGTH()(也使用DATALENGTH()或LEN()) 返回字符串的长度
LOWER()(Access使用LCASE()) 将字符串转换为小写
LTRIM() 去掉字符串左边的空格
RIGHT()(或使用子字符串函数) 返回字符串右边的字符
RTRIM() 去掉字符串右边的空格
SOUNDEX() 返回字符串的SOUNDEX值
UPPER()(Access使用UCASE()) 将字符串转换为大写

SOUNDEX() 详解: 找出语音相近的
Customers 表中有一个顾客
Kids Place,其联系名为 Michelle Green。但如果这是错误的输入,
此联系名实际上应该是 Michael Green,该怎么办呢?显然,按正确的
联系名搜索不会返回数据,如下所示:

SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX(‘Michael Green’);

YEAR()函数:从日期中提取年份
SELECT *
FROM user
WHERE YEAR(crrete_time) = 2020;

AVG():
SELECT AVG(prod_price) AS avg_price
FROM Products;

count():
如果指定列名,则 COUNT()函数会忽略指定列的值为空的行,但如果
COUNT()函数中用的是星号(),则不忽略。
SELECT COUNT(
) AS num_cust
FROM Customers;

MAX()返回指定列中的最大值。MAX()要求指定列名,如下所示:
对非数值数据使用 MAX()
虽然 MAX()一般用来找出最大的数值或日期值,但许多(并非所有)
DBMS 允许将它用来返回任意列中的最大值,包括返回文本列中的最
大值。在用于文本数据时,MAX()返回按该列排序后的最后一行。
SELECT MAX(prod_price) AS max_price
FROM Products;

MIN()函数
MIN()的功能正好与 MAX()功能相反,它返回指定列的最小值。与 MAX()
一样,MIN()要求指定列名,如下所示:
SELECT MIN(prod_price) AS min_price
FROM Products;

SUM()函数
SUM()用来返回指定列值的和(总计)。
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;

SUM()也可以用来合计计算值。在下面的例子中,合计每项物品的
item_pricequantity,得出总的订单金额:
SELECT SUM(item_price
quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;

以上 5 个聚集函数都可以如下使用。
 对所有行执行计算,指定 ALL 参数或不指定参数(因为 ALL 是默认行
为)。
 只包含不同的值,指定 DISTINCT 参数。
eg:
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;

分组:GROUP BY
简单的例子:
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

在使用 GROUP BY 子句前,需要知道一些重要的规定。
 GROUP BY 子句可以包含任意数目的列,因而可以对分组进行嵌套,
更细致地进行数据分组。
 如果在 GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进
行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以
不能从个别的列取回数据)。
 GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但
不能是聚集函数)。如果在 SELECT 中使用表达式,则必须在 GROUP BY
子句中指定相同的表达式。不能使用别名。
 大多数 SQL 实现不允许 GROUP BY 列带有长度可变的数据类型(如文
本或备注型字段)。
 除聚集计算语句外,SELECT 语句中的每一列都必须在 GROUP BY 子句
中给出。
 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。
如果列中有多行 NULL 值,它们将分为一组。
 GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前。

HAVING:
HAVING 非常类似于 WHERE。事实上,目前为止所学过的
所有类型的 WHERE 子句都可以用 HAVING 来替代。唯一的差别是,WHERE
过滤行,而 HAVING 过滤分组。
SELECT cust_id, COUNT() AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(
) >= 2;

这里有另一种理解方法,WHERE 在数据分组前进行过滤,HAVING 在数
据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在
分组中。这可能会改变计算值,从而影响 HAVING 子句中基于这些值
过滤掉的分组。

HAVING 与 WHERE 非常类似,如果不指定 GROUP BY,则大多数 DBMS
会同等对待它们。不过,你自己要能区分这一点。使用 HAVING 时应
该结合 GROUP BY 子句,而 WHERE 子句用于标准的行级过滤。

子查询:
1.子查询在where关键处的使用
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = ‘RGAN01’);

在 SELECT 语句中,子查询总是从内向外处理。在处理上面的 SELECT 语
句时,DBMS 实际上执行了两个操作。
注意:只能是单列
作为子查询的 SELECT 语句只能查询单个列。企图检索多个列将返回
错误。

对组合查询结果排序
SELECT 语句的输出用 ORDER BY 子句排序。在用 UNION 组合查询时,只
能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。对
于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一
图灵社区会员 maik000 专享 尊重版权
128 | 第 14 课 组合查询
部分的情况,因此不允许使用多条 ORDER BY 子句。

插入查询:
INSERT INTO Customers(cust_id, cust_country)
SELECT cust_id, cust_country
FROM CustNew;

提示:插入多行
INSERT 通常只插入一行。要插入多行,必须执行多个 INSERT 语句。
INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT
语句返回多少行,都将被 INSERT 插入。

从一个表复制到另一个表
有一种数据插入不使用 INSERT 语句。要将一个表的内容复制到一个全
新的表(运行中创建的表),可以使用 SELECT INTO 语句。

eg:
CREATE TABLE CustCopy AS
SELECT * FROM roles;

你可能感兴趣的:(sql)