UNION子句
SQLite的UNION子句、运算符用于合并两个或多个SELECT语句的结果,不返回任何重复的行,因此每个SELECT被选择的列数必须相同,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同长度。
UNION 的基本语法:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
实例:
表一
sqlite> select * from company;
ID NAME AGE ADDRESS SALARY SEX
---------- ---------- ---------- ---------- ---------- ----------
1 Paul 32 Califronia 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
表二:
sqlite> select * from department;
ID DEPT EMP_ID
---------- ---------- ----------
1 IT Billing 1
2 Engineerin 2
3 Finance 7
用UNION子句连接两个表:
sqlite> SELECT EMP_ID,NAME,DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID UNION SELECT EMP_ID,NAME,DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
EMP_ID NAME DEPT
---------- ---------- ----------
David
Kim
Mark
Teddy
1 Paul IT Billing
2 Allen Engineerin
7 James Finance
可见产生的结果,NAME取自表一,EMP_ID和DEPT取自表二,表二的EMP_ID是1,2,7,则表一的NAME也选1,2,7,以及对应的DEPT。因为我的两个表的列数不一样,所以呢结果不是很好看。
UNION ALL子句
与UNION一样,只是显示重复行。
语法:
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION ALL
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
实例:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION ALL
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
这里将表二内容改一下,为了方便,改成与表一相同的列数:
ID DEPT EMP_ID
---------- -------------------- ----------
1 IT Billing 1
2 Engineering 2
3 Finance 7
4 Engineering 3
5 Finance 4
6 Engineering 5
7 Finance 6
结果:
EMP_ID NAME DEPT
---------- -------------------- ----------
1 Paul IT Billing
2 Allen Engineerin
3 Teddy Engineerin
4 Mark Finance
5 David Engineerin
6 Kim Finance
7 James Finance
1 Paul IT Billing
2 Allen Engineerin
3 Teddy Engineerin
4 Mark Finance
5 David Engineerin
6 Kim Finance
7 James Finance
SQLite别名
定义别名即是将表或列重命名为一个临时的名字,在数据库中实际名称不会改变
表别名:
语法
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
实例(以开始的两个表为例):
select c.id,c.name,c.age,d.dept from company as C,department as D where C.ID = D.EMP_ID;
ID NAME AGE DEPT
---------- ---------- ---------- ----------
1 Paul 32 IT Billing
2 Allen 25 Engineerin
7 James 24 Finance
列别名
语法:
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];
实例:
sqlite> SELECT C.ID AS COMPANY_ID, C.NAME AS COMPANY_NAME, C.AGE, D.DEPT FROM COMPANY AS C,DEPARTMENT AS D WHERE C.ID = D.EMP_ID;
COMPANY_ID COMPANY_NAME AGE DEPT
---------- ------------ ---------- ----------
1 Paul 32 IT Billing
2 Allen 25 Engineerin
7 James 24 Finance
SQLite Alter命令
ALTER TABLE命令可以重命名表以及在已有表中添加列,但是不支持其他操作
重命名表
语法
ALTER TABLE database_name.table_name RENAME TO new_table_name;
实例:
sqlite> ALTER TABLE COMPANY RENAME TO OLD_COMPANY;
查看表:
sqlite> .table
DEPARTMENT OLD_COMPANY
添加列
语法:
ALTER TABLE database_name.table_name ADD COLUMN column_def...;
实例:
原来的表:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
添加列:
sqlite> ALTER TABLE OLD_COMPANY ADD COLUMN SEX char(1);
ID NAME AGE ADDRESS SALARY SEX
---------- ---------- ---------- ---------- ---------- ---
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
看结果可知添加了SEX列,但是新添加的列用NULL来填充。
DELETE和DROP TABLE
DELETE删除表中全部数据,DROP TABLE命令删除整个表,然后再重建一遍
语法:
sqlite> DELETE FROM table_name;
sqlite> DROP TABLE table_name;
sqlite> VACUUM;
VACUUM命令清除未使用的空间,一般在DROP TABLE后使用。