Android SQLite(一.簡介和常用語法)
一.簡介
SQLite是一個輕量級的資料庫,實現了自給自足的,無伺服器的,零配置的,事務性的SQL資料庫引擎。
二.基本SQL語法
SQLite 不區分大小寫,但有一些命令是大小寫敏感的,例如:GLOB和glob
1.資料型別
- 每個儲存在SQLite的值都屬於以下儲存類之一
儲存類 | 說明 |
---|---|
NULL | 值是一個NULL值 |
INTEGER | 值是一個帶符號的整數,根據值的大小儲存在1、2、3、4、6或8個位元組中 |
REAL | 值是一個浮點值,儲存為8位元組的IEEF浮點數 |
TEXT | 值是一個文字字串,使用資料庫編碼儲存 |
BLOB | 值是一個blob資料,完全根據它的輸入儲存 |
關於SQLite儲存型別和資料型別可以參考這篇文章: ofollow,noindex">SQLite剖析之資料型別
2.建立表和刪除表
-
建立表
CREATE TABLE 語句用於在任何給定的資料庫建立一個新表。建立新表,涉及到命名錶,定義列及每一列的資料型別和名稱
約束:限定資料列的規則
- NOT NULL :確保列不能有NULL值
- DEFAULT :當某列沒有指定值時,為該列提供預設值
- UNIQUE :確保某列中所有的值是不同的
- PRIMARY KEY :唯一標識資料庫表中的每一條記錄
- CHECK :CHECK約束確保某列中的所有值滿足一定條件
(設計表的時候,約束條件一定要設計好,不支援刪除約束和修改約束)
CRATE TABLE <TABBLENAME> ( column1 datatype, column2 datatype, ..... columnN datatype);
例項,建立一個Student表,ID作為主鍵,自增
CREATE TABLE student ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, gender TEXT, score INTEGER );
如下:成功在當前資料庫下建立一個名為student的表

- 刪除表
DROP TABLE <TABLENAME>
3.增刪改查
-
增
INSERT INTO語句用於向資料庫某個表中新增新的資料行
語法如下:
INSERT INTO <TABLENAME> (column1,column2,……columnN) VALUES (value1,value2,……valueN); //或者為表中所有列插入資料(順序和表保持一致) INSERT INTO <TABLENAME> VALUES(value1,value2,……valueN);
例項:
INSERT INTO student (name, score, age, gender) VALUES ("張三", 100, 20, "男");
結果如下:

-
刪
DELETE 語句用於刪除表中已有記錄。可以使用WHRER 字句指定刪除行,不然刪除所有的。
DELETE FROM <TABLENAME> WHERE<condition>;
例項:
有student表資料如下,現在刪除所有年齡大於20的資料

DELETE FROM student WHERE age >20;
結果如下:刪除了age大於20的資料

-
改
UPDATE 語句用於修改表中已有記錄。可以使用WHRER 字句指定修改行,不然修改所有行
UPDATE <TABLENAME> SET column1 = value1,column2 = value2,……columnN = valueN WHERE <condition>;
例項:
有student表資料如下,現在將所有學生分數小於90的男人變為女人(O(∩_∩)O)

UPDATE student SET gender = "女" WHERE score < 90;
結果如下:所有小於90分的都變成女人

-
查
SELECT 語句用於從表中獲取資料,以結果表的形式返回資料。
SELECT column1,column2,……columnN FROM <TABLENAME> WHERE <codition>; //或者查詢所有列的資料 SELECT * FROM <TABLENAME>
例項:
有student表資料如下,查詢年齡在20到22之間且分數大於60的資料,並按照成績升序排列

SELECT name, age, score FROM student WHERE age BETWEEN 20 AND 22 AND score > 60 ORDER BY score ASC
結果如下:

4 高階功能
高階功能很多了,篇幅有限,這裡只說三個Android中經常會用到的 修改表 , 多表查詢 和 子查詢
-
修改表
ALTER TABLE命令用來修改表。可以使用ALTER TABLE 命令來修改表名稱和在已存在的表中新增額外的列,除此之外ALTER TABLE 命令不支援其他操作。
語法如下:
//修改表名 ALTER TABLE <old_table_name> RENAME TO <new_table_name>; //新增欄位 ALTER TABLE <TABLENAME> ADD COLUMN culumanName dataType;
實列(改名很簡單不舉例了):
已用表student,欄位如下,先新增一個classId欄位

ALTER TABLE student ADD COLUMN classId INTEGER;
結果如下:在student表中新增了classId欄位列

