zoukankan      html  css  js  c++  java
  • Sqlite常用命令及基本知识

     
     
    常用命令:
    .sqlite3 --从dos命令模式进入sqlite命令行
    .quit --退出sqlite命令行,回到dos命令
    .databases  --查看有哪些数据库
    .tables  --查看有哪些表
    .schema 表名 --查看指定的表的DDL(表结构)
     
    sqlite数据库中特殊的表    (系统自带表)sqlite_master
    select name from sqlite_master where type='table'; 

     字符串连接用 ||

    --sqlite中查找所有表对应的select count(*) 语句:

    select  'select count(*) from '||name||';' from sqlite_master where type='table';

     
    创建/打开指定名称的数据库 .sqlite3 test.db (dos命令行输入,有则打开指定名称的数据库,没有则创建指定名称的数据)
     
    导入数据: .read 数据文件(如 .read a.sql,数据库脚本文件放到数据库名.db相同路径下)

     
    删除数据库表  drop table actor(表名字);
     
     
    建表语句:
     
    --基本建表1
    CREATE TABLE employees (
        emp_no int(11) NOT NULL,
        birth_date date NOT NULL,
        first_name varchar(14) NOT NULL,
        last_name varchar(16) NOT NULL,
        gender char(1) NOT NULL,
        hire_date date NOT NULL,
        PRIMARY  KEY (emp_no)
    )
     
    --基本建表2
    CREATE TABLE actor (
        actor_id smallint(5) NOT NULL,
        first_name  varchar(45) NOT NULL,
        last_name varchar(45) NOT NULL,
        last_update  timestamp NOT NULL DEFAULT (datetime('now','localtime')),
        PRIMARY  KEY (actor_id)
    );
     
    --建表同时建索引
    CREATE TABLE salaries (
        emp_no int(11) NOT NULL,
        salary int(11) NOT NULL,
        from_date date NOT NULL,
        to_date date NOT NULL,
        PRIMARY  KEY (emp_no, from_date)
    );
    CREATE INDEX idx_emp_no ON salaries (emp_no);
     
    --如果表已经存在就不创建
    CREATE TABLE IF NOT EXISTS film (film_id smallint(5) NOT NULL);
     
    注意,对于已经建好的表,sqlite中不能通过Alter table 来添加外健。

    https://www.nowcoder.com/questionTerminal/aeaa116185f24f209ca4fa40e226de48

     
    --花式建表
    1.快速复制/备份一个表的数据
    create table actor_backup20180106 as select * from actor;
    注意:这种方式会把默认值、主键约束、NOT NULL等等这些给玩丢了。
    2.已知表A,并且已经有数据,创建表B,并且表B的字段都(或部分)来源于表A,并导入表A对应的数据
    解法1:
    CREATE TABLE actor_name (
        first_name  varchar(45) NOT NULL,
        last_name varchar(45) NOT NULL
    );
    insert into actor_name  select first_name, last_name from actor;
    解法2:
    create table actor_name as select first_name,last_name from actor;
    解法2更方便,但是会丢失Not Nul 主键等信息。
     
    --插入数据
    用inset into 表名 select插入子查询的结果集
    inset into 表名 values (....),(.....),(......)
    inset into 表名(字段1,字段2,字段3....)   values (....),(.....),(......)
     
    --插入单条数据
    INSERT INTO employees VALUES (1,datetime('1986-01-12 04:00'),'Luoke','Li','M',datetime('2010-01-12 04:00'));
    --批量插入数据(多条Insert)
    BEGIN TRANSACTION;
    INSERT INTO actor  VALUES (1,'PENELOPE','GUINESS',datetime('2006-02-15 12:34:33'));
    INSERT INTO actor  VALUES (2,'NICK','WAHLBERG',datetime('2006-02-15 12:34:33'));
    COMMIT;
     
    --用一条sql语句就批量插入多条数据-方法1
    INSERT INTO actor(actor_id,first_name,last_name,last_update)
    select 3,'Jones','Jim',datetime('2006-02-15 12:34:33')
    UNION ALL
    select 4,'DiLun','Bob',datetime('2006-02-15 12:34:33');
    --用一条sql语句就批量插入多条数据-方法2
    INSERT INTO actor values(5,'Luffy','MonkeyD',datetime('2006-02-15 12:34:33')),(6,'SuoLong','Luoluonua',datetime('2006-02-15 12:34:33'));
     
    --用一条sql语句就批量插入多条数据并且不要插入已存在的数据(不能用replace)--方法1
    INSERT INTO actor
    select 5,'Luffy','MonkeyD',datetime('2006-02-15 12:34:33') where not exists(select * from actor where actor_id=5);
    --用一条sql语句就批量插入多条数据并且不要插入已存在的数据(不能用replace)--方法2
    在 SQLite 中,用 INSERT OR IGNORE 来插入记录,或忽略插入与表内UNIQUE字段都相同的记录
    INSERT OR IGNORE INTO actor VALUES (3, 'ED', 'CHASE', '2006-02-15 12:34:33');
     
    用 INSERT OR REPLACE 来插入记录,或更新替代与表内UNIQUE字段都相同的记录
    INSERT OR REPLACE INTO actor VALUES (3, 'ED', 'CHASE', '2006-02-15 12:34:33')
     
    REPLACE   用法详解
     
     
    创建索引:
    CREATE UNIQUE INDEX uniq_idx_firstname on actor  (first_name); --创建唯一索引
    CREATE INDEX idx_lastname on actor  (last_name); --创建普通索引
     
    强制索引查询--SQLite中,使用 INDEXED BY 语句进行强制索引查询
    SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005
     
     
    创建视图:
    create view actor_name_view as select first_name as fist_name_v, last_name as last_name_v from actor;
    等价于
    CREATE VIEW actor_name_view (fist_name_v, last_name_v) AS  SELECT first_name, last_name FROM actor
     
    --日期时间
    select datetime('now','localtime'); --获取系统当前时间

    转义字符如:

    --' 默认情况下, '是字符串的边界符, 如果在字符串中包含', 则必须使用两个', 第1个'就是转义符

    select last_name||''''||first_name from employees;

    (或SELECT last_name || "'" || first_name FROM employees;)

    常用字符串函数:

    length  replace   substr

    replace函数的用法:replace('A','b','c') 用c替换字符串A中所有的b

    例子:

    select (length('10,A,B')-length(replace('10,A,B',",",""))/length(','));

    函数:substr(string string,num start,num length)用法:
    string为字符串;
    start为起始位置;字符串的第一个字符的位置为1,不是从0开始计算
    length为长度。

    /*例如:获取某个字符串中最后2个字母
    select substr('abcdefg',length('abcdefg')-1,2);*/

  • 相关阅读:
    vue脚手架搭建项目步骤(转载)
    使用css样式设置按钮禁用
    如何设置页面文本不可复制?
    System.IO.IOException:需要的特权不被客户端持有。
    vs中 git fetch与git pull的区别
    如何获取按钮开关选中的状态?
    Uncaught TypeError: XXX is not a function...
    解决bootstrap缩小布局会乱的问题,缩小一定程度后出现横向滚动条
    日期(年月日)与时间戳互转换
    Java中的Finally
  • 原文地址:https://www.cnblogs.com/happyWolf666/p/8232944.html
Copyright © 2011-2022 走看看