@linux1s1s
2017-01-03T17:55:56.000000Z
字数 4426
阅读 1758
Base
2016-12
系列博文
Base Time-Http Protocol
Base Time-Bitmap
Base Time-Database
Base Time-Java
Base Time-Design Patterns
Base Time-Java Algorithms
本文主要介绍数据库的基础语句,以供备查。
下面将列出精简的SQL语句,如果想查看更多的SQL语句可以自行查看SQLite 教程
注意:SQL中不区分大小写,而一些语句做大小写区分主要是为了阅读方便。
我们先看个SQLite例子
create table student(
"+"id INTEGER PRIMARY KEY AUTOINCREMENT,"
+"name VARCHAR(20) NOT NULL,"
+"cid INTEGER,"
+"age INTEGER CHECK(age>18 and age<60),"
+"gender BIT DEFAULT(1),"
+"score REAL");
上面语句中的关键词解析如下:
数据类型
数据约束
主要SQL语句
我们知道数据库操作主要有增删改查,我们接下来简要回顾一下。
比如在前面的栗子中,创建了一个名为student
的表,该表如下所示:
id | name | cid | age | gender | score |
---|---|---|---|---|---|
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)
第一行,表示完整的插入一组数据。
第二行,表示指定列中插入数据。
INSERT INTO Persons VALUES('1001','zhangsan','xuhui','shanghai');
INSERT INTO Persons (LastName, Address) VALUES ('zhangsan', 'xuhui')
DELETE FROM 表名称
DELETE FROM 表名称 WHERE 列名=值
第一行,表示删除表中所有行。
第二行,表示删除表中指定的列。
DELETE FROM Persons
DELETE FROM Person WHERE LastName = 'zhansan'
UPDATE 表名称 SET 列名称=新值 WHERE 列名称=指定的列值
在满足条件的行中,更新该行指定的字段。
UPDATE Person SET FirstName='Fred' WHERE LastName='Wilson'
SELECT * FROM 表名 WHERE 条件子句 GROUP BY 分组字句 HAVING ... ORDER BY 排序子句 (顺序一定不能错)
SELECT * FROM person
SELECT * FROM person ORDER BY id DESC
SELECT name FROM person GROUP BY name HAVING count(*)>1
第一行,表示选择person表中的所有记录。
第二行,表示选择person表中的所有记录,以id降序排序。
第三行,表示选择person表中的name字段,并且name字段count大于1。
对于条件表达式,需要进一步补充如下:
SELECT*FROM Persons WHERE FirstName='Thomas'**AND** Lastname='Carter'
SELECT * FROM Persons WHERE firstName='Thomas'**OR** lastName='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR
FirstName='William')
AND LastName='Carter'
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
表示从Orders中选取Company,OrderNumber,以逆字母顺序显示公司名称,并以数字顺序显示顺序号
对于基础知识和如何进一步封装SQLite可以参考Android SQLite 封装初步一
对于增语句,有个地方需要特别说明一下
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('zhangsan', 26)");
db.close();
执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“zhangsan”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。
栗子如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"zhangsan", 26});
db.close();
上面简单的回顾了SQLite的语句,接下来简单了解一下在Android中如何操作。
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。
关于execSQL()方法的栗子可以参考上面,rawQuery()方法栗子如下:
SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery(“select * from person”, null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();
除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。
我们举个简单的栗子了解一下:
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
values.put("age", 26);
long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关
SQLiteDatabase db = databaseHelper.getWritableDatabase();
Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"zhangsan"}, null, null, "personid desc", "1,2");
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("person", "personid<?", new String[]{"2"});
db.close();
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(“name”, “zhangsan”);//key为字段名,value为值
db.update("person", values, "personid=?", new String[]{"1"});
db.close();