[关闭]
@linux1s1s 2017-01-03T17:55:56.000000Z 字数 4426 阅读 1758

Base Time-Database

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 教程

SQLite基础数据

注意:SQL中不区分大小写,而一些语句做大小写区分主要是为了阅读方便。

我们先看个SQLite例子

  1. create table student(
  2. "+"id INTEGER PRIMARY KEY AUTOINCREMENT,"
  3. +"name VARCHAR(20) NOT NULL,"
  4. +"cid INTEGER,"
  5. +"age INTEGER CHECK(age>18 and age<60),"
  6. +"gender BIT DEFAULT(1),"
  7. +"score REAL");

上面语句中的关键词解析如下:

  1. 数据类型

    • null:空值相当于java中的null
    • integer:带符号的整型,相当于java中的int
    • real:浮点数字,相当于java中的float/double
    • text/varchar:字符串文本,相当于java中的String
    • blob:二进制对象,相当于java中的byte数组,用于存放图
  2. 数据约束

    • NOT NULL : 非空
    • UNIQUE : 唯一
    • PRIMARY : 主键
    • CHECK:条件检查
    • DEFAULT:默认
  3. 主要SQL语句

    • CREATE DATABASE - 创建新数据库
    • ALTER DATABASE - 修改数据库
    • CREATE TABLE - 创建新表
    • ALTER TABLE - 变更(改变)数据库表
    • DROP TABLE - 删除表
    • CREATE INDEX - 创建索引(搜索键)
    • DROP INDEX - 删除索引

我们知道数据库操作主要有增删改查,我们接下来简要回顾一下。

创建

比如在前面的栗子中,创建了一个名为student的表,该表如下所示:

id name cid age gender score

INSERT INTO(增)

语法

  1. INSERT INTO 表名称 VALUES (值1, 2,....)
  2. INSERT INTO 表名称 (列1, 2,...) VALUES (值1, 2,....)

第一行,表示完整的插入一组数据。
第二行,表示指定列中插入数据。

栗子

  1. INSERT INTO Persons VALUES('1001','zhangsan','xuhui','shanghai');
  2. INSERT INTO Persons (LastName, Address) VALUES ('zhangsan', 'xuhui')

DELETE (删)

语法

  1. DELETE FROM 表名称
  2. DELETE FROM 表名称 WHERE 列名=值

第一行,表示删除表中所有行。
第二行,表示删除表中指定的列。

栗子

  1. DELETE FROM Persons
  2. DELETE FROM Person WHERE LastName = 'zhansan'

UPDATE (改)

语法

  1. UPDATE 表名称 SET 列名称=新值 WHERE 列名称=指定的列值

在满足条件的行中,更新该行指定的字段。

栗子

  1. UPDATE Person SET FirstName='Fred' WHERE LastName='Wilson'

SELECT (查)

语法

  1. SELECT * FROM 表名 WHERE 条件子句 GROUP BY 分组字句 HAVING ... ORDER BY 排序子句 (顺序一定不能错)

栗子

  1. SELECT * FROM person
  2. SELECT * FROM person ORDER BY id DESC
  3. SELECT name FROM person GROUP BY name HAVING count(*)>1

第一行,表示选择person表中的所有记录。
第二行,表示选择person表中的所有记录,以id降序排序。
第三行,表示选择person表中的name字段,并且name字段count大于1。

对于条件表达式,需要进一步补充如下:

AND & OR 运算符
  1. SELECT*FROM Persons WHERE FirstName='Thomas'**AND** Lastname='Carter'
  2. SELECT * FROM Persons WHERE firstName='Thomas'**OR** lastName='Carter'
  3. SELECT * FROM Persons WHERE (FirstName='Thomas' OR
  4. FirstName='William')
  5. AND LastName='Carter'

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

ORDER BY 子句
  1. SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

表示从Orders中选取Company,OrderNumber,以逆字母顺序显示公司名称,并以数字顺序显示顺序号

对于基础知识和如何进一步封装SQLite可以参考Android SQLite 封装初步一

对于增语句,有个地方需要特别说明一下

  1. SQLiteDatabase db = ....;
  2. db.execSQL("insert into person(name, age) values('zhangsan', 26)");
  3. db.close();

执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“zhangsan”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。

栗子如下:

  1. SQLiteDatabase db = ....;
  2. db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"zhangsan", 26});
  3. db.close();

Android SQLite

上面简单的回顾了SQLite的语句,接下来简单了解一下在Android中如何操作。

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。

关于execSQL()方法的栗子可以参考上面,rawQuery()方法栗子如下:

  1. SQLiteDatabase db = ....;
  2. Cursor cursor = db.rawQuery(“select * from person”, null);
  3. while (cursor.moveToNext()) {
  4. int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
  5. String name = cursor.getString(1);//获取第二列的值
  6. int age = cursor.getInt(2);//获取第三列的值
  7. }
  8. cursor.close();
  9. db.close();

除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。

我们举个简单的栗子了解一下:

insert()方法

  1. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  2. ContentValues values = new ContentValues();
  3. values.put("name", "zhangsan");
  4. values.put("age", 26);
  5. long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关

query()方法

  1. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  2. Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"zhangsan"}, null, null, "personid desc", "1,2");
  3. while (cursor.moveToNext()) {
  4. int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
  5. String name = cursor.getString(1);//获取第二列的值
  6. int age = cursor.getInt(2);//获取第三列的值
  7. }
  8. cursor.close();
  9. db.close();

delete()方法

  1. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  2. db.delete("person", "personid<?", new String[]{"2"});
  3. db.close();

update()方法

  1. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  2. ContentValues values = new ContentValues();
  3. values.put(“name”, zhangsan”);//key为字段名,value为值
  4. db.update("person", values, "personid=?", new String[]{"1"});
  5. db.close();

参考文章:
Android学习之SQL基础使用
android之存储篇SQLite数据库让你彻底学会SQLite的使用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注