SQL注意点

1、‘group by’应该放在‘where...and...’后面。

2、‘having’放在‘group by’后面和‘order by ’前面。(如果having后的条件与group by 的有关,只能用2,先group by 再having.

不能就可以用1,先where指明条件再group by 分组统计)

3、limit 0,1 从你的表中的第0个数据开始,只读取一个。(可以实现输出XX排名第几的项)

4、from 表1,表2  where 表1.xx = 表2.xx(连接条件)

5、from 表1  join 表2 on 表1.xx = 表2.xx(连接条件)【区分4和5】

6、可以将满足某条件的数据select出来作为一张表,再跟原有的表join

7、不同数据库连接字符串的方法不完全相同,MySQL、SQL Server、Oracle等数据库支持CONCAT方法,而本题所用的SQLite数据库只支持用连接符号"||"来连接字符串

SELECT last_name||" "||first_name AS Name FROM employees

即使将last_name 和first_name 连接起来,中间以空格隔开,最后作为Name

扫描二维码关注公众号,回复: 5394738 查看本文章

8、最后更新时间,默认是系统时间

last_update timestamp not null default (datetime('now','localtime')) 

9、对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作

因为题目判定系统使用的是sqlite3,所以必须按sqlite3的写法来做,

1

2

insert or ignore into actor

values(3,'ED','CHASE','2006-02-15 12:34:33');


如果是mysql,那么把or去掉,像下面这样:

1

2

insert IGNORE into actor

values(3,'ED','CHASE','2006-02-15 12:34:33');

两种数据库还是有区别的。

10、创建索引

根据题意,本题要用两条语句完成,先用 CREATE UNIQUE INDEX ... ON ... 对first_name创建唯一索引值,再用 CREATE INDEX ... ON ... 对last_name创建普通索引值

1

2

CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);

CREATE INDEX idx_lastname ON actor(last_name);

11、创建视图

题目描述

针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
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')))

代码:

create view actor_name_view (first_name_v,last_name_v) as

select first_name,last_name from actor

12、强制索引

题目描述

针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。
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);

解析:

SQLite中,使用 INDEXED BY 语句进行强制索引查询,可参考:

http://www.runoob.com/sqlite/sqlite-indexed-by.html

1

SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005

MySQL中,使用 FORCE INDEX 语句进行强制索引查询,可参考:

http://www.jb51.net/article/49807.htm

1

SELECT * FROM salaries FORCE INDEX idx_emp_no WHERE emp_no = 10005

13、新增字段

题目描述

存在actor表,包含如下列信息:
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')));
现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为'0000 00:00:00'

解析:

用 ALTER TABLE ... ADD ... 语句可以向已存在的表插入新字段,并且能够与创建表时一样,在字段名和数据类型后加入NOT NULL、DEFAULT等限定,可参考:

http://www.runoob.com/sqlite/sqlite-alter-command.html

1

ALTER TABLE actor ADD COLUMN create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00';

其中 ADD 后的 COLUMN 可省略,NOT NULL 和 DEFAULT '0000-00-00 00:00:00' 可交换:

1

ALTER TABLE actor ADD create_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL ;

14、给出每个员工每年薪水涨幅超过5000的员工编号emp_no

题目描述

给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。

提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)


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`));

解析:

SELECT s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
 FROM salaries AS s1, salaries AS s2
 WHERE s1.emp_no = s2.emp_no
 AND s2.salary - s1.salary > 5000
 AND strftime('%Y',s2.to_date) - strftime('%Y',s1.to_date) = 1
 ORDER BY salary_growth DESC;

15、触发器

题目描述

构造一个触发器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
);

解析:

1.创建触发器使用语句:CREATE TRIGGER trigname;

2.指定触发器触发的事件在执行某操作之前还是之后,使用语句:BEFORE/AFTER [INSERT/UPDATE/ADD] ON tablename

3.触发器触发的事件写在BEGIN和END之间;

4.触发器中可以通过NEW获得触发事件之后2对应的tablename的相关列的值,OLD获得触发事件之前的2对应的tablename的相关列的值

create trigger audit_log after insert on employees_test

begin

     insert into audit values(new.id,new.name);

end;

16、更新表中的数据

题目描述

将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。
CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

解析:

用 UPDATE 语句更新若干列的最基本用法,详细可参考:

http://www.w3school.com.cn/sql/sql_update.asp

https://www.w3schools.com/sql/sql_update.asp

另外要注意若干列 to_date = NULL 和 from_date = '2001-01-01' 之间只能用逗号连接,切勿用 AND 连接。

1

2

UPDATE titles_test SET to_date = NULL, from_date = '2001-01-01'

WHERE to_date = '9999-01-01';

17、创建外键

题目描述

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

CREATE TABLE audit(
EMP_no INT NOT NULL,
create_date datetime NOT NULL
);

解析;

drop table audit;
create table audit(
    emp_no int not null,
    create_date datetime not null,
    foreign key(emp_no) references employees_test(ID));

#注意key(emp_no) 之间不能有空格

18、按某字段数据的末尾2个字母排序

1

2

select first_name from employees

order by substr(first_name,length(first_name)-1,2)

substr(字符串,起始位置,长度)

起始位置:截取的子串的起始位置(注意:字符串的第一个字符的索引是1)。值为正时从字符串开始位置 开始计数,值为负时从字符串结尾位置开始计数。

长度:截取子串的长度

19、聚合函数group_concat(X,Y)

题目描述

按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
输出格式:

dept_no employees
d001 10001,10002
d002 10006
d003 10005
d004 10003,10004
d005 10007,10008,10010
d006

10009,10010

本题要用到SQLite的聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用。此题以 dept_no 作为分组,将每个分组中不同的emp_no用逗号连接起来(即可省略Y)。可参考:

http://www.sqlite.org/lang_aggfunc.html#groupconcat

http://blog.csdn.net/langzxz/article/details/16807859

1

2

SELECT dept_no, group_concat(emp_no) AS employees

FROM dept_emp GROUP BY dept_no

20、case语句

(case eb.btype
when 1 then s.salary*0.1
when 2 then s.salary*0.2
else s.salary*0.3 end) as bonus

21、

题目描述

针对库中的所有表生成select count(*)对应的SQL语句

解析:

本题主要有以下两个关键点:

1、在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 'table',详情可参考:

http://blog.csdn.net/xingfeng0501/article/details/7804378

2、在 SQLite 中用 “||” 符号连接字符串

1

2

SELECT "select count(*) from " || name || ";" AS cnts

FROM sqlite_master WHERE type = 'table'


 

猜你喜欢

转载自blog.csdn.net/weixin_41643439/article/details/87470077