sqlite语法

SQLite 语法大全 - SQLite 教程™语法是一组独特的规则和约定。 以下是 SQLite 的语法列表。 区分大小写: SQLite 不区分大小写。但是,有一些区分大小写的命令。例如:GLOB 和 glob 在 SQLit

 

语法是一组独特的规则和约定。 以下是 SQLite 的语法列表。

例子:

import sqlite3 # 导入数据库

# 连接数据库
conn = sqlite3.connect('example.db') 
# 创建一个cursor对象
c = conn.cursor()  
# 创建表,只需要创建一次,多次则报错
c.execute('''CREATE TABLE stocks(data text, trans text, symbol text, qty real, price real)''')  
# 插入一条记录
c.execute("INSERT INTO stocks VALUES('2021-11-17','BUY','RHAT',100,35.15)")  
# excute返回一个元组,可迭代
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
    print(row)
# 提交当前事务,保存数据,否则修改不生效
conn.commit() 
# 关闭数据库
conn.close()

 

增删改查

创建

import sqlite3

conn = sqlite3.connect("exercise.db") # 没有该数据库时会自己创建,多次创建报错
cur = conn.cursor()
sql = '''
        CREATE TABLE student_info
        (
            name text,
            age  int,
            id  int,
            address char(50),
            score real
        );
      '''
cur.execute(sql)
conn.commit()
conn.close()

增加

import sqlite3

conn = sqlite3.connect("exercise.db")
cur = conn.cursor()
sql = '''
        INSERT INTO student_info
        (name,age,id,address,score)
        VALUES
        ("学生2", 20, 201212670, "重庆市南岸区",90)
      '''
cur.execute(sql)
conn.commit()
conn.close()

增加多条

创建好的序列
import sqlite3

conn = sqlite3.connect("exercise.db")
cur = conn.cursor()
persons = [('ABC', 21, 201212634, "北京市朝阳区", 95),
           ('CLS', 21, 201212340, "长沙市雨花区", 90),
           ('SXA', 23, 202283194, "郴州市北湖区", 98)]
cur.executemany("INSERT INTO student_info VALUES(?,?,?,?,?)", persons)
conn.commit()
conn.close()

# 迭代器

import sqlite3
import string


# 使用yield语句的函数可以用来创建生成器对象
def char_generator():
for c in string.ascii_lowercase:
yield c,


# a = IterChar()
# for i in a:
# print(i)
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE characters(c)")
# 创建迭代器对象
theIter = char_generator()
# 插入记录,每次插入一个小写英文字母
cur.executemany("INSERT INTO characters(c) VALUES(?)", theIter)
# 读取并显示所有记录
cur.execute("SELECT c FROM characters")
print(cur.fetchall())

 

 

import sqlite3


# 自定义迭代器,按顺序生成小写字母
class IterChar:
def __init__(self):
self.count = ord('a')

def __iter__(self):
return self

def __next__(self):
if self.count > ord('z'):
raise StopIteration
self.count += 1
return chr(self.count - 1)


# a = IterChar()
# for i in a:
# print(i)
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE characters(c)")
# 创建迭代器对象
theIter = IterChar()
# 插入记录,每次插入一个小写英文字母
cur.executemany("INSERT INTO characters(c) VALUES(?)", theIter)
# 读取并显示所有记录
cur.execute("SELECT c FROM characters")
print(cur.fetchall())

删除

print('I just delete', cur.execute("DELETE FROM student_info WHERE name='ABC' OR name='CLS' OR name='SXA'").rowcount, 'rows')

 

cur.execute("SELECT * FROM student_info WHERE address='重庆市南岸区' ORDER BY age ")
print(cur.fetchall())

问号占位后,传入一个包含占位符对应元素的列表。如VALUES(?,?)对应’ALICE’和30,则列表为[‘ALICE’, 30]

使用变量名称作为占位符

import sqlite3

conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute('CREATE TABLE example(name, age)')
name_var = 'ALICE'
age_var = 30
cur.execute("INSERT INTO example VALUES(:name_var, :age_var)", {'name_var': name_var, 'age_var': age_var})
cur.execute("SELECT * FROM example")
print(cur.fetchall())

注意变量名称占位时,是”:varible“的形式。

变量名称占位后,传入一个字典,解释占位符对应的变量。

sqlite3.Row类


一般可以通过以下方法获得表里的数据

