因为项目要涉及到大量的操作数据库的操作,所以要熟练掌握基本的SQL(Structured Query Language)语句。其实大二的时候,学校就开设有专门的数据库课程(使用的是SQL Server),但是没有好好的学习,学过后,又很少接触到涉及到这方面的项目,于是大部分知识都忘记了。这次就是通过再次系统的学习一遍SQL语句,捡起曾经学过的知识。由于项目用到的数据库为SQLite,本文就是这次学习SQLite的一个笔记,因此可能不适用于其他数据库。
SELECT 列名/(列名 ,COUNT(*) AS 别名)/(列名 || 拼接字符串) FROM 表名
WHERE 条件
GROUP BY 列名 HAVING COUNT(*) >/</>&#61;/<&#61;/!&#61; 值
LIMIT 显示的行数 OFFSET 从第几行显示的行数
ORDER BY 依据的排序的列 DESC(降序)/ASC(默认升序)
混淆点&#xff1a;
AS&#xff08;Oracle中不使用它&#xff0c;直接把取得名字用于表名和列名后&#xff09;
作用&#xff1a;给导出的列命名
WHERE&#xff1a;
WHERE 条件 BETWEEN 值 AND 值
WHERE 条件 AND 条件
WHERE 条件 OR 条件
WHERE 条件 IN(值1、值2)
WHERE NOT 条件
WHERE 条件 LIKE 值
时间格式&#xff1a;
%d 日期, 01-31
%f 小数形式的秒&#xff0c;SS.SSS
%H 小时, 00-23
%j 算出某一天是该年的第几天&#xff0c;001-366
%m 月份&#xff0c;00-12
%M 分钟, 00-59
%s 从1970年1月1日到现在的秒数
%S 秒, 00-59
%w 星期, 0-6 (0是星期天)
%W 算出某一天属于该年的第几周, 01-53
%Y 年, YYYY
%% 百分号
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, ...):这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。
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;某列的行数
SELECT AVG(DISTINCT price) AS avg_price FROM product WHERE id &#61; &#39;1&#39;
MAX&#xff1a;某列的最大值
MIN&#xff1a;某列的最小值
SUM&#xff1a;某列之和
在使用列名的时候&#xff0c;指名表名&#xff0c;例如SELECT goods.id,price.id FROM goods,price
&#xff0c;用于当两个表中有相同的列名时避免混淆&#xff1b;
返回两个第一个表的行数*第二个表的行数的检索列数
返回两个表得中的相等的值
SELECT name FROM students,teachers WHERE students.id &#61; teachers.id
等同于
SELECT name FROM students JOIN teachers ON students.id &#61; teachers.id
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;
一般使用联结要比使用子查询快许多
SELECT C.*,O.* FROM Customers C NATURAL JOIN Orders O
下图是外联结中的左联结&#xff0c;SQLite中不支持右联结&#xff0c;但是只要挑换FROM或WHERE中的表顺序即可将左联结转为右联结。
FULL OUTER JOIN&#xff1a;返回两个表中的所有行&#xff0c;并关联可以关联的行。
对不同表或者一个表进行多次查询。
不取消重复行&#xff0c;
INSERT INTO/IGNORE 表名(列名) VALUES(值1&#xff0c;值2&#xff0c;。。。)
IGNORE&#xff1a;如果中已经存在相同的记录&#xff0c;则忽略当前新数据&#xff0c;并忽略错误&#xff1b;INTO&#xff1a;如果有相同数据则报错
INSERT INTO 表名(列名) SELECT 列名 FROM 表名
SELECT 列名 INTO 表名 FROM 表名
DB2不支持上述语法
CREATE TABLE 表名 AS SELECT 列名 FROM 表名
更改值前&#xff0c;先用WHERE确定一遍WHERE过滤的值是否正确
UPDATE 表名 SET 列名 &#61; 值 WHERE 过滤条件
UPDATE 表名 SET 列名 &#61; 值 WHERE 过滤条件
设值为NULL&#xff0c;即可删除列值
删除行值&#xff1a;
DELETE FROM 表名 过滤条件
删除所有行一般使用&#xff1a;
TRUNCATE TABLE 表名
SQLite没有上述语法&#xff0c;一般使用DELETE FROM 表名
DROP TABLE 表名
创建表
CRETAE TABLE表名(列名 类型 是否为空 DEFAULT 默认值,...列名 类型 是否为空 DEFAULT 默认值)
更新表
ALTER TABLE 表名 (ADD 列名 属性)/(RENAME TO 新表名)
SQLite不支持ALTER TABLE定义主键和外键
SQLite支持可读视图
创建视图&#xff1a;
CREATE VIEW 表名 AS 别名 语句
删除视图&#xff1a;
DROP VIEW 表名
关键词&#xff1a;PROCEDURE
作用&#xff1a;为以后使用而保存一条而多条SQL语句
创建事务&#xff1a;
BEGIN TRANSACTION/BEGIN -- 开始事务
..事务
COMMIT/END TRANSACTION -- 提交
回退&#xff08;不能回退CRETAE、DROP、SELECT操作&#xff09;&#xff1a;
ROLLBACK;
保留点&#xff1a;事务处理的临时占位符&#xff0c;可对它发布回退
作用&#xff1a;操作结果集的行
用于&#xff1a;
作用&#xff1a;管理插入或处理数据库的规则
含义&#xff1a;表中一列&#xff0c;其值为另一个表中的主键
检查约束&#xff1a;CHECK
作用&#xff1a;恰当的排序
作用&#xff1a; 在特定的数据活动发生时出发
约束比出发器更快&#xff0c;应尽量使用约束
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN-- 触发器逻辑....
END;
event_name&#xff1a;INSERT/UPDATE 等
GRANT/REVOKE&#xff1a;管理访问
字符串&#xff1a;
数值类型&#xff1a;
货币&#xff1a;MONEY/CURRENY&#xff08;也定的取值范围DECIMAL可变浮点&#xff09;