SQL基础入门知识——牛客网数据库SQL实战

以下内容,是做牛客网数据库SQL实战过程中涉及到的sql知识点。
感兴趣可以去做一下:https://www.nowcoder.com/ta/sql

表table

创建表 create

create table 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(now())
);

插入一列 alter add

alter table actor add
create_date datetime not null default ‘0000-00-00 00:00:00’;

修改表名 alter rename

Alter table titles_test rename to titles_2017;
Rename table titles_test to titles_2017;

插入记录 insert into

insert into actor values
(1, ‘PENELOPE’, ‘GUINESS’, ‘2006-02-15 12:34:33’),
(2, ‘NICK’, ‘WAHLBERG’, ‘2006-02-15 12:34:33’),
(3, ‘ED’, ‘CHASE’, ‘2006-02-15 12:34:33’);

若重复则忽略插入 insert ignore into
insert ignore into actor VALUES
(3, ‘ED’, ‘CHASE’, ‘2006-02-15 12:34:33’);

删除记录 delete from

delete from actor where actor_id = ‘1’

修改记录 update set

update titles_test set
to_date = null,
from_date = ‘2001-01-01’
where to_date = ‘9999-01-01’
创建表,把另一表的值插入其中。
插入自查询的结果集。
create table actor_name(
first_name varchar(45) not null,
last_name varchar(45) not null
);
insert into actor_name(first_name, last_name)
select first_name, last_name from actor;

索引 index

创建索引 create

create index idx_emp_no on salaries(emp_no);

唯一索引
create unique index uniq_idx_firstname on actor(first_name);

普通索引
create index idx_lastname on actor(last_name);

使用强制索引
select * from salaries force index(idx_emp_no)
where emp_no = 21;

删除索引 drop

drop index uniq_idx_firstname on actor;
drop INDEX idx_lastname ON actor;

视图 view

创建试探 create

create view actor_name_view as
select first_name as first_name_v,
last_name as last_name_v from actor;

删除视图 drop

drop view actor_name_view;

触发器trigger

创建触发器 create

create trigger audit_log after insert
on employees_test for each row
begin
insert into audit values(new.id, new.name);
end;

删除触发器 drop

drop trigger audit_log

JOIN

INNER JOIN

两边表同时有对应的数据,即任何一边缺失数据就不显示。

LEFT JOIN

会读取左边数据表的全部数据,即便右边表无对应数据。

RIGHT JOIN

会读取右边数据表的全部数据,即便左边表无对应数据。

常见错误

错误1093

You can’t specify target table ‘titles_test’ for update in FROM clause
修改一个表的时候子查询不能是同一个表

如:
错误为:
delete from titles_test where id not in
(select min(id) from titles_test
group by emp_no);
正确为:
delete from titles_test where id not in
(select * from (select min(id) from titles_test
group by emp_no) as t1);

information_schema.tables

select concat('select count(*) from ', table_name, ‘;’) as cnts
from (select table_name from information_schema.tables
where table_schema = ‘my_test’) as new;

为了理解这一段查询,有以下几个知识点的拓展;

1)了解一下information_schema.tables的含义
参考简书:https://www.jianshu.com/p/3d2b5d86db7e

information_schema.tables视图
desc information_schema.TABLES
TABLE_SCHEMA ---->库名
TABLE_NAME ---->表名
ENGINE ---->引擎
TABLE_ROWS ---->表的行数
AVG_ROW_LENGTH ---->表中行的平均行(字节)
INDEX_LENGTH ---->索引的占用空间大小(字节)

2) 查询整个数据库中所有库和所对应的表信息
select table_schema, group_concat(table_name)
from information_schema.tables
group by table_schema;

3)查询my_test库中的表名
select table_name from information_schema.tables where table_schema = ‘my_test’;

分页查询 limit

比如下面的sql语句:
① select * from testtable limit 2,1;
② select * from testtable limit 2 offset 1;

注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据

这两个都是能完成需要,但是他们之间是有区别的:
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

exists 与 in

参考牛客网友评论

1) EXISTS

SELECT * FROM employees
WHERE NOT EXISTS (SELECT emp_no FROM dept_emp
WHERE employees.emp_no = dept_emp.emp_no);

2) IN
SELECT * FROM employees
WHERE emp_no NOT IN (SELECT emp_no
FROM dept_emp);

3)什么时候用EXISTS,什么时候用IN?

主表为employees,从表为dept_emp,在主表和从表都对关联的列emp_no建立索引的前提下:
当主表比从表大时,IN查询的效率较高;
当从表比主表大时,EXISTS查询的效率较高;

原因如下:
in是先执行子查询,得到一个结果集,将结果集代入外层谓词条件执行主查询,子查询只需要执行一次
exists是先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次

注意:使用exists内查询和外查询要关联起来

你可能感兴趣的:(数据分析实战)