1.cur为sqlite3.Cursor对象,通过cur.execute()执行SELECT语句可以作为迭代器输出数据。

age_var = 20
cur.execute("SELECT * FROM student_info WHERE age=:age_var", {'age_var': age_var})
for row in cur:
print(row)

2.当执行完cur.execute()后,cur为一个迭代器,此时cur.fetchone()相当于一个next方法返回一个元组,cur.fetchall()返回一个包含所有元组的列表。

age_var = 20
cur.execute("SELECT * FROM student_info WHERE age=:age_var", {'age_var': age_var})
row = cur.fetchone()
print(row)

3.使用sqlite3.Row类后,cur为一个迭代器,此时cur.fetchone返回的是更高级的sqlite3.Row而不是元组。

import sqlite3

conn = sqlite3.connect(':memory:')
conn.row_factory = sqlite3.Row # 使用更高级的sqlite3.Row类,而不是python的元组
c = conn.cursor()
c.execute('''CREATE TABLE stocks(data text, trans text, symbol text, qty real, price real)''')
c.execute("INSERT INTO stocks VALUES('2021-11-17','BUY','RHAT',100,35.15)")
c.execute("SELECT * FROM stocks")
r = c.fetchone()
print(type(r)) # <class 'sqlite3.Row'>
print(tuple(r)) # ('2021-11-17', 'BUY', 'RHAT', 100.0, 35.15)
print(r[2]) # RHAT
print(r.keys()) # ['data', 'trans', 'symbol', 'qty', 'price']
print(r['qty']) # 100.0
for field in r: # 可迭代
print(field)

相较于元组,sqlite3.Row支持:

使用keys()输出表的键
按key输出数据,如r[‘qty’]
————————————————

区分大小写:

 

  • SQLite 不区分大小写。但是,有一些区分大小写的命令。例如:GLOBglob在 SQLite 语句中有不同的含义。

 

注释:

 

  • 注释用于在 SQLite 代码中增加代码的可读性。
  • 注释不能嵌套。
  • 注释以两个连续的 “ - ” 字符。
  • 也可使用 “/*” 字符开始,并延伸至下一个 “*/” 字符对所包括的内容视为注释。

 

SQLite 语句

 

所有的 SQLite 语句都是以关键字 (如:SELECTINSERTUPDATEDELETEALTERDROP等) 开始的。所有语句都以分号 (;) 结尾。

 

SQLite ANALYZE 语句的语法:

 

ANALYZE;  

ANALYZE database_name;  

ANALYZE database_name.table_name;

 

SQLite AND/OR 子句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  CONDITION-1 {AND|OR} CONDITION-2;

 

SQLite ALTER TABLE 语句的语法

 

ALTER TABLE table_name ADD COLUMN column_def...;

 

SQLite ALTER TABLE 语句 (Rename) 语句的语法

 

ALTER TABLE table_name RENAME TO new_table_name;

 

SQLite ATTACH DATABASE 语句的语法:

 

ATTACH DATABASE 'DatabaseName' As 'Alias-Name';

 

SQLite BEGIN TRANSACTION 语句的语法:

 

BEGIN;  

BEGIN EXCLUSIVE TRANSACTION;

 

SQLite BETWEEN 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name BETWEEN val-1 AND val-2;  
SQLite COMMIT Statement:  
COMMIT;

 

SQLite CREATE INDEX 语句的语法:

 

CREATE INDEX index_name  
ON table_name ( column_name COLLATE NOCASE );

 

SQLite CREATE UNIQUE INDEX 语句的语法:

 

CREATE UNIQUE INDEX index_name  
ON table_name ( column1, column2,...columnN);

 

SQLite CREATE TABLE 语句的语法:

 

CREATE TABLE table_name(  
   column1 datatype,  
   column2 datatype,  
   column3 datatype,  
   .....  
   columnN datatype,  
   PRIMARY KEY( one or more columns ));

 

SQLite CREATE TRIGGER 语句的语法:

 

CREATE TRIGGER database_name.trigger_name   
BEFORE INSERT ON table_name FOR EACH ROW  
BEGIN   
   stmt1;   
   stmt2;  
   ....  
END;

 

SQLite CREATE VIEW 语句的语法:

 

CREATE VIEW database_name.view_name  AS  
SELECT statement....;

 

SQLite CREATE VIRTUAL TABLE 语句的语法:

 

CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log );  

CREATE VIRTUAL TABLE database_name.table_name USING fts3( );

 

