目录
1.6 BETWEEN:在一个连续范围内取值(跟where配合)
1. SQL指令
SQL指令是指SQL如何被用来储存,读取和处理数据库之中的表格资料。
常见的SQL指令有如下这些:
1.1 SELECT:选择
(1)作用:将资料从数据库的表格中选出。能够读取表格中一个或数个列的所有资料。
什么是表格?表格是数据库内的结构,目的是储存资料。
(2)语句: select 列名1, 列名2... from 表名
1.2 DISTINCT:区分(选择)
(1)作用:处理资料时,需要找出表格内不同的资料值,即要知道列中有哪些不同的值,而不关心每个值出现的次数。此时用distinct。
(2)语句: select distinct 列名 from 表名
1.3 WHERE:带查询条件
(1)作用:当需要有条件的进行选择性查询一些资料时,用到where
(2)语句: select 列名 from 表名 where 条件
1.4 AND OR:与,或(连接条件)
(1)作用:where的复杂条件是由两个或多个简单条件通过and或or连接而成的。一个SQL语句中可以有无限多个简单条件的存在。
(2)语句: select 列名 from 表名 where 简单条件1 and|or 简单条件2...
1.5 IN:在一个不连续范围内取值(跟where配合)
(1)作用:in子句,通常跟where配合使用,表示条件在一个不连续的范围内取值
(2)语句: select 列名 from 表名 where 列名作为条件 in (值1,值2,值3...) exists
(3)补充:in子句括号内如果只有一个值,则相当于...where 列名=值1
1.6 BETWEEN:在一个连续范围内取值(跟where配合)
(1)作用:in指令是在一个或者数个不连续的值的限制内获取资料库中的值,而between是在一个连续的范围内获取资料库中的值。通常也跟where配合使用。
(2)语句: select 列名 from 表名 where 列名 between 值1 and 值2
1.7 LIKE:带查找模式(跟where配合)
(1)作用:依据一个模式来找出需要的资料。通常也跟where配合使用。
(2)语句: select 列名 from 表名 where 列名 like {模式}
(3){模式}:
比如 A_B表示A开头B结尾中间只能有一个字符,ABC%表示ABC开头的字符串,%ABC表示ABC结尾的字符串,%ABC%表示所含有ABC这个模式的字符串。
1.8 ORDER BY:排序
(1)作用:将获取的资料做一个有系统的显示,即排序显示,正序或者逆序。
(2)语句: select 列名 from 表名 where 条件 order by 列名[ASC, DESC]
(3)[ ]表示可选,不是必选的。ASC表示从小到大,DESC反之。默认用ASC。
(4)注意:如果存在where,那么where需要在order by子句的前面。
(5)补充:可以同时对几个列名进行排序。order by 列名1[ASC, DESC], 列名2[ASC,DESC]。如果对两个列都选择从小到大排序,那这个子句的结果是:按照列名1从小到大排。若有好几个查询结果的列名1相等,那这几个结果就按照列名2从小到大排,以此类推。
1.9 函数
(1)作用:数据库中很多内容都是以数字的形式存在,对这些数字做运算时,可以通过一些定义好的函数来直接运行。
(2)常用函数:
AVG:平均值
COUNT:计数
MAX:最大值
MIN:最小值
SUM:总和
(3)语句: select 函数名(列名)from 表名
1.10 COUNT:计数
(1)作用:计数,数出在表格中找到的符合条件的条目一共有几个。
(2)语句: select count(列名) from 表名
(3)注意:count经常和distinct一起使用,目的是找出表格中有多少个不同的条目。
1.11 GROUP BY:分类
(1)作用:当我们选不只一个列名且其中至少一个列名有包含函数的运用时,就需要用到group by指令。在这种情况下,需要确定我们有group by所有其他的列名。即:除了有包括函数的列名外,都需要将其放在group by的子句中。
(2)语句: select 列名1 sum(列名2) from 表名 group by 列名1
1.12 HAVING:
(1)作用:对函数产生的值来设定条件。having子句是在一个SQL句子的最后。
一个含有having子句的SQL并不一定要包含group by子句。
(2)语句: select 列名1,sum(列名2) from 表名 group by 列名1 having(函数条件)
(3)注意:如果被select的只有函数栏,那就不需要group by子句。
1.13 ALIAS:别名(针对表或列)
(1)作用:给表和列起别名。
列名的别名:是为了让SQL产生的结果易读。
表格的别名:只要在from子句中的表格名后空一格,然后再列出要用的表格别名即可。
即:这两种别名,都放在要替代的表名或列名的后面,跟表名或列名用空格分开。
(2)语句: select 表别名.列名1 列名1 列别名 from 表名 表别名
(3)注意:列别名不仅可以直接放在列名后面,也可以放在函数后,比如 ...sum(列名) 列别名...
1.14 表格连接
(1)作用:通过两个表中相同的列,将两个表连起来。
where子句在表格连接中起了很重要的作用。
如果where使用有误,很可能得到一个笛卡尔连接(所得两个表格每两行之间所有可能的组合)。
1.15 外部连接
(1)作用:
我们常说的左连接也就是内部连接。在内部连接的情况下,需要两个表格内都有同样的值,那一笔资料才会被选中。
如果要列出一个表格中每一笔的资料,无论它的值在另一个表中有没有出现。此时,就需要外部连接:SQL OUTER JOIN。
(2)语句: 外部连接的语法是依数据库的不同而不同。比如,在Oracle中,where子句中要选出所有资料的那个表格后加上 (+)来表示这个表格中的所有资料我们都需要。
(3)注意:当第二个表格没有相对的资料时,SQL会传回NULL。
1.16 CONCATENATE:串连字符
(1)作用:将由不同列名获得的结果串连起来。每个数据库提供的方法可能有所不同:
MySQL:CONCAT()
Oracle:CONCAT(), ||
SQL Server:+
(2)语句: concat(字符1,字符2,字符3...)
表示将字符1,字符2,字符3串连起来。
(3)注意:Oracle的concat()只允许两个参数;即一次只能将两个字符串串起来。但是可以用||来一次串连其多个字符串。
1.17 SUBSTRING:截取字符
(1)作用:SQL中的substring函数,是用来获取一个列资料中的其中一部分。
在不同的数据库中,这个函数名称不一样:
MySQL: substr(), substring()
Oracle: substr()
SQL Server: substring()
(2)语句: substr(str, pos)表示选出从第pos位置开始字符。该语法不适用于SQL Server上。
sub(str, pos, len)表示从str的pos位置开始,选出len长度的字符串。
1.18 TRIM:移除字符串头部或尾部的指定内容
(1)作用:trim()函数用来移除掉字符串中的字头或字尾。最常用的是移除字头或字尾的空白。
在不同的数据库中,该方法不同:
MySQL:trim(), rtrim(), ltrim()
Oracle:rtrim(), ltrim()
SQL Server:rtrim(), ltrim()
(2)语句: trim([[位置] [要移除的字符串] from] 字符串)
(3)注意:如果没有列出要移除的字符串是什么的话,就会移除空白(如果有的话)。
2. 表格处理
表格处理指令,是指如何使用SQL来处理数据库中的各个表格,增删改查等。
2.1 CREATE TABLE :创建表
(1)作用:在数据库中创建表格
(2)语句:
create table 表名
( 列名1 属性,
列名2 属性,
列名3 属性 );
2.2 CONSTRAINT:限制
(1)作用:用来指定哪些资料可以存入表格中,或者之后借由alter table语句来指定。
(2)常见的限制有:
not null
unique
check
主键(primary key)
外来键(Foreign key)
2.3 NOT NULL:限制列的值非NULL
(1)作用:在没有做出任何限制的情况下,一个列的值是允许有null值的。如果不允许一个列的值含有null,那就需要对那个列做not null的指定。
(2)语句:
create table 表名
(列名1 属性 not null,
列名2 属性 not null,
列名3 属性);
2.4 UNIQUE:限制列的值唯一
(1)作用:保证一个列中的值都是不一样的。
(2)语句:
create table 表名
(列名1 属性 not null unique,
列名2 属性 not null,
列名3 属性);
(3)注意:一个被指定为主键的列,一定会含有unique特性。但一个unique列并不一定是主键。
2.5 CHECK
(1)作用:保证一个列中的所有值都是符合某些条件。
(2)语句:
create table 表名
(列名1 属性 check(列名1>10) not null unique,
列名2 属性 not null,
列名3 属性);
(3)注意:check限制尚未被执行于MySQL数据库上。
2.6 primary key:主键
(1)作用:主键(primary key)中的每一个值都是表格中的唯一值。
即,它是用来独一无二地确认一个表格中的每一行值。
主键可以是原本资料内的一个列或是一个人造列(和原本的值没有关系的列位)。
主键可以包含一个或多个列位。当主键包含多个列位时,称为组合键(composite key)。
(2)语句:
MySQL中:
create table 表名
(列名1 属性 check(列名1>10) not null unique,
列名2 属性 not null,
列名3 属性,
primary key(列名1));
Oracle中:
create table 表名
(列名1 属性 check(列名1>10) not null unique primary key,
列名2 属性 not null,
列名3 属性);
SQL Server中:
create table 表名
(列名1 属性 check(列名1>10) not null unique primary key,
列名2 属性 not null,
列名3 属性);
(3)如何通过改变现有表格架构来设定主键的方式:
MySQL: alter table 表名 add primary key(列名2)
Oracle: alter table 表名 add primary key(列名2)
SQL Server: alter table 表名 add primary key(列名2)
(4)注意:在用alter语句添加主键之前,需要确认被用当做主键的列是否设定为not null。即,主键列一定要 not null。
2.7 foreign key:外来键
(1)作用:外来键是一个或数个指向另外一个表格主键的列。
外来键的目的是确定值的参考完整性(referential integrity)。即只有被准许的值才会被存入数据库。
(2)语句:
MySQL中:
create table 表名1
(列名1 属性 check(列名1>10) not null unique,
列名2 属性 not null,
列名3 属性,
primary key(列名1)
foreign key(列名2) references 表名2(主键列));
Oracle中:
create table 表名1
(列名1 属性 check(列名1>10) not null unique primary key,
列名2 属性 not null,
列名3 属性 references 表名2(主键列));
SQL Server中:
create table 表名1
(列名1 属性 check(列名1>10) not null unique primary key,
列名2 属性 not null,
列名3 属性 references 表名2(主键列));
(3)如何通过改变现有表格架构来设定外键的方式:
MySQL: alter table 表名1 add foreign key(列名2) references 表名2(列名2)
Oracle: alter table 表名1 add(constraint xxx) foreign key(列名2) references 表名2(列名2)
SQL Server: alter table 表名1 add foreign key(列名2) references 表名2(列名2)
2.8 CREATE VIEW:新建视图
(1)作用:视图表可以被当做虚拟表格。与常规的表格不同的是,表格中有实际存储资料,但视图是建立在表格之上的一个架构,它本身不实际存储资料。
(2)语句: create view 视图名 as SQL语句;
其中,SQL语句可以类似:select 列名 from 表名;
(3)注意:可以用视图来连接两个表格。这种情况下,使用者就可以直接由一个视图表中找出需要的信息,而不需要从两个不同的表格中去先做连接动作再查找。
2.9 CREATE INDEX:新建索引
(1)作用:
索引可以帮助我们从表格中快速的找到需要的资料。
如果一个表格没有索引,数据库系统需要将整个报个的资料读出,这个过程叫table scan。
如有适当的索引存在,数据库系统就可以先由这个索引去找出需要的资料是在表格中的什么位置,然后直接去该位置获取资料,加快了获取资料的速度。
索引是有利于系统效率的事情。一个索引可以涵盖一个或多个列。
(2)语句: create index 索引名 on 表名(列名1, 列名2);
2.10 ALTER TABLE:修改表格
(1)作用:表格被建立后,有时需要改变表格的结构。比如,加一列,删一列,改变列名称,改变列的属性等等。
(2)语句: alter 表名 列名 [改变方式]
[改变方式]常见的有:
加一列:add 列名2 属性
删一列:drop 列名2
改变列名称:change 旧列名 新列名 新属性
改变列的属性:modify 列名2 新属性
2.11 DROP TABLE:删除表格
(1)作用:从数据库中清除一个表格(删掉表格)
(2)语句: drop table 表名
2.12 TRUNCATE TABLE:清除表格内容
(1)作用:清除一个表格中的所有资料(不删表格)
(2)语句: truncate table 表名
2.13 INSERT INTO:在表格中插入内容
(1)作用:将资料输入表格中。
(2)语句:
insert into 表名(列1,列2...)values(值1,值2...)
insert into 表名1(列1,列2...)select 列名3,列名4 from 表名2
2.14 UPDATE:更新表格内容
(1)作用:修改表格中的资料。
(2)语句: update 表名 set 列名1=新值 where 条件
2.15 DELETE FROM:删除一行或多行
(1)作用:在某些情况下,需要直接由数据库中去除一些资料。(删掉的是一行或多行)
(2)语句:delete from 表名 where 条件
3. 进阶SQL
如何使用SQL来执行一些较为复杂的运算,以及如何用SQL做这些操作:
排名 rank
中位数 median
累积总计 running total
总和百分比 percent to total
累积总和百分比 cumulative percent to total
3.1 UNION:合并
(1)作用:目的是将两个SQL语句的结果合并起来。这个角度来看,union和join类似。
union的一个限制是两个SQL语句所产生的列位需要是同样的属性类型。
另外,当使用union时,我们只会看到不同的资料值,即结果值不重复,类似select distinct。
(2)语句:
SQL 语句1
union
SQL 语句2
(3)注意:如果我们在任何一个SQL语句(或者两句都一起)用select disinct 列名,那很可能得到完全一样的结果。
3.2 UNION ALL
(1)作用:目的也是要将两个SQL语句的结果合并到一起。
不同的是,union all会将每一笔符合条件的资料都列出来,无论资料值有无重复。结果值可重复。
(2)语句:
SQL 语句1
union all
SQL 语句2
3.3 INTERSECT
(1)作用:与union类似,intersect也是对两个SQL语句所产生的结果做处理。
不同的是,union基本是一个OR,而intersect则更像AND。即union是联集,intersect是并集。
(2)语句:
SQL 语句1
intersect
SQL 语句2
(3)注意:intersect指令,不同的值只会被列出一次。
3.4 MINUS
(1)作用:
mius是指运用在两个SQL语句上。
先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有,那这第一笔资料就被去除,而不会在最后的结果中出现。
如果第二个SQL语句所产生的结果并没有存在于第一个SQL所产生的结果内,那这笔资料也会被抛弃。
(类似于减法?最后只剩下第一个SQL语句中那些只在第一个SQL语句中出现而不会在第二个SQL语句中出现的项)
(2)语句:
SQL 语句1
minus
SQL 语句2
(3)注意:minus指令,不同的值只会被列出一次。
3.5 子查询
(1)作用:subquery,在一个SQL语句中放入另一个SQL语句。
当我们在where子句或having子句中插入另一个sql语句时,我们就有一个子查询。
子查询的作用,第一,可以被用来连接表格。第二,有时子查询是唯一能够连接两个表格的方式。
(2)语句:
select 列名1 from 表名1 where 列名2 [比较运算素] (select 列名2 from 表名2 where 条件)
其中,
[比较运算素]可以是相等的运算素(=, >=, >, <=, <),也可以是一个对文字的运算素(LIKE)。
3.6 EXISTS
(1)作用:在前面我们用in,>, <, = 等来连接内查询和外查询。exists也是其中一个方式。
基本上,exists是用来测试内查询有没有产生任何结果。
如果有,系统就会执行外查询中的SQL。若没有,那整个SQL语句就不会产生任何结果。
(2)语句:
select 列名1 from 表名1 where exists (select 列名2 from 表名2 where 条件)
3.7 CASE
(1)作用:case用来作为if-then-else之类逻辑的关键字。
(2)语句:
select case(列名)
when 条件1 then 结果1
when 条件2 then 结果2
...
[else 结果n]
end
from 表名
(3)补充:条件可以是一个数值或一个公式。else子句不是必须的。
3.8 算排名
(1)作用:列出每一行的排名是一个常见的需求。但是SQL没有一个很直接的方式达到这个需求。要以SQL列出排名,思路是要做一个表格自我连结(left join),将结果依序列出,然后算出每一行之前(包含那一行本身)有多少行数。
(2)语句: 略
3.9 算中位数
(1)作用:要算出中位数,必须能够达成几个目标:将资料依序排出,并找出每一行资料的排名。找出中间的排名是什么。
(2)语句: 略
3.10 算总和百分比
(1)作用:要用SQL算出总和百分比,需要用到算排名和累积总计,以及运用子查询。
(2)语句: 略
3.11 算累计总和百分比
(1)作用:要用SQL累积总和百分比,我们运用类似总和百分比的概念。两者的不同处在于这个情况下,我们要算出到目前为止的累积总和是所有总和的百分之几。
(2)语句: 略
4. SQL常见问题
(常见操作练习:会另起文章练习,之后补文章链接)