时间:2021-07-01 10:21:17 帮助过:4人阅读
【group by】
对结果集进行分组,常与汇总函数一起使用。
SELECT column,SUM(column) FROM table GROUP BY column
HAVING 通常与 GROUP BY 子句同时使用。不使用 GROUP BY 时, HAVING 则与 WHERE 子句功能相似。
Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100
按照 Company 字段进行分组,求出每个 Company 的 Amout 的合计在 10000 以上的数据:
SELECT Company,SUM(Amount) FROM Sales GROUP BY Company HAVING SUM(Amount)>10000
返回结果 :
Company SUM(Amount)
W3Schools 12600
===============================================================
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
===============================================================
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer=‘Bush‘OR Customer=‘Adams‘GROUPBY Customer
HAVINGSUM(OrderPrice)>1500
===============================================================
订单总金额少于 2000 的客户。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUPBY Customer
HAVINGSUM(OrderPrice)<2000
===============================================================
【as子句】 P52 更名运算 select custome_name, borrower, loan_number as loan_id,amount 定义元组变量: from borrower as T, loan as S 自身连接 select disitinct T.branch_name form branch as T, branch as S where T.assets > S.assets and S.branch_city = ‘Brooklyn‘ 【MySQL数据库中,如何查看一个表的表结构,如何查看其主键】 desc 表名; 有一个Key的字段,值为‘PRI‘的就是主键 一、简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。 二、查询表中列的注释信息 select * from information_schema.columns where table_schema = ‘db‘ #表所在数据库 and table_name = ‘tablename‘ ; #你要查的表 三、只查询列名和注释 select column_name, column_comment from information_schema.columns where table_schema =‘db‘ and table_name = ‘tablename‘ ; 四、#查看表的注释 select table_name,table_comment from information_schema.tables where table_schema = ‘db‘ and table_name =‘tablename‘ ps:二~四是在元数据表中查看,我在实际操作中,常常不灵光,不知为什么,有了解的大侠请留印。 五、查看表生成的DDL:show create table table_name;表结构、类型,外键,备注全部显示出来。
【SQL 函数】 - AVG (平均) - COUNT (计数) - MAX (最大值) - MIN (最小值) - SUM (总合) SELECT "函数名"("栏位名") FROM "表格名"; SELECT SUM(Sales) FROM Store_Information; 【count()函数】 http://www.jb51.net/w3school/sql/sql_func_count_ast.htm
本例返回 "Persons" 表中的行数:SELECT COUNT(*) FROM Persons
返回大于 20 岁的人数:SELECT COUNT(*) FROM Persons WHERE Age>20
SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL; SELECT COUNT (DISTINCT Store_Name) FROM Store_Information;SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
【http://www.w3school.com.cn/sql/】【根据已整理的资料,系统地学习】
【http://www.1keydata.com/cn/sql/】
首页
SQL 指令
- SQL SELECT SELECT Store_Name FROM Store_Information; - SQL DISTINCT SELECT DISTINCT Store_Name FROM Store_Information; - SQL WHERE SELECT Store_Name{套式} 经常包括野卡 (wildcard). 以下是几个例子:
在以上的例子中,我们用栏位名来指定排列顺序的依据。除了栏位名外,我们也可以用栏位的顺序 (依据 SQL 句中的顺序)。在 SELECT 后的第一个栏位为 1,第二个栏位为 2,以此类推。在上面这个例子中,我们打以下这一句 SQL 可以达到完全一样的效果:
SELECT Store_Name, Sales, Txn_Date请读者注意: GROUP BY 子句并不是一定需要的。
SELECT Store_Name, SUM(Sales)在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 Region_Name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表格中的 Sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话, 第一行就会变成
SELECT Geography.Region_Name REGION, SUM(Store_Information.Sales) SALES很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了解,尤其是这个 SQL 句含盖好几个不同的表格时。
接下来我们看第三行,就是 WHERE 子句。 这是我们阐述连接条件的地方。在这里,我们要确认Geography 表格中 Store_Name 栏位的值与 Store_Information 表格中 Store_Name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个表格之间的连接是正确的。如果 WHERE 子句是错误的,我们就极可能得到一个笛卡儿连接 (Cartesian Join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。
- SQL 外部连接 之 前我们看到的左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没 有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。我们需要知道每一间店的营业额。如果我们用一个普通的连接,我们将会漏失掉 ‘New York‘ 这个店,因为它并不存在于 Store_Information 这个表格。所以,在这个情况下,我们需要用外部连接来串联这两个表格:
SELECT A1.Store_Name, SUM(A2.Sales) SALES我们在这里是使用了 Oracle 的外部连接语法。
请注意: 当第二个表格没有相对的资料时,SQL 会传回 NULL 值。在这一个例子中,‘New York‘ 并不存在于 Store_Information 表格,所以它的 "SALES" 栏位是 NULL。 - SQL Subquery 我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。 SELECT "栏位1"
我们要运用 subquery 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:
SELECT SUM(Sales) FROM Store_Information结果:
Txn_Date |
Jan-05-1999 |
Jan-07-1999 |
Jan-08-1999 |
Jan-08-1999 |
Jan-07-1999 |
Jan-10-1999 |
Jan-11-1999 |
Jan-12-1999 |
有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:
MySQL/Oracle:
SELECT CONCAT (Region_Name, Store_Name) FROM GeographyOracle:
SELECT Region_Name || ‘ ‘ || Store_Name FROM Geography结果:
‘East Boston‘ - SQL SUBSTRING由 <str> 中,选出所有从第 <pos> 位置开始的字元。请注意,这个语法不适用于 SQL Server 上。
SUBSTR (str, pos, len)由 <str> 中的第 <pos> 位置开始,选出接下去的 <len> 个字元。
SELECT SUBSTR (Store_Name, 3)结果:
‘s Angeles‘例2
SELECT SUBSTR (Store_Name, 2, 4)结果:
‘an D‘ - SQL TRIMSQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的资料库中有不同的名称:
各种 trim 函数的语法如下:
TRIM ( [ [位置] [要移除的字串] FROM ] 字串): [位置] 的可能值为 LEADING (起头), TRAILING (结尾), or BOTH (起头及结尾)。 这个函数将把 [要移除的字串] 从字串的起头、结尾,或是起头及结尾移除。如果我们没有列出 [要移除的字串] 是什么的话,那空白就会被移除。
LTRIM(字串): 将所有字串起头的空白移除。
RTRIM(字串): 将所有字串结尾的空白移除。
例1
SELECT TRIM(‘ Sample ‘);结果:
‘Sample‘例2
SELECT LTRIM(‘ Sample ‘);结果:
‘Sample ‘例3
SELECT RTRIM(‘ Sample ‘);结果:
‘ Sample‘表格处理
- SQL CREATE TABLE CREATE TABLE Customer我们就可以用以下的指令来建一个包括每个地区 (Region) 销售额 (Sales) 的视观表:
CREATE VIEW V_REGION_SALES这就给我们有一个名为 V_REGION_SALES 的视观表。这个视观表包含不同地区的销售哦。如果我们要从这个视观表中获取资料,我们就打入,
SELECT * FROM V_REGION_SALES; - SQL CREATE INDEX若我們要在 Last_Name 這個欄位上建一個索引,我們就打入以下的指令,
CREATE INDEX IDX_CUSTOMER_LAST_NAME若我们要在 Last_Name 这个栏位上建一个索引,我们就打入以下的指令,
CREATE INDEX IDX_CUSTOMER_LOCATION[改变方式] 的详细写法会依我们想要达到的目标而有所不同。再以上列出的改变中,[改变方式] 如下:
MySQL:
CREATE TABLE CustomerOracle:
CREATE TABLE CustomerSQL Server:
CREATE TABLE Customer以下则是以改变现有表格架构来设定主键的方式:
MySQL:
ALTER TABLE Customer ADD PRIMARY KEY (SID);Oracle:
ALTER TABLE Customer ADD PRIMARY KEY (SID);SQL Server:
ALTER TABLE Customer ADD PRIMARY KEY (SID);请注意,在用 ALTER TABLE 语句来添加主键之前,我们需要确认被用来当做主键的栏位是设定为 『NOT NULL』 ;也就是说,那个栏位一定不能没有资料。
- SQL 外来键 外来键是一个(或数个)指向另外一个表格主键的栏位。外来键的目的是确定资料的参考完整性 (referential integrity)。换言之,只有被准许的资料值才会被存入资料库内。 所有的订购资料中的顾客,都一定是要跟在 CUSTOMER 表格中存在。 我们就会在 ORDERS 表格中设定一个外来键,而这个外来键是指向 CUSTOMER 表格中的主键。这样一来,我们就可以确定所有在ORDERS 表格中的顾客都存在 CUSTOMER 表格中。换句话说,ORDERS 表格之中,不能有任何顾客是不存在于 CUSTOMER 表格中的资料。MySQL:
CREATE TABLE ORDERSOracle:
CREATE TABLE ORDERSSQL Server:
CREATE TABLE ORDERS以下的例子则是藉着改变表格架构来指定外来键。这里假设 ORDERS 表格已经被建置,而外来键尚未被指定:
MySQL:
ALTER TABLE ORDERSOracle:
ALTER TABLE ORDERSSQL Server:
ALTER TABLE ORDERS在这个例子中,只有一笔资料符合 WHERE 子句中的条件。如果有多笔资料符合条件的话,每一笔符合条件的资料都会被修改的。
我们也可以同时修改好几个栏位。这语法如下:
UPDATE "表格"SQL 语法
SQL 指令的语法。简洁的 SQL 语法做为读者参考之用。
Select
SELECT "栏位" FROM "表格名";
Distinct
SELECT DISTINCT "栏位"
FROM "表格名";
Where
SELECT "栏位"
FROM "表格名"
WHERE "条件";
And/Or
SELECT "栏位"
FROM "表格名"
WHERE "简单条件"
{[AND|OR] "简单条件"}+;
In
SELECT "栏位"
FROM "表格名"
WHERE "栏位" IN (‘值1‘, ‘值2‘, ...);
Between
SELECT "栏位"
FROM "表格名"
WHERE "栏位" BETWEEN ‘值1‘ AND ‘值2‘;
Like
SELECT "栏位"
FROM "表格名"
WHERE "栏位" LIKE {模式};
Order By
SELECT "栏位"
FROM "表格名"
[WHERE "条件"]
ORDER BY "栏位" [ASC, DESC];
Count
SELECT COUNT("栏位")
FROM "表格名";
Group By
SELECT "栏位1", SUM("栏位2")
FROM "表格名"
GROUP BY "栏位1";
Having
SELECT "栏位1", SUM("栏位2")
FROM "表格名"
GROUP BY "栏位1"
HAVING (栏位);
Create Table
CREATE TABLE "表格名"
("栏位 1" "栏位 1 资料种类",
"栏位 2" "栏位 2 资料种类",
... );
Drop Table
DROP TABLE "表格名";
Truncate Table
TRUNCATE TABLE "表格名";
Insert Into
INSERT INTO "表格名" ("栏位1", "栏位2", ...)
VALUES ("值1", "值2", ...);
Update
UPDATE "表格名"
SET "栏位1" = [新值]
WHERE "条件";
Delete From
DELETE FROM "表格名"
WHERE "条件";
SQL语句 & 查询表结构
标签: