SQL基本教程
SQL SELECT 语句
SELECT 语句用于从数据库中选取数据。
SELECT column_name,column_name
FROM table_name;
SELECT * FROM table_name;
SQL SELECT DISTINCT 语句
SELECT DISTINCT 语句用于返回唯一不同的值(去重查询)
select DISTINCT Receivename FROM SellerCube..ProfitReportBill where SendDate>='2022-10-1 00:00:00' and SendDate<'2022-10-02 00:00:00'
AND warehouseTypeStr='国内仓'
SQL WHERE 子句
WHERE 子句用于过滤记录,提取那些满足指定条件的记录。
SELECT * FROM Websites WHERE country='CN';
下面的运算符可以在 WHERE 子句中使用:
运算符 描述
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
IN 指定针对某个列的多个可能值
SQL AND & OR 运算符
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
SELECT * FROM Websites
WHERE country='CN'
AND alexa > 50;
SELECT * FROM Websites
WHERE country='USA'
OR country='CN';
SQL ORDER BY 关键字
ORDER BY 关键字用于对结果集进行排序。
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。
SELECT column_name
FROM table_name
ORDER BY column_name ASC|DESC;
-- desc 是【 describe v.描述】 和【descend v.下降】 的缩写
-- asc 是【ascend 升序意思】
SQL INSERT INTO 语句
INSERT INTO 语句用于向表中插入新记录。
-- 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
-- 第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
SQL UPDATE 语句
UPDATE 语句用于更新表中已存在的记录。
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
-- 更新XXX表
-- 设置什么列什么值
-- 确定哪一条件(那一列)
SQL DELETE 语句
DELETE 语句用于删除表中的记录。
DELETE FROM table_name
WHERE some_column=some_value;
SQL 高级教程
SQL SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。
select TOP 10 * FROM SellerCube..ProfitReportBill where SendDate>='2022-10-1 00:00:00' and SendDate<'2022-10-02 00:00:00'
AND warehouseTypeStr='国内仓'
-- 得加*号,表示拉取所有字段,不然那就得制定字段
-- 注意:并非所有的数据库系统都支持 SELECT TOP 语句。
-- MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。
SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SELECT * FROM Websites
WHERE name LIKE '%k
SELECT * FROM Websites
WHERE name NOT LIKE '%oo%';
SQL 通配符
SQL 通配符
在 SQL 中,通配符与 SQL LIKE 操作符一起使用。SQL 通配符用于搜索表中的数据。
在 SQL 中,可使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字 |
select * FROM SellerCube..ProfitReportBill where SendDate>='2022-10-1 00:00:00' and SendDate<'2022-10-02 00:00:00'
AND warehouseTypeStr LIKE'国%'
--%在前在后替代的位置不同
下面的 SQL 语句选取 name 以一个任意字符开始,然后是 “oogle” 的所有客户:
SELECT * FROM Websites
WHERE name LIKE '_oogle';
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
下面的 SQL 语句选取 name 以 “G”、”F” 或 “s” 开始的所有网站:
SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';
SQL IN 操作符
IN 操作符允许您在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
SQL BETWEEN 操作符
BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。
SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;
SQL 别名
通过使用 SQL,可以为表名称或列名称指定别名。
基本上,创建别名是为了让列名称的可读性更强。
--- 表别名
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";
--列别名
SELECT name AS n, country AS c
FROM Websites;
SELECT w.platformName, w.country, a.*
FROM SellerCube..ProfitReportBillExtend AS w, SellerCube..ProfitReportBill AS a
WHERE a.billid=w.billid and a.billid='A00031220420004F';
SQL JOIN
在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:
- INNER JOIN:如果表中有至少一个匹配,则返回行()
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行(join前面是哪个方向,就代表以哪边的数据为基准,也就是全获取过来)
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 (join前面是哪个方向,就代表以哪边的数据为基准,也就是全获取过来)
- FULL JOIN:只要其中一个表中存在匹配,则返回行
--"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。
--上面这两个表是通过 "site_id" 列联系起来的。
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
SQL 通用数据类型
数据库表中的每个列都要求有名称和数据类型。Each column in a database table is required to have a name and a data type.
SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。
下面的表格列出了 SQL 中通用的数据类型:
数据类型 | 描述 |
---|---|
CHARACTER(n) | 字符/字符串。固定长度 n。 |
VARCHAR(n) 或 CHARACTER VARYING(n) |
字符/字符串。可变长度。最大长度 n。 |
BINARY(n) | 二进制串。固定长度 n。 |
BOOLEAN | 存储 TRUE 或 FALSE 值 |
VARBINARY(n) 或 BINARY VARYING(n) |
二进制串。可变长度。最大长度 n。 |
INTEGER(p) | 整数值(没有小数点)。精度 p。 |
SMALLINT | 整数值(没有小数点)。精度 5。 |
INTEGER | 整数值(没有小数点)。精度 10。 |
BIGINT | 整数值(没有小数点)。精度 19。 |
DECIMAL(p,s) | 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。 |
NUMERIC(p,s) | 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) |
FLOAT(p) | 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 |
REAL | 近似数值,尾数精度 7。 |
FLOAT | 近似数值,尾数精度 16。 |
DOUBLE PRECISION | 近似数值,尾数精度 16。 |
DATE | 存储年、月、日的值。 |
TIME | 存储小时、分、秒的值。 |
TIMESTAMP | 存储年、月、日、小时、分、秒的值。 |
INTERVAL | 由一些整数字段组成,代表一段时间,取决于区间的类型。 |
ARRAY | 元素的固定长度的有序集合 |
MULTISET | 元素的可变长度的无序集合 |
XML | 存储 XML 数据 |
SQL 函数
- AVG() - 返回平均值
- COUNT() - 返回行数
- FIRST() - 返回第一个记录的值
- LAST() - 返回最后一个记录的值
- MAX() - 返回最大值
- MIN() - 返回最小值
- SUM() - 返回总和
SQL SUM() 函数
SUM() 函数返回数值列的总数。 ```plsql SELECT SUM(column_name) FROM table_name; mysql> SELECT * FROM access_log; +——-+————-+———-+——————+ | aid | site_id | count | date | +——-+————-+———-+——————+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-14 | | 4 | 2 | 10 | 2016-05-14 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-15 | | 7 | 3 | 220 | 2016-05-15 | | 8 | 5 | 545 | 2016-05-16 | | 9 | 3 | 201 | 2016-05-17 | +——-+————-+———-+——————+ 9 rows in set (0.00 sec)
SELECT COUNT(*) FROM access_log; —计数
select
sum(CAST (OrderTotal as Decimal(10,2))) as ‘订单金额’,
sum(storagePrice) as ‘仓储费’,
sum(extendPriceField1) as ‘集成供应链成本’,
sum(operatingCosts) as ‘集团运营成本’ ,
sum(storagePrice)/sum(CAST (OrderTotal as Decimal(10,2))) as ‘仓储费/订单金额’,
sum(operatingCosts)/sum(CAST (OrderTotal as Decimal(10,2))) as ‘集团运营成本/订单金额’,
sum(extendPriceField1)/sum(CAST (OrderTotal as Decimal(10,2))) as ‘集成供应链成本/订单金额’
FROM SellerCube..ProfitReportBill
where SendDate>=’2022-10-1 00:00:00’ and SendDate<’2022-10-2 00:00:00’
AND warehouseTypeStr=’国内仓’
<a name="UgE3e"></a>
#### SQL AVG() 函数
AVG() 函数返回数值列的平均值。
```plsql
SELECT AVG(column_name) FROM table_name
SQL COUNT() 函数
COUNT() 函数返回匹配指定条件的行数。
SELECT count(column_name) FROM table_name
SELECT COUNT(DISTINCT site_id) AS nums FROM access_log;--不同siteid
SQL MAX() 函数
MAX() 函数返回指定列的最大值。
SELECT MAX(column_name) FROM table_name;
SQL MIN() 函数
MAX() 函数返回指定列的最小值。
SELECT MIN(column_name) FROM table_name;
SQL GROUP BY 语句
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
随堂小考
select
sp.processcenter_id as "处理中心ID",
case
sp.enable
when 0 then '不可用'
when 1 then '可用'
end as "是否可用",
sp.name as "中文名称",
sp.en_name as "英文名称",
sp.abbr_name as "中文简称",
pr.cn_name as "大区",
pri1.cn_name as "区域",
pri2.cn_name as "库销比区域",
sp.country_id,
scs.cn_name as "国家",
scs.ct_name,
scs.en_shorting as "国家简码",
CASE
sp.operation_mode
when 0 THEN
'自营'
when 1 THEN
'三方运营'
WHEN 2 THEN
'平台运营'
WHEN 3 THEN
'代销运营'
END as "运营模式",
CASE
sp.wms_type
when 0 then
'EWMS'
WHEN 1 THEN
'三方系统'
when 2 then
'TWMS'
WHEN 3 THEN
'WMS'
end AS "系统类型",
CASE
spe.is_open
when 0 then
'非社会化'
when 1 then
'社会化'
end as "是否社会化",
(select reserve from wsp.sys_dict_details where dict_type ='处理中心平台类型' and dict_key = cast(spe.platform as varchar)) as "处理中心运营方",
CASE
sp.is_china
when 0 then '海外仓'
when 1 then '国内仓'
end as "是否国内仓"
from wsp.sys_processcenter sp
left join wsp.pm_processcenter_management ppm on sp.processcenter_id=ppm.processcenter_id
left join wsp.pm_region pr on ppm.region_id=pr.id
left join wsp.pm_region_item pri1 on ppm.region_item_id=pri1.id
left join wsp.pm_region_item pri2 on ppm.ks_region_item_id=pri2.id
left join wsp.sys_countrys scs on scs.id=sp.country_id
left join wsp.sys_processcenter_expand spe on spe.sys_processcenter_id=sp.id
where ppm.is_deleted=0
Matebase语法
select
sum(CAST (OrderTotal as Decimal(10,2))) as "订单金额",
sum(storagePrice) as "仓储费",
sum(extendPriceField1) as "集成供应链成本",
sum(operatingCosts) as "集团运营成本" ,
sum(storagePrice)/sum(CAST (OrderTotal as Decimal(10,2))) as "仓储费/订单金额",
sum(operatingCosts)/sum(CAST (OrderTotal as Decimal(10,2))) as "集团运营成本/订单金额",
sum(extendPriceField1)/sum(CAST (OrderTotal as Decimal(10,2))) as "集成供应链成本/订单金额"
FROM SellerCube.ProfitReportBill
where SendDate>='2022-10-1' and SendDate<'2022-10-22'
AND warehouseTypeStr='国内仓'