热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite必知必会————学习笔记

文章目录0背景1常识2SELECT语句2.0别名2.1筛选2.2函数2.3过滤分组3联结(最重要的特性)3.1完全限定名3.2笛卡尔积(叉


文章目录

  • 0 背景
  • 1 常识
  • 2 SELECT语句
    • 2.0 别名
    • 2.1 筛选
    • 2.2 函数
    • 2.3 过滤分组
  • 3 联结(最重要的特性)
    • 3.1 完全限定名
    • 3.2 笛卡尔积(叉联结)
    • 3.2,等值联结(内联结)
    • 3.3 自联结和子查询、自然联结
    • 3.4 外联结
    • 3.4 全联结(SQLite不支持)
  • 4 并/复合查询
    • 4.1 UNION(会自动去重)
    • 4.2 UNION ALL
  • 5 插入语句
    • 5.1 插入检索的数据
    • 5.2 从一个表复制到另一个表
  • 6 更新值
  • 7 删除值
    • 7.1 删除列值
    • 7.2 删除行值
    • 7.3 删除表
  • 8 创建表/更新表
  • 9 视图
  • 10 存储过程(SQLite不支持)
  • 11 事务
  • 12 游标/步骤(Step)
  • 13 约束
    • 13.1 主键
    • 13.2 外键
    • 13.3 唯一约束
  • 14 索引
  • 15 触发器(特殊的存储过程)
  • 16 安全性
  • 17 数据规范


0 背景

因为项目要涉及到大量的操作数据库的操作,所以要熟练掌握基本的SQL(Structured Query Language)语句。其实大二的时候,学校就开设有专门的数据库课程(使用的是SQL Server),但是没有好好的学习,学过后,又很少接触到涉及到这方面的项目,于是大部分知识都忘记了。这次就是通过再次系统的学习一遍SQL语句,捡起曾经学过的知识。由于项目用到的数据库为SQLite,本文就是这次学习SQLite的一个笔记,因此可能不适用于其他数据库。


1 常识


  • 1,数据库软件是指DBMS(Data base manager system),而数据库是指有组织的数据库容器(一个数据库文件或一组文件,如带有db后缀的数据库文件)
  • 2,市场上有很多数据库软件如SQL Server、Orccle、MySQL、MariaDB、PostgreSQL、SQLite等等,不同的数据库软件数据类型和名称是不同的,这就造成了SQL不兼容,我们学习的话一般可以学习ANSI SQL(美国标准学会SQL)的语法规范,然后再根据自己实际使用的数据库学习对应特有的语法(如存储过程SQLite就没有)
  • 3,一般使用全大写的书写SQL的关键词,对列名和表名使用小写,来让代码更易阅读和理解,虽然SQL不区分大小写

2 SELECT语句

SELECT 列名/(列名 ,COUNT(*) AS 别名)/(列名 || 拼接字符串) FROM 表名
WHERE 条件
GROUP BY 列名 HAVING COUNT(*) >/</>&#61;/<&#61;/!&#61;
LIMIT 显示的行数 OFFSET 从第几行显示的行数
ORDER BY 依据的排序的列 DESC(降序)/ASC(默认升序)

混淆点&#xff1a;


  • WHERE&#xff1a;过滤行&#xff0c;在分组前过滤&#xff1b;HAVING&#xff1a;过滤分组&#xff0c;在分组后过滤
  • GROUP BY:只能对选择的列和表达式使用&#xff0c;在有聚集函数的时候必须使用&#xff1b;ORDER BY&#xff1a;对非选择列也可以使用&#xff0c;对输出顺序排序&#xff08;GROUP BY不排序&#xff09;

2.0 别名

AS&#xff08;Oracle中不使用它&#xff0c;直接把取得名字用于表名和列名后&#xff09;
作用&#xff1a;给导出的列命名


2.1 筛选

WHERE&#xff1a;


  • 1

WHERE 条件 BETWEENAND

  • 2&#xff0c;

WHERE 条件 AND 条件

  • 3&#xff0c;
    • AND的优先级大于OR

WHERE 条件 OR 条件

  • 4&#xff0c;
    • OR与IN作用相等&#xff0c;一般推荐使用IN

WHERE 条件 IN(1、值2)

  • 5,

WHERE NOT 条件

  • 6&#xff0c;
    • 通配符
    • %&#xff1a;任何字符出现任何次数&#xff0c;但不匹配NULL
    • _:匹配单个字符
    • 不要过度使用通配符

WHERE 条件 LIKE

2.2 函数


  • 1&#xff0c;文本处理函数
    • 1,去空格
      RTRIM(去空格右边)&#xff0c;LIRIM(去空格左边)&#xff0c;TRIM&#xff08;去空格左右两边&#xff09;
    • 2&#xff0c;大小写转换
      UPPER&#xff08;转大写&#xff09;&#xff0c;LOWE&#xff08;将字符转转小写&#xff09;
    • 3&#xff0c;SOUNDEX
      将任何文串转换为其语音表示的字母数字模式的算法
  • 2&#xff0c;时间处理函数
    • 1 strftime(’%格式’&#xff0c; 列名)
      作用&#xff1a;根据第一个参数指定的格式字符串返回格式化的日期

时间格式&#xff1a;
%d 日期, 01-31
%f 小数形式的秒&#xff0c;SS.SSS
%H 小时, 00-23
%j 算出某一天是该年的第几天&#xff0c;001-366
%m 月份&#xff0c;00-12
%M 分钟, 00-59
%s 从197011日到现在的秒数
%S 秒, 00-59
%w 星期, 0-6 (0是星期天)
%W 算出某一天属于该年的第几周, 01-53
%Y 年, YYYY
%% 百分号

  • 2&#xff0c;返回时间

date(timestring, modifier, modifier, ...):以 YYYY-MM-DD 格式返回日期。
time(timestring, modifier, modifier, ...):以 HH:MM:SS 格式返回时间。
datetime(timestring, modifier, modifier, ...):以 YYYY-MM-DD HH:MM:SS 格式返回。
julianday(timestring, modifier, modifier, ...):这将返回从格林尼治时间的公元前 47141124 日正午算起的天数。

timestring:
在这里插入图片描述
修饰语&#xff08;modifier&#xff09;:

NNN daysNNN hoursNNN minutesNNN.NNNN secondsNNN monthsNNN yearsstart of monthstart of yearstart of dayweekday Nunixepochlocaltimeutc

示例&#xff1a;
计算本月最后一天&#xff1a;

SELECT date(&#39;now&#39;,&#39;start of month&#39;,&#39;&#43;1 month&#39;,&#39;-1 day&#39;);

由时间戳得到相对本地的日期&#xff1a;

SELECT datetime(1092941466, &#39;unixepoch&#39;, &#39;localtime&#39;);

由日期得到时间戳&#xff1a;

SELECT strftime(&#39;%s&#39;,&#39;now&#39;);

计算美国"独立宣言"签署以来的天数

SELECT julianday(&#39;now&#39;) - julianday(&#39;1776-07-04&#39;);

从 2004 年某一特定时刻以来的秒数&#xff1a;

SELECT strftime(&#39;%s&#39;,&#39;now&#39;) - strftime(&#39;%s&#39;,&#39;2004-01-01 02:34:56&#39;);

下面是计算当年 10 月的第一个星期二的日期&#xff1a;

SELECT date(&#39;now&#39;,&#39;start of year&#39;,&#39;&#43;9 months&#39;,&#39;weekday 2&#39;);

本小节的列子和图片摘自runoob网站


  • 3&#xff0c;数值处理函数
    ABS()绝对值、COS()余弦值、TAN()正切、SIN()正弦、EXP()返回一个数的指数、PI()返回圆周率、SQRT()一个数的平方根、

  • 4,聚集函数&#xff08;对某些列运行的并计算出一个值&#xff09;

  • AVG&#xff1a;某列平均值

  • COUNT&#xff1a;某列的行数

    • COUNT(*):对空值也计算
    • DISTINCT&#xff1a;只包含不同值&#xff1b;只能用于COUNT(),不用于CONT(*),必须使用列名;
      • SELECT AVG(DISTINCT price) AS avg_price FROM product WHERE id &#61; &#39;1&#39;
    • ALL&#xff1a;对所有行执行&#xff08;默认&#xff09;
  • MAX&#xff1a;某列的最大值

  • MIN&#xff1a;某列的最小值

  • SUM&#xff1a;某列之和


2.3 过滤分组


  • 1 GROUP BY&#xff08;分组&#xff09;
    将数据分为多个逻辑组&#xff0c;然后对每个组进行聚集计算
  • 2&#xff0c;HAVING&#xff08;过滤分组&#xff09;

3 联结&#xff08;最重要的特性&#xff09;


3.1 完全限定名

在使用列名的时候&#xff0c;指名表名&#xff0c;例如SELECT goods.id,price.id FROM goods,price&#xff0c;用于当两个表中有相同的列名时避免混淆&#xff1b;


3.2 笛卡尔积&#xff08;叉联结&#xff09;

返回两个第一个表的行数*第二个表的行数的检索列数
在这里插入图片描述


3.2,等值联结&#xff08;内联结&#xff09;

返回两个表得中的相等的值
在这里插入图片描述

SELECT name FROM students,teachers WHERE students.id &#61; teachers.id

等同于

SELECT name FROM students JOIN teachers ON students.id &#61; teachers.id

3.3 自联结和子查询、自然联结


  • 1&#xff0c;self-join&#xff08;不止一次使用相同的表&#xff09;
    例如&#xff1a;
    子联结&#xff1a;

SELECT id FROM students WHERE name &#61; (SELECT course FROM students WHERE &#61; &#39;math&#39;)

使用联结&#xff1a;

SELECT s1.id FROM students AS s1 ,students AS s2 WHERE s1.name &#61; s2.name AND s2.course &#61; &#39;math&#39;

一般使用联结要比使用子查询快许多


  • 2&#xff0c;nature join&#xff08;自然联结&#xff09;
    自动使用所有匹配的列名进行连接【未能证实&#xff1a;可以排除相同列的多次出现&#xff0c;使每一个列值返回一次
    要求两个表中要有相同的列名和属性值&#xff0c;否则返回笛卡尔积

SELECT C.*,O.* FROM Customers C NATURAL JOIN Orders O

3.4 外联结

下图是外联结中的左联结&#xff0c;SQLite中不支持右联结&#xff0c;但是只要挑换FROM或WHERE中的表顺序即可将左联结转为右联结。
在这里插入图片描述


3.4 全联结&#xff08;SQLite不支持&#xff09;

FULL OUTER JOIN&#xff1a;返回两个表中的所有行&#xff0c;并关联可以关联的行。


4 并/复合查询

对不同表或者一个表进行多次查询。


4.1 UNION&#xff08;会自动去重&#xff09;


  • 1&#xff0c;两条及以上的SELECT语句使用&#xff1b;
  • 2&#xff0c;每个查询包含相同的列表达式、聚集函数&#xff1b;
  • 3&#xff0c;只允许使用一条ORDER BY语句。

4.2 UNION ALL

不取消重复行&#xff0c;


5 插入语句

INSERT INTO/IGNORE 表名(列名) VALUES(1&#xff0c;值2&#xff0c;。。。)

IGNORE&#xff1a;如果中已经存在相同的记录&#xff0c;则忽略当前新数据&#xff0c;并忽略错误&#xff1b;INTO&#xff1a;如果有相同数据则报错


5.1 插入检索的数据

INSERT INTO 表名(列名) SELECT 列名 FROM 表名

5.2 从一个表复制到另一个表

SELECT 列名 INTO 表名 FROM 表名

DB2不支持上述语法

CREATE TABLE 表名 AS SELECT 列名 FROM 表名

6 更新值

更改值前&#xff0c;先用WHERE确定一遍WHERE过滤的值是否正确

UPDATE 表名 SET 列名 &#61;WHERE 过滤条件

7 删除值


7.1 删除列值

UPDATE 表名 SET 列名 &#61;WHERE 过滤条件

设值为NULL&#xff0c;即可删除列值


7.2 删除行值

删除行值&#xff1a;

DELETE FROM 表名 过滤条件

删除所有行一般使用&#xff1a;

TRUNCATE TABLE 表名

SQLite没有上述语法&#xff0c;一般使用DELETE FROM 表名


7.3 删除表

DROP TABLE 表名

8 创建表/更新表

创建表

CRETAE TABLE表名(列名 类型 是否为空 DEFAULT 默认值,...列名 类型 是否为空 DEFAULT 默认值)

更新表

ALTER TABLE 表名 (ADD 列名 属性)/(RENAME TO 新表名)

SQLite不支持ALTER TABLE定义主键和外键


9 视图

SQLite支持可读视图


  • 1&#xff0c; 把查询包装成一个虚拟表
  • 2&#xff0c;重用SQL语句&#xff0c;使用表的一部分&#xff0c;保护数据、更改数据格式和表示

创建视图&#xff1a;

CREATE VIEW 表名 AS 别名 语句

删除视图&#xff1a;

DROP VIEW 表名

10 存储过程&#xff08;SQLite不支持&#xff09;

关键词&#xff1a;PROCEDURE
作用&#xff1a;为以后使用而保存一条而多条SQL语句


11 事务

创建事务&#xff1a;

BEGIN TRANSACTION/BEGIN -- 开始事务
..事务
COMMIT/END TRANSACTION -- 提交

回退&#xff08;不能回退CRETAE、DROP、SELECT操作&#xff09;&#xff1a;

ROLLBACK;

保留点&#xff1a;事务处理的临时占位符&#xff0c;可对它发布回退


12 游标/步骤&#xff08;Step&#xff09;

作用&#xff1a;操作结果集的行
用于&#xff1a;


  • 1&#xff0c;滚动屏幕上的数据&#xff0c;并对数据左出游览或更改&#xff1b;
  • 2&#xff0c;一旦声明&#xff0c;就必须打开游标以供使用&#xff0c;结束使用时&#xff0c;必须关闭游标

13 约束

作用&#xff1a;管理插入或处理数据库的规则


13.1 主键


  • 1&#xff0c;任意两行的主键值不同
  • 2&#xff0c;每行只有一个主键且唯一&#xff0c;且不为NULL
  • 3&#xff0c;主键列不修改、不更新
  • 4&#xff0c;主键不重复
    关键词&#xff1a;PRIMARY KEY
    SQLite不允许使用ALTER TABLE定义主键

13.2 外键

含义&#xff1a;表中一列&#xff0c;其值为另一个表中的主键


  • 1&#xff0c;防止意外删除&#xff08;有些DBMS可用级联删除&#xff09;
    关键词&#xff1a;REFERENCES

13.3 唯一约束


  • 1&#xff0c;不能用于定义外键
  • 2&#xff0c;区别与外键&#xff0c;它可以是多个、可包含NULL、可修改、可更新、可重复使用
    关键词&#xff1a;UNIQUE

检查约束&#xff1a;CHECK


14 索引

作用&#xff1a;恰当的排序


  • 1&#xff0c;改善检查操作的性能&#xff0c;降低了数据插入、删除、修改的性能
  • 2&#xff0c;占用大量的存储空间
  • 3&#xff0c;尽量用于数据过滤或排序的列
  • 4&#xff0c;可在索引定义多个列
  • 5&#xff0c;定期检查索引并调整

15 触发器&#xff08;特殊的存储过程&#xff09;

作用&#xff1a; 在特定的数据活动发生时出发


  • 1&#xff0c;数据访问权&#xff1a;INSERT/UPDATE/DELETE 所有数据库
  • 2&#xff0c;常见用途&#xff1a;保证数据一致&#xff0c;基于表的变动在其他表执行活动&#xff0c;进行额外的验证并根据需要回退&#xff1b;计算值或更新时间戳

约束比出发器更快&#xff0c;应尽量使用约束

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN-- 触发器逻辑....
END;

event_name&#xff1a;INSERT/UPDATE 等


16 安全性

GRANT/REVOKE&#xff1a;管理访问


17 数据规范

字符串&#xff1a;


  • 1&#xff0c;变长性能远低于鼎昌的
  • 2&#xff0c;值在单引号内
  • 3&#xff0c;计算的值存在数据类型&#xff0c;否则存在字符串&#xff08;如0123&#xff0c;在数值中可能会丢值&#xff09;

数值类型&#xff1a;
货币&#xff1a;MONEY/CURRENY&#xff08;也定的取值范围DECIMAL可变浮点&#xff09;


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
author-avatar
blue薾孋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有