SQL语句 & 查询表结构
【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
===============================================================
本例返回 "Persons" 表中的行数:SELECT COUNT(*) FROM Persons
返回大于 20 岁的人数:SELECT COUNT(*) FROM Persons WHERE Age>20
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
【http://www.w3school.com.cn/sql/】【根据已整理的资料,系统地学习】
首页
SQL 指令
FROM Store_Information
WHERE Sales > 1000;
FROM Store_Information
WHERE Sales > 1000
OR (Sales < 500 AND Sales > 275);
FROM Store_Information
WHERE Store_Name IN ('Los Angeles', 'San Diego');
FROM Store_Information
WHERE Txn_Date BETWEEN 'Jan-06-1999' AND 'Jan-10-1999';
FROM "表格名"
WHERE "栏位名" LIKE {套式};
{套式} 经常包括野卡 (wildcard). 以下是几个例子:
- 'A_Z': 所有以 'A' 起头,另一个任何值的字原,且以 'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。
- 'ABC%': 所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。
- '%XYZ': 所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。
- '%AN%': 所有含有 'AN' 这个套式的字串。举例来说, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。
SELECT *
FROM Store_Information
WHERE Store_Name LIKE '%AN%';
FROM "表格名"
[WHERE "条件"]
ORDER BY "栏位名" [ASC, DESC];
FROM Store_Information
ORDER BY Sales DESC;
在以上的例子中,我们用栏位名来指定排列顺序的依据。除了栏位名外,我们也可以用栏位的顺序 (依据 SQL 句中的顺序)。在 SELECT 后的第一个栏位为 1,第二个栏位为 2,以此类推。在上面这个例子中,我们打以下这一句 SQL 可以达到完全一样的效果:
FROM Store_Information
ORDER BY 2 DESC;
- AVG (平均)
- COUNT (计数)
- MAX (最大值)
- MIN (最小值)
- SUM (总合)
FROM "表格名";
FROM Store_Information
WHERE Store_Name IS NOT NULL;
FROM Store_Information;
FROM "表格名"
GROUP BY "栏位1";
FROM Store_Information
GROUP BY Store_Name;
FROM "表格名"
GROUP BY "栏位1"
HAVING (函数条件);
请读者注意: GROUP BY 子句并不是一定需要的。
SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name
HAVING SUM(sales) > 1500;
FROM "表格名" "表格别名";
FROM Store_Information A1
GROUP BY A1.Store_Name;
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;
在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 Region_Name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表格中的 Sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话, 第一行就会变成
很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了解,尤其是这个 SQL 句含盖好几个不同的表格时。
接下来我们看第三行,就是 WHERE 子句。 这是我们阐述连接条件的地方。在这里,我们要确认Geography 表格中 Store_Name 栏位的值与 Store_Information 表格中 Store_Name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个表格之间的连接是正确的。如果 WHERE 子句是错误的,我们就极可能得到一个笛卡儿连接 (Cartesian Join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。
我们需要知道每一间店的营业额。如果我们用一个普通的连接,我们将会漏失掉 'New York' 这个店,因为它并不存在于 Store_Information 这个表格。所以,在这个情况下,我们需要用外部连接来串联这两个表格:
FROM Georgraphy A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name (+)
GROUP BY A1.Store_Name;
我们在这里是使用了 Oracle 的外部连接语法。
请注意: 当第二个表格没有相对的资料时,SQL 会传回 NULL 值。在这一个例子中,'New York' 并不存在于 Store_Information 表格,所以它的 "SALES" 栏位是 NULL。
FROM "表格"
WHERE "栏位2" [比较运算素]
(SELECT "栏位1"
FROM "表格"
WHERE "条件");
我们要运用 subquery 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:
WHERE Store_name IN
(SELECT store_name FROM Geography
WHERE region_name = 'West');
在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额。我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少。
UNION
[SQL 语句 2];
UNION
SELECT Txn_Date FROM Internet_Sales;
结果:
| 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 |
INTERSECT
SELECT Txn_Date FROM Internet_Sales;
MINUS
SELECT Txn_Date FROM Internet_Sales;
有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:
- MySQL: CONCAT( )
- Oracle: CONCAT( ), ||
- SQL Server: +
MySQL/Oracle:
WHERE Store_Name = 'Boston';
Oracle:
WHERE Store_Name = 'Boston';
结果:
- MySQL: SUBSTR( ), SUBSTRING( )
- Oracle: SUBSTR( )
- SQL Server: SUBSTRING( )
由 <str> 中,选出所有从第 <pos> 位置开始的字元。请注意,这个语法不适用于 SQL Server 上。
由 <str> 中的第 <pos> 位置开始,选出接下去的 <len> 个字元。
FROM Geography
WHERE Store_Name = 'Los Angeles';
结果:
例2
FROM Geography
WHERE Store_Name = 'San Diego';
结果:
SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的资料库中有不同的名称:
- MySQL: TRIM( ), RTRIM( ), LTRIM( )
- Oracle: RTRIM( ), LTRIM( )
- SQL Server: RTRIM( ), LTRIM( )
各种 trim 函数的语法如下:
TRIM ( [ [位置] [要移除的字串] FROM ] 字串): [位置] 的可能值为 LEADING (起头), TRAILING (结尾), or BOTH (起头及结尾)。 这个函数将把 [要移除的字串] 从字串的起头、结尾,或是起头及结尾移除。如果我们没有列出 [要移除的字串] 是什么的话,那空白就会被移除。
LTRIM(字串): 将所有字串起头的空白移除。
RTRIM(字串): 将所有字串结尾的空白移除。
例1
结果:
例2
结果:
例3
结果:
表格处理
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);
AS SELECT First_Name, Last_Name, Country
FROM Customer;
我们就可以用以下的指令来建一个包括每个地区 (Region) 销售额 (Sales) 的视观表:
AS SELECT A1.Region_Name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;
这就给我们有一个名为 V_REGION_SALES 的视观表。这个视观表包含不同地区的销售哦。如果我们要从这个视观表中获取资料,我们就打入,
若我們要在 Last_Name 這個欄位上建一個索引,我們就打入以下的指令,
ON Customer (Last_Name);
若我们要在 Last_Name 这个栏位上建一个索引,我们就打入以下的指令,
ON Customer (City, Country);
[改变方式];
[改变方式] 的详细写法会依我们想要达到的目标而有所不同。再以上列出的改变中,[改变方式] 如下:
- 加一个栏位: ADD "栏位 1" "栏位 1 资料种类"
- 删去一个栏位: DROP "栏位 1"
- 改变栏位名称: CHANGE "原本栏位名" "新栏位名" "新栏位名资料种类"
- 改变栏位的资料种类: MODIFY "栏位 1" "新资料种类"
MySQL:
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));
Oracle:
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
SQL Server:
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
以下则是以改变现有表格架构来设定主键的方式:
MySQL:
Oracle:
SQL Server:
请注意,在用 ALTER TABLE 语句来添加主键之前,我们需要确认被用来当做主键的栏位是设定为 『NOT NULL』 ;也就是说,那个栏位一定不能没有资料。
MySQL:
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
PRIMARY KEY (Order_ID),
FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID));
Oracle:
(Order_ID integer PRIMARY KEY,
Order_Date date,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);
SQL Server:
(Order_ID integer PRIMARY KEY,
Order_Date datetime,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);
以下的例子则是藉着改变表格架构来指定外来键。这里假设 ORDERS 表格已经被建置,而外来键尚未被指定:
MySQL:
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);
Oracle:
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);
SQL Server:
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);
VALUES ("值1", "值2", ...);
SELECT "栏位3", "栏位4", ...
FROM "表格2";
SELECT store_name, Sales, Txn_Date
FROM Sales_Information
WHERE Year (Txn_Date) = 1998;
SET Sales = 500
WHERE Store_Name = 'Los Angeles'
AND Txn_Date = 'Jan-08-1999';
在这个例子中,只有一笔资料符合 WHERE 子句中的条件。如果有多笔资料符合条件的话,每一笔符合条件的资料都会被修改的。
我们也可以同时修改好几个栏位。这语法如下:
SET "栏位1" = [值1], "栏位2" = [值2]
WHERE "条件";
WHERE Store_Name = 'Los Angeles';
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语句 & 查询表结构的更多相关文章
- SQL语句查询表结构
SQL语句查询表结构 刚刚在做一个小项目,数据库中一张表有20来个字段,用我以前做的一个.NET实体类生成器一个一个的输入还是闲麻烦,于是打算找个时间来重新的改造一个那个.NET实体类,能够通过选 ...
- postgresql用sql语句查询表结构
用到的postgresql系统表 关于postgresql系统表,可以参考PostgreSQL 8.1 中文文档-系统表. pg_class 记录了数据库中的表,索引,序列,视图("关系&q ...
- Sql 2000系统表 语句查询表结构
SQL2000系统表的应用 –1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype=’u’ and status>=0 –2:获取 ...
- sql server 查询表结构
--查询表结构start SELECT 序号 = a.colorder,字段名称 = a.name,字段描述 = f.value, 标识 then '√' else '' end, 主键 FROM s ...
- sql语句查询表中重复字段以及显示字段重复条数
今天跟大家分享两条SQL语句,是关于查询某表中重复字段以及显示该字段的重复条数. 1.select * from 表名 where 列名 in (select 列名 from 表名 group by ...
- 使用SQL语句查询表及表字段类型说明
今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来. 经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用. S ...
- SQL Server查询表结构语句
--1:获取当前数据库中的所有用户表 www.2cto.com select Name from sysobjects where xtype='u' and status>=0 -- ...
- SQL语句查询表中的所有约束
select * from sysobjects where parent_obj in(select id from sysobjects where name='表名') 或者 exec sp_h ...
- MYSQL的修改表结构SQL语句
更多java学习资料>>> 1.背景 使用sql语句对表结构进行修改 2.案例演示 案例:表结构 CREATE TABLE `login_user` ( `id` ) NOT NUL ...
随机推荐
- Linux用户(组)管理
在linux中系统中,它并不认识帐号名称.它认识的是我们的帐号ID,帐号ID保存在/etc/passwd文件中.我们在登录linux主机时,在输入完帐号和密码时,linux会先查找/etc/passw ...
- 别说你会用 Google 搜索
Google 在我们的日常生活中越来越重要,很多时候,包括我在内的很多人一天也离不开 Google,但是,你真的会用 Google 吗? PHP MySQL "Web developmen ...
- NPOI 2.0导出word(docx格式)
大名鼎鼎的NPOI用来导出EXCEL的文章园子里面有很多,可是用来导出WORD文档的文章大都含糊不清,最近刚好完成一个导出WORD文档的需求,在此分享下. NPOI里面认为word文档的最基本的结构是 ...
- IOS OC声明变量在@interface括号中与使用@property的区别(转载)
刚开始接触OC再看别人写的代码的时候,常常困惑于人家在声明属性时的写法,总结出来有三中方式,不知道哪一种比较规范化,现在我把三种方式贴出来,然后再一一探讨每个方式声明属性的区别. 方式一:直接在@in ...
- 别人的的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- android定时三种方式
一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方 ...
- POJ 1844 Sum
题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k. 解法:一开始觉得dp……后来觉得复杂度太大了……GG……百度了一下是个数学题orz. 如果n全部由加法组成,那么k可以组成k(k+ ...
- 【,net】发布网站问题
今天解决了一个发布后网站访问不了的问题: 问题: 发布网站:http://172.168.1.102:2222/nologin.html,但是页面一直处于刷新状态,进行不了系统: 解决方法: 问开发他 ...
- eclipse 报错汇总
1.Eclipse 启动时,报错: Fail to create the java virtual machine 已解决.方法:eclipse.ini 中-vmargs-Dosgi.requir ...
- 顺序表的基本操作(C)
在顺序存储结构实现基本操作:初始化.创建.插入.删除.查找.遍历.逆置.合并运算. 运行示例: 请输入线性表La的长度: 请输入线性表La中的元素(共5个) *** 此时线性表La中的元素 *** * ...