sqlite insert 数据对象_数据科学—数据库常见基本操作【示例】

7c83e623be15e2cef16cadf6e068926a.gif点击蓝字关注我们

AI研习图书馆,发现不一样的精彩世界

数据科学

1. 创建表

CREATE TABLE

CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,first_name varchar(45) NOT NULL,last_name varchar(45) NOT NULL,last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))

2. 创建视图

语法:

CREATE [TEMP | TEMPORARY] VIEW view_name ASSELECT column1, column2..... FROM table_nameWHERE [condition]

举例:

CREATE VIEW actor_name_view ASSELECT first_name first_name_v ,last_name last_name_vFROM  actor;

3. 创建索引

创建普通索引语法为:

CREATE INDEX index_nameON table_name (column_name);

创建唯一索引语法为:

CREATE UNIQUE INDEX index_nameon table_name (column_name);

举例:

CREATE UNIQUE INDEX uniq_idx_firstname on actor (first_name);CREATE INDEX idx_lastname ON actor (last_name);

4. 索引查询

MYSQL中强制索引查询使用:FORCE INDEX(indexname)

SQLite中强制索引查询使用:INDEXED BY indexname

在SQLite中:
SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005

在Mysql中:

create index idx_emp_no on salaries(emp_no);select * from salaries FORCE INDEX (idx_emp_no) where emp_no = 10005;

解题思路:先创建索引,再创建强制索引查询。索引名一定要加括号,否则错误。

5. 修改表

SQLite中修改表的语法为:
CREATE [TEMP|TEMPORARY] TABLE table_name (column_definitions [, constraints]);
注:竖线表示多选一, 用 TEMP 或 TEMPORARY 保留字声明的表为临时表,只存活于当前会话,一旦连接断开, 就会被自动删除。

参考此语法,示例为:

ALTER TABLE actor ADD create_date datetime NOT NULL DEFAULT('0000-00-00 00:00:00');-- 插入列用 alter table  add-- 插入行用 insert into table   values

6. 创建触发器

在MySQL中,创建触发器语法如下:
CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_nameFOR EACH ROWtrigger_stmt
其中:
  • trigger_name:标识触发器名称,用户自行指定

  • trigger_time:标识触发时机,取值为 BEFORE 或 AFTER

  • trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE

  • tbl_name:标识建立触发器的表名,即在哪张表上建立触发器

  • trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾

【NEW 与 OLD 详解】

MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。

具体地:

  • 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据
  • 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据
  • 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据

使用方法:NEW.columnName (columnName 为相应数据表某一列名)

示例代码:

构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。

CREATE TABLE employees_test(ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INT NOT NULL,ADDRESS CHAR(50),SALARY REAL);CREATE TABLE audit(EMP_no INT NOT NULL,NAME TEXT NOT NULL);
create trigger audit_log after insert on employees_testbegin     insert into audit values(new.id,new.name);end
构造触发器时注意以下几点:
  • create trigger :创建触发器
  • 触发器要说明是在after 还是before事务发生时触发
  • 要指明是insert 、delete、update操作

  • on 表名
  • begin和end之间写触发的动作
  • new 关键字表示更新后的表的字段 ,old表示更新前的表的字段 

7. 创建外键约束

CREATE TABLE employees_test(ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INT NOT NULL,ADDRESS CHAR(50),SALARY REAL);CREATE TABLE audit(EMP_no INT NOT NULL,create_date datetime NOT NULL);

在audit表上创建外键约束,其emp_no对应employees_test表的主键id。

MySQL:

alter table auditadd  foreign key(emp_no) references employees_test(id)

SQLite:

只能首先删除表,然后再新建表的时候添加外键约束

DROP TABLE audit;CREATE TABLE audit(    EMP_no INT NOT NULL,    create_date datetime NOT NULL,    FOREIGN KEY(EMP_no) REFERENCES employees_test(ID));

8. 更新表

将获取奖金的员工当前的(salaries.to_date='9999-01-01')薪水增加10%
UPDATE salaries SET salary=salary*1.1WHERE emp_no IN (SELECT emp_no FROM emp_bonus)AND to_date='9999-01-01';
使用 UPDATE ... SET ... WHERE ... IN ... 语句来更新表中数据

9. 查看当前数据库中所有表

MySQL中,把information_schema看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。TABLES表:提供了关于数据库中的表的信息(包括视图)。

#MySQL查看当前数据库中所有表SELECT    concat('SELECT COUNT(*) FROM ',table_name,' ;' ) AS cntsFROM    information_schema.TABLES WHERE    table_schema = (SELECT DATABASE())
SQLite中,sqlite_master表是SQLite的系统表。==该表记录该数据库==中保存的表、索引、视图、和触发器信息。每一行记录一个项目。在创建一个SQLIte数据库的时候,该表会自动创建。sqlite_master表包含5列。
  • type列记录了项目的类型,如table、index、view、trigger
  • name列记录了项目的名称,如表名、索引名等

  • tbl_name列记录所从属的表名,如索引所在的表名。

  • rootpage列记录项目在数据库页中存储的编号。对于视图和触发器,该列值为0或者NULL
  • sql列记录创建该项目的SQL语句

--SQLite查看当前数据库中所有表select "select count(*) from "||name||";" as cnts from sqlite_masterwhere type='table'

10. 分组

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
SELECT title,COUNT(*) as t FROM(SELECT DISTINCT emp_no,title    FROM titles    )GROUP BY titleHAVING COUNT(*)>=2;

注:使用到count,distinct,group by,having,注意理解

更多数据库相关知识,敬请期待~~

3c477b247d5cad95d3c891993047e5f1.png点击"在看"了解更多精彩内容e56602b7104a283e168ef390655c6071.pngb84b065079fcbc803b30717b69a9325e.png点赞是一种鼓励 分享是一种动力

关注AI研习图书馆,发现不一样的精彩世界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值