SQL小结

产品狗虽然对代码没啥要求,但是因为接触数据的缘故,平日难免与sql打交道。
借此机会复习下sql的基本语法。主要是一些小点,适合查缺补漏。

第一章 了解sql


数据库中的结构化清单


每个表有多个列组成,列可以理解为指标。


每一行是特定的内容。

主键
能够标识表中每行的那个列
任意两行不相同
每行都必须有值,不能使NULL
从表中删除某一行,主键不能赋给以后的新行

第二章 检索数据

本身select出来的内容顺序不一定(不排序、不过滤)

select * 查询所有列,一般顺序是定义时的物理顺序

第三章 排序检索数据

利用关键字 order by 将查询结果排序

一般出现在select语句的最后一条字句

排序方式可以不是select中出现的列,只要在表中就可以

order by 可以对多列排序

按照写出的顺序,第一列相同,按照第二列排

order by 同样可以直接写列的顺序
例子:order by 2,3

降序排列
在降序的列名后边加上关键字 DESC ,不能小写
默认不写的都是升序

第四章 过滤条件

where字句在order by之前

where子句中 between表示在两者之间,是闭区间,包括开始和结束的数值。

如果限定条件的内容类型是字符,需要用单引号圈住内容

第五章 高级数据过滤

限制操作符
and优先级高于or。多个条件用括号相连接

in操作符
内容用用括号包含,逗号隔开

not关键字
用于否定后边相连的条件(MYSQL只支持NOT EXISTS)

第六章 用通配符过滤

用关键字like引导搜索模式

%——任意字符出现任意次数,也可以是0次
注意:有些DBMS以空格结束,所以检索’F%Y’时,需要以%结尾
_——任意单个字符一次

第七章 计算字段

在select中创建,不是本身存在的列

作用1:连接列

使用+ 或者 || 连接
在mysql中使用concat函数连接,连接的内容用逗号隔开

AS别名,可以给列起别名
select concat(xxx,xxxxx) AS XXXX FROM XX;

作用2:进行计算
select a*b AS c from xxx;

第八章 函数

例子:
UPPER() 串转化为大写
LOWWER() 串转化为小写
还有很多类似的函数,不同的DBMS函数名不同,具体使用时查询即可。

SOUNDEX——发音类似函数
例子: Michael 类似于 Michelle

第九章 汇总数据

聚集函数
AVG()——求单个列的均值,会忽略NULL
COUNT()——求行个数,有具体列名,则忽略NULL,否则不忽略
MAX()——返回指定列的最大值,忽略NULL
MIN()——返回指定列的最小值,忽略NULL
SUM()——求和,忽略NULL

关键字DISTICT忽略重复的数值

第十章 分组数据

某些情况下,将数据首先分组,然后在每组中,进行数据的操作。
使用group by关键字

注意事项:
group by 在where之后,在order by之前
NULL值会被分到单独的一组
group by可以嵌套,最后的结果是多重嵌套的结果
子句中,必须是检索列或者有效的表达式(不能说聚集函数),不能用别名
select中的每个列都必须在group by中给出

过滤分组
对行的操作,用where关键字,
对分组的操作,用HAVING关键字

HAVING语法与where类似,where在分组前过滤,having在分组后过滤

一般的语句顺序
1.select
2.from
3.where
4.group by
5.having
6.order by

第十一章 使用子查询

利用子查询过滤

where 里边嵌套其他的查询结果

嵌套的一般都是查询单个列的结果。

创建计算字段

用select查询另外一个表的结果,将结果返回作为本次查询的一个列

注意:为了明确两个表的关系,需要写全列名。

第十二章 联结

通过列的映射关系将表联结,在select时可以检索数据

每次在select时才会联结,所以需要在where中指出联结方式

from 所有需要联结的表,where给出联结条件。

内联结

把两个表值相等的行拉出来,是内联结。可以使用 表1 INNER JOIN 表2 on 表1.id=表2.id

多表联结

from 表1,表2,表3
where 给出表之间的关系

第十三章 创建高级联结

AS同样可以对表起别名。便于引用

自联结

使用一个表中的数据联结,感觉与子查询类似
通过AS给表起别名

1
2
3
4
select c1.id, c1.name, c1.age
from xxx AS c1, xxx AS c2
where c1,id = c2.id
and c2.age= xxx;

利用子查询的写法:

1
2
3
4
5
select id, name , age
from xxx
where age= (select age
from xxx
where age= xxx;);

外联结

与内联结相比,可以取到没有关联行的那些行。可以取到null值的情况

left outer join 则是左联结,左边的表中所有的行都可以检索出来

right outer join 则是右联结,右边的表中所有的行都可以检索出来

第十四章 组合查询

UNION

多条select语句,可以使用union输出到一个表里边

注意:union查询的列、表达式、函数必须相同

union可以针对多个表格
union会把检索出来的所有行进行去重处理
union all 则返回所有的结果

如果进行排序,只有在最后存在一条order by

第十五章 插入数据

插入单行

格式如下:

1
2
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');

插入部分行

INSERT可以插入完整的单行,也可以插入某行的部分内容。

插入时,需要指出具体插入的内容是哪一列的,不插入的内容默认为NULL,如果不能是NULL,则会报错

插入检索出来的结果

INSERT SELECT

将select出来的内容全插入
例子:

1
2
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cut_email FROM Customers2;

SELECT INTO

相当于新建一张表,将检索出来的内容插到新表格中
例子:

1
2
3
CREATE TABLE XXXX1 AS
SELECT *
FROM XXX2;

第十六章 更新和删除数据

注意where子句来限定更新的范围

更新单行内容

1
2
3
4
5
UPDATE XXX1
SET XXX= ‘FFEWFWEF’,
XXXXX=‘FFRG4545'
WHERE XXXXXXX=‘GG54G54'

删除某个值可以将值的内容更新为NULL

删除某行

1
2
DELETE FROM XXX1
WHERE XXXXXXX=‘GG54G54'

注意DELETE删除的是某一整行,或者多个整行

如果想删除某个列的值,使用update

如果想删除的是整个表,使用drop

第十七章 创建表

创建表

例子:

1
2
3
4
5
6
7
8
CREATE TABLE Products
(
prod_id char(10) NOT NULL DEFAULT 1,
vend_id char(10) NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL
);

删除整个表用DROP

1
DROP TABLE xxxxx;

第十八章 视图

视图是虚拟的表

使用视图可以简化复杂的联结
用视图可以重新格式化检索出来的数据
用视图过滤不想要的数据

创建格式

····
CREATE VIEW XXXX_view AS
SELECT XXXXX
FROM XXXX
WHERE XXXXX =DDDDD;
····

引用

1
select * from XXXX_view where …;