zoukankan      html  css  js  c++  java
  • 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语句需要同一个参数多次使用时,采用第二种方式就比较合适
    
    

  • 相关阅读:
    对两个有序数组进行合并
    连续子数组的最大和问题
    设计模式的学习
    Android基础总结(12)——XML和JSON解析
    Android基础总结(8)——服务
    x64 Assembly Tutorial 1 : Getting into x64 ASM from C++
    C# IL 指令集
    Unity3D教程宝典之地形
    Unity3D 动态改变地形 Unity3D Dynamic Change Terrain
    C#中String.format用法详解
  • 原文地址:https://www.cnblogs.com/Gaimo/p/15709054.html
Copyright © 2011-2022 走看看