欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQLite入门介绍(三)

程序员文章站 2022-04-15 13:20:46
SQLite入门介绍。相信经过前面的介绍,即使是以前没有接触过SQLite的朋友也已经可以熟练的用sqlite来创建表了,这就是明显的进步啊。但学习不止,数据库的知识怎么可能仅仅局...

SQLite入门介绍。相信经过前面的介绍,即使是以前没有接触过SQLite的朋友也已经可以熟练的用sqlite来创建表了,这就是明显的进步啊。但学习不止,数据库的知识怎么可能仅仅局限于创建表,现在让我们一起学习下SQLite更高级的语法应用。

JOIN

SQLite 的 Joins 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:

交叉连接 - CROSS JOIN

内连接 - INNER JOIN

外连接 - OUTER JOIN

既然是要连接多个数据表,那么我们就先创建两个表。

CREATE TABLE department(
    id int primary key not null,
    dept varchar not null
);

表中有3条数据:

id          dept
----------  ----------
1           IT Billing
2           Engineerin
3           Finance
CREATE TABLE person(
    id int primary key not null,
    name varchar not null,
    age int not null,
    dept_id int not null
);

表中有七条数据:

id          name        age         dept_id
----------  ----------  ----------  ----------
1           Jack        21          2
2           Mary        20          1
3           Mike        22          3
4           Amy         19          1
5           Alen        18          2
6           Ren         21          3
7           Lucy         20          1

交叉连接 - CROSS JOIN

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 列,则结果表有 x+y 列,且有两个数据表数据相乘的数据量。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

下面是交叉连接(CROSS JOIN)的语法:

SELECT ... FROM table1 CROSS JOIN table2 ...

基于上面的表,我们可以写一个交叉连接(CROSS JOIN):

select person.id, name, dept from person cross join department;

这样最终会返回21条数据。

id          name        dept
----------  ----------  ----------
1           Jack        IT Billing
1           Jack        Engineerin
1           Jack        Finance
2           Mary        IT Billing
2           Mary        Engineerin
2           Mary        Finance
3           Mike        IT Billing
3           Mike        Engineerin
3           Mike        Finance
4           Amy         IT Billing
4           Amy         Engineerin
4           Amy         Finance
5           Alen        IT Billing
5           Alen        Engineerin
5           Alen        Finance
6           Ren         IT Billing
6           Ren         Engineerin
6           Ren         Finance
7           Lucy        IT Billing
7           Lucy        Engineerin
7           Lucy        Finance

内连接 - INNER JOIN

内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。

内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。

下面是内连接(INNER JOIN)的语法:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

为了避免冗余,并保持较短的措辞,可以使用 USING 表达式声明内连接(INNER JOIN)条件。这个表达式指定一个或多个列的列表:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
select person.id, name, age, dept from person join department using(id);

将两个表id相同的数据输出。

id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          IT Billing
2           Mary        20          Engineerin
3           Mike        22          Finance

自然连接(NATURAL JOIN)类似于 JOIN…USING,只是它会自动测试存在两个表中的每一列的值之间相等值:

SELECT ... FROM table1 NATURAL JOIN table2...
select person.id, name, age, dept from person natural join department;
id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          IT Billing
2           Mary        20          Engineerin
3           Mike        22          Finance

基于上面的表,我们可以写一个内连接(INNER JOIN),如下所示:

select person.id, name, age, dept from person inner join department on person.dept_id = department.id;
id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          Engineerin
2           Mary        20          IT Billing
3           Mike        22          Finance
4           Amy         19          IT Billing
5           Alen        18          Engineerin
6           Ren         21          Finance
7           Lucy        20          IT Billing

外连接 - OUTER JOIN

外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。

外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。

下面是左外连接(LEFT OUTER JOIN)的语法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

为了避免冗余,并保持较短的措辞,可以使用 USING 表达式声明内连接(INNER JOIN)条件。这个表达式指定一个或多个列的列表:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
select * from person left outer join department using(id);
id          name        age         dept_id     dept
----------  ----------  ----------  ----------  ----------
1           Jack        21          2           IT Billing
2           Mary        20          1           Engineerin
3           Mike        22          3           Finance
4           Amy         19          1
5           Alen        18          2
6           Ren         21          3
7           Lucy        20          1