SQLite COMMIT TRANSACTION 语句的语法:

 

COMMIT;

 

SQLite COUNT 语句的语法:

 

SELECT COUNT(column_name)  
FROM   table_name  
WHERE  CONDITION;

 

SQLite DELETE 语句的语法:

 

DELETE FROM table_name  
WHERE  {CONDITION};

 

SQLite DETACH DATABASE 语句的语法:

 

DETACH DATABASE 'Alias-Name';

 

SQLite DISTINCT 语句的语法:

 

SELECT DISTINCT column1, column2....columnN  
FROM   table_name;

 

SQLite DROP INDEX 语句的语法:

 

DROP INDEX database_name.index_name;

 

SQLite DROP TABLE 语句的语法:

 

DROP TABLE database_name.table_name;

 

SQLite DROP VIEW 语句的语法:

 

DROP INDEX database_name.view_name;

 

SQLite DROP TRIGGER 语句的语法:

 

DROP INDEX database_name.trigger_name;

 

SQLite EXISTS 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name EXISTS (SELECT * FROM   table_name );

 

SQLite EXPLAIN 语句的语法:

 

EXPLAIN INSERT statement...;  

EXPLAIN QUERY PLAN SELECT statement...;

 

SQLite GLOB 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name GLOB { PATTERN };

 

SQLite GROUP BY 语句的语法:

 

SELECT SUM(column_name)  
FROM   table_name  
WHERE  CONDITION  
GROUP BY column_name;

 

SQLite HAVING 语句的语法:

 

SELECT SUM(column_name)  
FROM   table_name  
WHERE  CONDITION  
GROUP BY column_name  
HAVING (arithematic function condition);

 

SQLite INSERT INTO 语句的语法:

 

INSERT INTO table_name( column1, column2....columnN)  
VALUES ( value1, value2....valueN);

 

SQLite IN 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name IN (val-1, val-2,...val-N);

 

SQLite Like 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name LIKE { PATTERN };

 

SQLite NOT IN 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  column_name NOT IN (val-1, val-2,...val-N);

 

SQLite ORDER BY 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name  
WHERE  CONDITION  
ORDER BY column_name {ASC|DESC};

 

SQLite PRAGMA 语句的语法:

 

PRAGMA pragma_name;

 

有关pragma的几个示例:

 

PRAGMA page_size;  
PRAGMA cache_size = 1024;  
PRAGMA table_info(table_name);

 

SQLite RELEASE SAVEPOINT 语句的语法:

 

RELEASE savepoint_name;

 

SQLite REINDEX 语句的语法:

 

REINDEX collation_name;  
REINDEX database_name.index_name;  
REINDEX database_name.table_name;

 

SQLite ROLLBACK 语句的语法:

 

ROLLBACK;  

ROLLBACK TO SAVEPOINT savepoint_name;

 

SQLite SAVEPOINT 语句的语法:

 

SAVEPOINT savepoint_name;

 

SQLite SELECT 语句的语法:

 

SELECT column1, column2....columnN  
FROM   table_name;

 

SQLite UPDATE 语句的语法:

 

UPDATE table_name  
SET column1 = value1, column2 = value2....columnN=valueN  
[ WHERE  CONDITION ];

 

SQLite VACUUM 语句的语法:

 

VACUUM;  
SQLite WHERE Clause:  
SELECT column1, column2....columnN  
FROM   table_name  
WHERE  CONDITION;
SQLite 占位符 语句的语法:
 
使用 execute 方法执行一条SQL语句,如果带有参数可以使用占位符来传递参数。使用占位符已经考虑到转码的问题,不需要自己单独处理。不用去管 SQL 注入的问题。不过占位符只是针对value,不能用于设置表名,字段等。
SQLite3支持两种占位符:问号占位符和命名占位符。

问号占位符
采用问号作为占位符,参数为元组形式。例如:

cur.execute("insert into people values (?, ?)", (who, age))
命名占位符
采用冒号加 key 的形式作为占位符,参数为字典形式。例如:

cur.execute("select * from people where name=:who and age=:age", 
            {"who": who, "age": age})
使用说明
一般来话,第一种方式比较方便,也比较常见。但是如果在执行sql语句需要同一个参数多次使用时,采用第二种方式就比较合适



 

 

posted @ 2021-12-19 22:57  游走De提莫  阅读(592)  评论(0编辑  收藏  举报