-
多表查詢
JOIN子句用於結合兩個或多個數據庫中表的記錄。
-
交叉連線:CROSS JOIN
SELECT ... FROM table1 CROSS JOIN table2 ...;
-
內連線:INNER JOIN
SELECT ... FROM table1 INNER JOIN table2 ON condition;
如果多個表存在相同的欄位,可以簡化成如下語句
SELECT ... FROM table1 JOIN table2 USING(column1, ...);
NATURAL JOIN自動連線多表中的相同欄位相等值合併成一行
SELECT ... FROM table1 NATURAL JOIN table2 ... ;
-
外連線:OUTER JOIN
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON condition;
如果多個表的條件欄位相同,可以簡化為如下語句
SELECT ... FROm table1 LEFT OUTER JOIN table2 USING(column1, ...);
-
例項:有如下兩張表student和school,資料如下:

student表

school表
交叉連線:CROSS JOIN
交叉連線將所有連線的表內符合條件的行相乘,即如果是兩個表,表1符合條件的右X行,表2符合條件的有Y行,最後的查詢結果是X*Y行
如下:student表中classId=10001的有三行,school表沒有條件返回所有3行,最後結果會是9行資料:
SELECT student.classId as class ,name,monitor FROM student CROSS JOIN school WHERE class=10001;
結果如下:

內部連線:INNER JOIN
內部連線根據匹配條件的連線詞,篩選出匹配條件的行,然後將多表的內容合併為一行
如下:篩選出每個班的班長及其資訊,從上面表資料可知一共只有三個班每個班只能有一共monitor,所以最終篩選出三行資料
SELECT name, age, gender, score, stu.classId AS class, schoolNum, avgScore AS classAvgScore FROM student AS stu INNER JOIN school AS sch ON stu.classId = sch.classId AND stu.name = sch.monitor;
結果如下:

外部連線
外連線是內連線的擴充套件。SQLite只支援左外連線,可以簡寫成 LEFT JOIN
。
外連線的連線的方式和內連線相同,連接合並的方式也和內一樣,區別是不能符合連線條件的行的也會合並一起,之所以叫左為連線就是以左邊的錶行為基準,無法連線的列會展示NULL。
舉個栗子:
例1:上面的內連線的查詢改成左外連線,已知完全符合連線條件的有三行資料,但是左表共有10行資料都會合並,但是剩下的7條數,左表沒有的資料會展示成NULL
SELECT name, age, gender, score, stu.classId AS class, schoolNum, avgScore AS classAvgScore FROM student AS stu LEFT JOIN school AS sch ON stu.classId = sch.classId AND stu.name = sch.monitor;
結果如下:

例2:school表插入一行,如下

然後將例1的查詢語句左表換成school表,如下:
SELECT name, age, gender, score, stu.classId AS class, schoolNum, avgScore AS classAvgScore FROM school AS sch LEFT JOIN student AS stuON stu.classId = sch.classId AND stu.name = sch.monitor;
按照之前的結論,會根據左表產生4條資料,且第4條資料因為不匹配連線,座標沒有的欄位都一個是NULL值。看下結果如下,和之前總結的結論一致:

-
子查詢
子查詢又叫巢狀查詢,是將另一個SQLite查詢內嵌入WHERE子句中的查詢。
子查詢返回的資料將被用在主查詢中作為條件,以進一步限制要檢索的資料。
規則:
- 子查詢必須用括號括起來。
- 一般情況下子查詢在SELECT字句中只能用有一個列,除非在主查詢中有多列,與子查詢所選的列進行比較。
- OEDER BY 不能用在子查詢中,但可以使用GROUP BY。
- 子查詢返回多餘一行,只能以多值運算子一起使用,如IN運算子。
- BETWEEN運算子不能喝子查詢一起使用,但可以在子查詢中使用。
SELECT 語句中子查詢所有
語法:
SELECT column1, ... columnN FROM tableName WHERE column1 condition (SELECT column1, ... columnN FROMtableName WHERE ...)
示例:
已存在Student表,資料如下:

student表
查詢大於平均分數的學生,SQL如下
SELECT * FROM student WHERE score > (SELECT avg(score) FROM student);
結果如下:

INSERT中使用子查詢
語法:
INSERT INTO <tableName> (column1, ... columnN) SELECT *|column1, ... columnN FROM <tableName> WHERE ...;
示例:
現在有個name表,將上面的student表中name都插入到新表中,SQL如下
INSERT INTO name SELECT name FROM student;
結果:

UPDATE中使用子查詢
語法
UPDATE <tableName> SET columnName = columnValue WHERE<condition> (SELECT <column> FROM <tableName> WHERE ...);
示例:將Student表中小於平均分數學生的classId都變為10004
SQL如下:
UPDATE student SET classId = 10004 WHERE score < ( SELECT avg(score) FROM student );
結果:

原表資料

改變後表資料
DELETE中使用
語法:
DELETE FROM <tableName> WHERE <condition> (SELECT <column> FROM <tableName> WHERE ...);
示例:刪除小於平均分數的資料
SQL
DELETE FROM student WHERE score < ( SELECT avg(score) FROM student );
結果:
