SQLite约束以及连接

前面介绍了SQLite的初步学习,学习了建表,以及对表内容的增删改出等操作,本篇文章深入学习一下SQLite。

SQLite约束

由于开始学习过Oracle数据库的基础知识,对于约束问题有一些初步了解,约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型,确保了数据库中数据的准确性和可靠性。

约束可以是列级或表级,列级约束仅适用于列,表级约束被应用到整个表

常用约束:

约束说明
NOT NULL确保某列不能有NULL值
DEFAULT当某列没有指定值时,为该列提供默认值
UNIQUE确保某列中的所有值是不同的
PRIMARY KEY唯一标识数据库表中的各行记录
CHECK确保某列中的所有值满足一定条件
CREATE TABLE SCHOOL(
ID    INT PRIMARY KEY     NOT NULL,
NAME  TEXT                NOT NULL,
AGE   INT                 NOT NULL,
ADDRESS   CHAR(50),      
SALARY    REAL            CHECK(SALARY>0),
GREAD     INT             DEFAULT 100.00,
WEIGHT    INT             NOT NULL UNIQUE
);

SQLite中,ALTER TABLE命令允许用户重命名表,或者在表中添加一个新的列,但是重命名列和删除一列,添加以及删除约束无法完成。

SQLite Joins

SQLite的Joins子句用于结合两个或多个数据库中表的记录,JOIN是一种通过共同值来结合两个表中字段的手段。

SQL的三个主要类型连接:
1.交叉连接——CROSS JOIN
2.内连接——INNER JOIN
3.外连接——OUTER JOIN

为了说明这三种连接方式,先创建两个表:

表一

CREATE TABLE COMPANY(
ID   INT PRIMARY KEY      NOT NULL,
NAME TEXT                 NOT NULL,
AGE  INT                  NOT NULL,
ADDRESS     CHAR(50),
SALARY      REAL
);

信息:

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(1,'Paul',32,'Califronia',20000.00);
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(2,'Allen',25,'Texas',15000.00);          
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(3,'Teddy',23,'Norway',20000.00);         
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(4,'Mark',25,'Rich-Mond',65000.00);       
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(5,'David',27,'Texas',85000.00);          
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
   ...> VALUES(6,'Kim',22,'South-Hall',45000.00);
sqlite> INSERT INTO COMPANY values(7,'James',24,'Houston',10000.00);

然后设置输出格式,显示我们的表格信息:

sqlite> .header on
sqlite> .mode column
sqlite> SELECT * FROM COMPANY;  
ID          NAME        AGE         ADDRESS     SALARY    
----------  ----------  ----------  ----------  ----------
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   

表二

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

信息:

sqlite> INSERT INTO DEPARTMENT VALUES(1,'IT Billing', 1);
sqlite> INSERT INTO DEPARTMENT VALUES(2,'Engineering', 2);           
sqlite> INSERT INTO DEPARTMENT VALUES(3,'Finance', 7); 

显示表格信息:

sqlite> SELECT * FROM DEPARTMENT;
ID          DEPT        EMP_ID    
----------  ----------  ----------
1           IT Billing  1         
2           Engineerin  2         
3           Finance     7         
交叉连接——CROSS JOIN

交叉连接就是把第一个表的每一行与第二个表的每一行进行匹配,交叉连接有可能产生非常大的表,很少使用。

语法:

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

基于上面的表,写一个交叉连接:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

结果如下:

sqlite> SELECT EMP_ID,NAME,DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
EMP_ID      NAME        DEPT      
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineerin
7           Paul        Finance   
1           Allen       IT Billing
2           Allen       Engineerin
7           Allen       Finance   
1           Teddy       IT Billing
2           Teddy       Engineerin
7           Teddy       Finance   
1           Mark        IT Billing
2           Mark        Engineerin
7           Mark        Finance   
1           David       IT Billing
2           David       Engineerin
7           David       Finance   
1           Kim         IT Billing
2           Kim         Engineerin
7           Kim         Finance   
1           James       IT Billing
2           James       Engineerin
7           James       Finance   

不难发现,NAME是表一中的,EMP_ID和DEPT是表二中的,因此将表一每一行中的NAME与表二每一行的EMP_ID和DEPT进行匹配,即得出了交叉连接的结果表。

内连接——INNER JOIN

内连接根据条件结合两个表的列值来创建一个新的结果表,将表1的没一行和表2的每一行比较,满足条件则合并起来。

语法:

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

INNER关键字可选。

也可用USING表达式声明内连接条件:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

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

SELECT ... FROM table1 NATURAL JOIN table2...

现基于上面的表,写一个内连接的例子:

sqlite> SELECT EMP_ID,NAME,DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; 
EMP_ID      NAME        DEPT      
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
7           James       Finance   

这是根据表1的ID和表2的EMP_ID相等的行的结果表。

外连接——OUTER JOIN

SQL标准定义了三种类型的外连接,LEFT、RIGHT、FULL,但是SQLite只支持左外连接,即LEFT OUTER JOIN。

语法:

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

可用USING声明外连接条件:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

外连接的例子:

sqlite> SELECT EMP_ID,NAME,DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
EMP_ID      NAME        DEPT      
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
            Teddy                 
            Mark                  
            David                 
            Kim                   
7           James       Finance   

这里ID号不同的NAME也查找出来了,这就是外连接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值