SQL语句:
一、DML—数据操纵语言SQL命令,分为:select查询、insert into插入、delete from删除、update set修改.
l
Select 查询命令
最复杂、存在非常多的使用方法
1、查询表中所有的数据
Select * from table_name;
2、普通条件(where、and、or)查询
Select
*或者字段1,字段2,…
fromtable_name where 字段1=值1或字段2=值2…;
如查询一个范围的薪资
SELECT
store_name FROM Store_Information WHERE salary > 1000
OR (salary < 500 AND salary > 275);
3、模糊条件(like)查询
Select
*或者字段1,字段2,…
from table_name where字段1 like
%A%;包含A的字符
Select
*或者字段1,字段2,…
from table_name where字段1 like
A%;以A起头的字符
Select
*或者字段1,字段2,…
from table_name where字段1 like
%A;以A结尾的字符
Select *或者字段1,字段2,…
from table_name where字段1 like
'_汉字_';一个下划线,表示一个字符,共计四个字符
Select
*或者字段1,字段2,…
from table_name where字段1 like
'%汉字%';
%表示无限个字符
4、空值条件(null)查询
Select
*或者字段1,字段2,…
from table_name where 字段1 is
not null;
5、范围查询一
(in)
Select
*或者字段1,字段2,…
from table_name where 字段1 in
(1,2,3,…)或者('质量','数量',…)…;-- 字段值可为数值、或字符类型
6、范围查询二
(between
…and…)
Select *或者字段1,字段2,…
from table_name where 字段1
between 10 and 100;
Select
*或者字段1,字段2,…
from table_name where 字段1
between '1990-01-01' and
'2012-12-31';
7、排序查询(order by…asc/desc 一般都是组合使用)
SELECT
* FROM table_name order by 字段1
asc;
SELECT
* FROM table_name order by 字段2
desc;
SELECT
* FROM table_name order by 字段1, 字段2,…
desc或asc;
SELECT
* FROM table_name where 字段1=数值1 order
by 字段1
desc, 字段2
asc,…;
8、Count 统计记录数查询
SELECT Count(字段1,或字段2,…)[别名a…]
FROM table_name; 【一般不与其它字段一起组合,否则会报错,可在后面加别名】
【加条件“is not
null”,可过滤掉为空值数据】
SELECT (字段1,或字段2,…)[别名a…]
FROM table_name where(字段1,或字段2,…) is not null;
SELECT Count(字段1,或字段2,…),字段A FROM
table_name group by 字段A;
SELECT Count(字段1,或字段2,…),字段A FROM
table_name where 字段B=数值 group
by 字段A;
【与其它字段一起查询显示,要与group by组合使用,且要显示的"字段A",一定要与group
by匹配的"字段A"相同,与字段Bgroup
by配置的字段名相同】
9、sum 求和
SELECT sum(字段1,或字段2,…)FROM table_name;
sum匹配的字段,一定为数值类型。
SELECT sum(字段1,或字段2,…),字段A FROM
table_name group by 字段A;
SELECT sum(字段1,或字段2,…),字段A FROM
table_name where 字段B=数值 group
by 字段A;
【与其它字段一起查询显示,要与group
by组合使用,且要显示的"字段A",一定要与group
by匹配的"字段A"相同,与字段B不能相同,所以只能是一个集合函数,或者与group
by配置的字段名相同】
10、Max 求和
SELECT Max(字段1,或字段2,…)FROM table_name;
sum匹配的字段,一定为数值类型。
SELECT Max(字段1,或字段2,…),字段A FROM
table_name group by 字段A;
SELECT Max(字段1,或字段2,…),字段A FROM
table_name where 字段B=数值 group
by 字段A;
【与其它字段一起查询显示,要与group
by组合使用,且要显示的"字段A",一定要与group
by匹配的"字段A"相同,与字段B不能相同,所以只能是一个集合函数,或者与group
by配置的字段名相同】
11、Min 求和
SELECT Min(字段1,或字段2,…)FROM table_name;
sum匹配的字段,一定为数值类型。
SELECT Min(字段1,或字段2,…),字段A FROM
table_name group by 字段A;
SELECT Min(字段1,或字段2,…),字段A FROM
table_name where 字段B=数值 group
by 字段A;
【与其它字段一起查询显示,要与group
by组合使用,且要显示的"字段A",一定要与group
by匹配的"字段A"相同,与字段B不能相同,所以只能是一个集合函数,或者与group
by配置的字段名相同】
12、AVG 求平均值
SELECT avg(字段1,或字段2,…)FROM table_name;
sum匹配的字段,一定为数值类型。
SELECT avg(字段1,或字段2,…),字段A FROM
table_name group by 字段A;
SELECT avg1,或字段2,…),字段A FROM
table_name where 字段B=数值 group
by 字段A;
【与其它字段一起查询显示,要与group
by组合使用,且要显示的"字段A",一定要与group
by匹配的"字段A"相同,与字段B不能相同,所以只能是一个集合函数,或者与group
by配置的字段名相同】
13、having筛选组查询
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过
$1,500。在这个情况下,我们不能使用
WHERE 的指令。那要怎么办呢?很幸运地,SQL 有提供一个 HAVING 的指令,而我们就可以用这个指令来达到这个目标。
HAVING 子句通常是在一个 SQL 句子的最后。
一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。
HAVING 的语法如下:
SELECT
"栏位1",
SUM("栏位2")
FROM
"表格名"
GROUP
BY "栏位1"
HAVING
(函数条件)
;
select (字段1,或字段2,…)from table_name group by
<字段1,或字段2,…> having <分组条件>;
例如:查询出本次考试男女生的总成绩大于等于250分的信息
select
sex,sum(score) as
'总成绩' from
student group by sex having
sum(score)>=250;
12、表格连接
store_name
Sales
Date
Los Angeles
$1500
Jan-05-1999
San Diego
$250
Jan-07-1999
Los Angeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
East
Boston
East
New
York
West
Los Angeles
West
San Diego
SELECT
A1.region_name REGION, SUM(A2.Sales)
SALES
FROM
Geography A1, Store_Information A2 --A1,A2使用到别名,更助于理解
WHERE
A1.store_name = A2.store_name
--关键处,存在相同的字段列
GROUP
BY A1.region_name --按区域名称,进行分类
结果:
REGION SALES
East $700
West $2050
外部连接
Select a2. region_name, sum(a1.Sales )
from Store_Information a1 , Geography a2
Where a1. store_name=a2.
store_name+--"+"表示列表中的所有资料,都查取出来
Group
by a2.region_name;
13字段列表内容间的串连
MySQL:
CONCAT()
Oracle:
CONCAT(), ||
CONCAT(字符串1, 字符串2, 字符串3,...): 将字符串1、字符串2、字符串3,等字符串连在一起。请注意,Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字符串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字符串
SELECT
CONCAT(region_name,store_name) FROM Geography
WHERE
store_name = 'Boston';
SQL
Server使用+,如:加个空格+'
'+
WHERE
store_name = 'Boston';
14、SUBSTRING
SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分。这个函数的名称在不同的数据库中不完全一样:
MySQL:
SUBSTR(), SUBSTRING()
Oracle:
SUBSTR()
SQL
Server: SUBSTRING() 此函数不可用
最常用到的方式如下 (在这里我们用SUBSTR()为例):
SUBSTR(str,pos): 由中,选出所有从第位置开始的字符。请注意,这个语法不适用于SQL Server上。
SUBSTR(str,pos,len): 由中的第位置开始,选出接下去的个字符
假设我们有以下的表格:
Geography 表格
region_name
store_name
East
Boston
East
New York
West
Los Angeles
West
San Diego
例1:
FROM
Geography
WHERE
store_name = 'Los Angeles';
结果:
's
Angeles'
例2:
SELECT
SUBSTR(store_name,2,4)
FROM
Geography
WHERE
store_name = 'San Diego';
结果:
'an
D'
15、top查询
随机取出10条数据select top 10 * from tablename order by newid();
l
insert
into…插入
1、普通常用插入
Insert
into table_name (字段1, 字段2, 字段3,…)values
(数值1, 数值2, 数值3,…);
2、插入子查询结果
Insert
into table_name [(字段1, 字段2, 字段3,…)]
SELECT 语句;
--后面的select语句中,还可加相应的限制条件(如:where)
例如:
insert into [XXXXX].[dbo].[Geography_001] (regionID,region_name,store_name)
select [regionID],[region_name],[store_name]
from [XXXXX].[dbo].[Geography]
where regionID>9002;
l
delete
from…删除
1、删除表中的符合某个条件的所有数据信息:
Delete
from table_name where 字段1=数值1,或字段2=数值2,…;
2、删除表中所有内容,表结构不删除,以下两种效果一样:
Delete table_name;
truncate table
table_name;
3、完全删除表:
Drop
table table_name;
l
update
…set修改
update
table_name set 字段1=数值1 where 字段1=数值1, 字段2=数值2,…;
例如:
UPDATE Store_Information SET Sales
= 500
WHERE store_name = "Los Angeles"
AND
Date = "Jan-08-1999";
SQL查询的拓展
l
UNION 或 UNION ALL
作用是将两个 语句的结果合并起来(相当于取两个SQL 语句的并集)
UNION 的语法如下:
[SQL 语句 1]
UNION [SQL 语句 2]
限制是两个
SQL 语句查询的字段值(可以为多个字段)内容,必须是同类型的数据。
SELECT store_name
FROM [XXXXX].[dbo].[Geography]
SELECT
Store_Information
FROM [XXXXX].[dbo].[Store_Information];
结果:
Boston
Los Angeles
New York
San Diego
如果SQL语句中为union
all ,则全部将两张表的字段值内容,查询出且包括重复的。
l
distinct
查询重复出现的字段值,只显示一次。
字段名1,字段名2
from 表格 order
by 字段名1
例如:
Store_Information 表格
Los Angeles
$1500
Jan-05-1999
San Diego
$250
Jan-07-1999
Los Angeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
执行语句:
select
distinct [store_name] from
[XXXXX].[dbo].[Store_Information];
store_name (字段)
Boston
Los Angeles
New York
San Diego
l
INTERSECT
作用是将字段值都存在两个 SQL
语句中时,才查询出结果。(相当于取两个SQL 语句的交集)
语法:
[SQL 语句 1] INTERSECT [SQL
语句 2]
限制是两个 SQL 语句查询的字段值(可以为多个字段)内容,必须是同类型的数据。
SELECT store_name
FROM [XXXXX].[dbo].[Geography]
intersect
SELECT
Store_Information
FROM [XXXXX].[dbo].[Store_Information];
结果:
store_name (字段)
Boston
Los Angeles
San Diego
l
MINUS
只运用在两个 SQL 语句上。执行第一个 SQL 语句所产生的结果,如果存在第二个 SQL 语句所产生的结果,如果不存在第一个 SQL 语句所产生的结果内,则会被去除,不显示最后结果中
Store_Information 表格
store_name
Sales
Date
Los Angeles
$1500
Jan-05-1999
San Diego
$250
Jan-07-1999
Los Angeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
Internet_Sales 表格
Date
Sales
Jan-07-1999
$250
Jan-10-1999
$535
Jan-11-1999
$320
Jan-12-1999
$750
而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:
SELECT
Date FROM Store_Information
MINUS
SELECT
Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-08-1999
l
子查询
在一个 SQL 语句中放入另一个 SQL 语句。在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,就有一个子查询 (subquery) 的架构。
子查询的作用是:1、用来连接表格。2、唯一能够连接两个表格的方式。
子查询的语法如下:
SELECT
"栏位1"
FROM
"表格"
WHERE
"栏位2"
[比较运算素]
(SELECT "栏位1"
FROM "表格"
WHERE [条件]);
其中,[比较运算素]可以为“=, >, =, <=.”,也可以为“like”,及“and”、“or”,红色部分表示内查询。