
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 包含的多条语句,每条语句结束要分号结尾
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,注意理解
更多数据库相关知识,敬请期待~~



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