自然连接(NATURAL JOIN)类似于 JOIN…USING,只是它会自动测试存在两个表中的每一列的值之间相等值:

SELECT ... FROM table1 NATURAL OUTER JOIN table2...
select * from person left natural outer join department;
id          name        age         dept_id     dept
----------  ----------  ----------  ----------  ----------
1           Jack        21          2           IT Billing
2           Mary        20          1           Engineerin
3           Mike        22          3           Finance
4           Amy         19          1
5           Alen        18          2
6           Ren         21          3
7           Lucy        20          1

基于上面的表,我们可以写一个外连接(OUTER JOIN),如下所示:

insert into person values(8, 'John', 17, 0); //先添加一条新数据

select person.id, name, age, dept from person left outer join department on person.dept_id = department.id;
id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          Engineerin
2           Mary        20          IT Billing
3           Mike        22          Finance
4           Amy         19          IT Billing
5           Alen        18          Engineerin
6           Ren         21          Finance
7           Lucy        20          IT Billing
8           John        17

Union

SQLite的 UNION 子句/运算符用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。

为了使用 UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度。

UNION 的基本语法如下:

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

UNION

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

这里给定的条件根据需要可以是任何表达式。

现在让我们用上面建立的两个表来举例:

sqlite> select person.id, name, age, dept from person inner join department on person.dept_id = department.id 

union 

select person.id, name, age, dept from person left outer join department using(id);
id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          Engineerin
1           Jack        21          IT Billing
2           Mary        20          Engineerin
2           Mary        20          IT Billing
3           Mike        22          Finance
4           Amy         19
4           Amy         19          IT Billing
5           Alen        18
5           Alen        18          Engineerin
6           Ren         21
6           Ren         21          Finance
7           Lucy        20
7           Lucy        20          IT Billing
8           John        17

所以,union就是将两个select的结果合并后去掉相同数据。

UNION ALL

UNION ALL 运算符用于结合两个 SELECT 语句的结果,包括重复行。
适用于 UNION 的规则同样适用于 UNION ALL 运算符。这里就不提了,就是将两个select的结果拼接在一起。

NULL值

SQLite 的 NULL 是用来表示一个缺失值的项。表中的一个 NULL 值是在字段中显示为空白的一个值。

带有 NULL 值的字段是一个不带有值的字段。NULL 值与零值或包含空格的字段是不同的,理解这点是非常重要的。

IS NOT NULL

select * from person where name is not null;

IS NULL

select * from person where name is null;

因为我们在person表中设置的是NOT NULL,所以是不会有返回的值。

别名

可以暂时把表或列重命名为另一个名字,这被称为别名。使用表别名是指在一个特定的 SQLite 语句中重命名表。重命名是临时的改变,在数据库中实际的表的名称不会改变。

列别名用来为某个特定的 SQLite 语句重命名表中的列。

别名的基本语法如下:

SELECT column1, column2.... FROM table_name AS alias_name WHERE [condition];

别名的基本语法如下:

SELECT column_name AS alias_name FROM table_name WHERE [condition];

表别名 的用法:

select p.id, p.name, p.age, d.dept from person as p, department as d where p.dept_id = d.id;
id          name        age         dept
----------  ----------  ----------  ----------
1           Jack        21          Engineerin
2           Mary        20          IT Billing
3           Mike        22          Finance
4           Amy         19          IT Billing
5           Alen        18          Engineerin
6           Ren         21          Finance
7           Lucy        20          IT Billing

列别名 的实例:

select p.id as PERSON_ID, p.name as PERSON_NAME, p.age as PERSON_AGE, d.dept as PERSON_DEPT from person as p, department as d where p.dept_id = d.id;
PERSON_ID   PERSON_NAME  PERSON_AGE  PERSON_DEPT
----------  -----------  ----------  -----------
1           Jack         21          Engineerin
2           Mary         20          IT Billing
3           Mike         22          Finance
4           Amy          19          IT Billing
5           Alen         18          Engineerin
6           Ren          21          Finance
7           Lucy         20          IT Billing