SQL基础知识(二)

目录:

  1. 查找所有员工自入职以来的薪水涨幅情况
  2. 统计各个部门对应员工涨幅的次数总和
  3. 对所有员工的当前薪水按照salary进行按照1-N的排名
  4. 获取所有非manager员工当前的薪水情况
  5. 获取员工其当前的薪水比其manager当前薪水还高的相关信息
  6. 汇总各个部门当前员工的title类型的分配数目
  7. 给出每个员工每年薪水涨幅超过5000的员工编号emp_no
  8. 查找描述信息中包括robot的电影对应的分类名称以及电影数目
  9. 使用join查询方式找出没有分类的电影id以及名称
  10. 使用子查询的方式找出属于Action分类的所有电影对应的title,description
  11. 获取select
  12. 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  13. 创建一个actor表,包含如下列信息
  14. 批量插入数据
  15. 批量插入数据,如果数据已经存在,请忽略,不使用replace操作
  16. 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表
  17. 对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname
  18. 针对actor表创建视图actor_name_view
  19. 针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005
  20. 在last_update后面新增加一列名字为create_date
  21. 构造一个触发器audit_log,在向employees表中插入一条数据的时候,触发插入相关的数据到audit中
  22. 删除emp_no重复的记录,只保留最小的id对应的记录
  23. 将所有to_date为9999-01-01的全部更新为NULL,且from_date更新为2001-01-01
  24. 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现
  25. 将titles_test表名修改为titles_2017
  26. 在audit表上创建外键约束,其emp_no对应employees_test表的主键id
  27. 如何获取emp_v和employees有相同的数据no
  28. 将所有获取奖金的员工当前的薪水增加10%
  29. 针对库中的所有表生成select
  30. 将employees表中的所有员工的last_name和first_name通过(')连接起来
  31. 查找字符串'10,A,B'
  32. 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
  33. 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
  34. 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
  35. 分页查询employees表,每5行一页,返回第2页的数据
  36. 获取所有员工的emp_no
  37. 使用含有关键字exists查找未分配具体部门的员工的所有信息
  38. 获取有奖金的员工相关信息
  39. 统计salary的累计和running_total
  40. 对于employees表中,给出奇数行的first_name

一、示例题目

1、题目描述:查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
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`));
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`));

  • 输出描述:
emp_no growth
10011 0
省略 省略
10010 54496
10004 34003

示例SQL:

SELECT e.emp_no, (b.salary - a.salary) AS growth
FROM employees AS e
INNER JOIN salaries AS a
ON e.emp_no = a.emp_no
AND e.hire_date = a.from_date
INNER JOIN salaries AS b
ON e.emp_no = b.emp_no
AND b.to_date = '9999-01-01'
ORDER BY growth;

2、题目描述:统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及次数sum
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
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`));
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`));

  • 输出描述:
dept_no dept_name sum
d001 Marketing 24
d002 Finance 14
d003 Human Resources 13
d004 Production 24
d005 Development 25
d006 Quality Management 25

示例SQL:

SELECT departments.dept_no, dept_name, count(*) AS sum
FROM salaries
INNER JOIN dept_emp
ON salaries.emp_no = dept_emp.emp_no
INNER JOIN departments
ON departments.dept_no = dept_emp.dept_no
GROUP BY departments.dept_no;

3、题目描述:对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
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`));

  • 输出描述:
emp_no salary rank
10005 94692 1
10009 94409 2
10010 94409 2
10001 88958 3
10007 88070 4

示例SQL:

SELECT a.emp_no, a.salary, COUNT(DISTINCT b.salary) AS RANK
FROM salaries as a, salaries as b
WHERE a.to_date = '9999-01-01'
AND b.to_date = '9999-01-01'
AND a.salary <= b.salary
GROUP BY a.emp_no
ORDER BY a.salary DESC, a.emp_no ASC;

4、题目描述:获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
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`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));
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`));

  • 输出描述:
dept_no emp_no salary
d001 10001 88958
d004 10003 43311
d005 10007 88070
d006 10009 95409

样例SQL:

SELECT dept_emp.dept_no, dept_emp.emp_no, salary
FROM employees
LEFT JOIN dept_emp
ON employees.emp_no = dept_emp.emp_no
LEFT JOIN salaries
ON salaries.emp_no = employees.emp_no
WHERE employees.emp_no NOT IN (SELECT emp_noFROM dept_managerWHERE to_date = '9999-01-01'
)
AND dept_emp.to_date = '9999-01-01'
AND salaries.to_date = '9999-01-01';

5、题目描述:获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',
结果第一列给出员工的emp_no,第二列给出其manager的manager_no,第三列给出该员工当前的薪水emp_salary,第四列给该员工对应的manager当前的薪水manager_salary。
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`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));

  • 输出描述:
emp_no manager_no emp_salary manager_salary
10001 10002 88958 72527
10009 10010 95409 94409

示例SQL:

SELECT dept_emp.emp_no, s2.emp_no AS manager_no, s1.salary AS emp_salary, s2.salary AS manager_salary
FROM dept_emp
INNER JOIN dept_manager
ON dept_manager.dept_no = dept_emp.dept_no
INNER JOIN salaries s1
ON s1.emp_no = dept_emp.emp_no
INNER JOIN salaries s2
ON s2.emp_no = dept_manager.emp_no
WHERE dept_emp.emp_no NOT IN (SELECT emp_noFROM dept_managerWHERE to_date = '9999-01-01'
)
AND dept_emp.to_date = '9999-01-01'
AND s1.to_date = '9999-01-01'
AND s2.to_date = '9999-01-01'
AND s2.salary < s1.salary;

6、题目描述:汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
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`));
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

  • 输出描述:
dept_no dept_name title count
d001 Marketing Senior Engineer 1
d001 Marketing Staff 1
d002 Finance Senior Engineer 1
d003 Human Resources Senior Staff 1
d004 Production Senior Engineer 2
d005 Development Senior Staff 1
d006 Quality Management Engineer 2
d006 Quality Management Senior Engineer 1

样例SQL:

SELECT departments.dept_no, dept_name, title, COUNT(*) AS count
FROM departments
INNER JOIN dept_emp
ON departments.dept_no = dept_emp.dept_no
INNER JOIN titles
ON titles.emp_no = dept_emp.emp_no
WHERE dept_emp.to_date = '9999-01-01'
AND titles.to_date = '9999-01-01'
GROUP BY departments.dept_no, title;

7、题目描述:给出每个员工每年薪水涨幅超过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`));

  • 输出描述:
emp_no from_date salary_growth
10003 1995-12-03 24178
10008 1998-03-11 20843
10008 2000-03-10 5997

样例SQL:

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

8、题目描述:查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
CREATE TABLE IF NOT EXISTS film (
film_id smallint(5)  NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));
CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));
CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

样例SQL:

SELECT category.name, count(film.film_id)
FROM film, (SELECT *FROM film_categoryGROUP BY category_idHAVING COUNT(*) >= 5
)AS a, category, film_category
WHERE film.film_id = film_category.film_id
AND category.category_id = a.category_id
AND film_category.category_id = category.category_id
AND film.description like '%robot%';

9、题目描述:使用join查询方式找出没有分类的电影id以及名称
CREATE TABLE IF NOT EXISTS film (
film_id smallint(5)  NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));
CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));
CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

样例SQL:

SELECT film.film_id, title
FROM film
LEFT JOIN film_category
ON film.film_id = film_category.film_id
WHERE film_category.film_id is NULL;

10、题目描述:使用子查询的方式找出属于Action分类的所有电影对应的title,description
CREATE TABLE IF NOT EXISTS film (
film_id smallint(5)  NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));
CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));
CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

样例SQL:

SELECT title, description
FROM film
WHERE film_id IN (SELECT film_idFROM film_categoryWHERE category_id IN (SELECT category_idFROM categoryWHERE name = 'Action')
);

11、题目描述:获取select * from employees对应的执行计划

样例SQL:

EXPLAIN SELECT * FROM employees;

12、题目描述:将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
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`));

  • 输出描述:
Name
Facello Georgi
Simmel Bezalel
Bamford Parto
Koblick Chirstian
Maliniak Kyoichi
Preusig Anneke

样例SQL:

SELECT last_name || ' ' || first_name AS Name
FROM employees;

13、题目描述:创建一个actor表,包含如下列信息

列表 类型 是否为NULL 含义
actor_id smallint(5) not null 主键id
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
last_update timestamp not null 最后更新时间,默认是系统的当前时间

样例SQL:

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 (datetime('now','localtime'))
);

14、题目描述:对于表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')))

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33

样例SQL:

INSERT INTO actor
VALUES(1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');

15、题目描述:对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
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')))

actor_id first_name last_name last_update
'3' 'ED' 'CHASE' '2006-02-15 12:34:33'

样例SQL:

INSERT OR IGNORE INTO actor
VALUES(3, 'ED', 'CHASE', '2006-02-15 12:34:33');

16、题目描述:对于如下表actor,其对应的数据为:

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33

创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。 actor_name表结构如下:

列表 类型 是否为NULL 含义
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏

示例SQL:

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;

17、题目描述:针对如下表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')))
对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname

示例SQL:

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

18、题目描述:针对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')))

示例SQL:

CREATE VIEW actor_name_view AS
SELECT first_name AS first_name_v, last_name AS last_name_v
FROM actor ;

19、题目描述:针对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);

示例SQL:

SELECT *
FROM salaries
FORCED INDEXED BY idx_emp_no
WHERE emp_no = 10005;

附注:

(1)MySQL中,强制索引使用为:SELECT * FROM salaries FORCE INDEX (idx_emp_no) WHERE emp_no = 10005

20、题目描述:存在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:00:00'

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

21、题目描述:构造一个触发器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
);

示例SQL:

CREATE TRIGGER audit_log AFTER INSERT
ON employees_test
BEGININSERT INTO audit(EMP_no, NAME)VALUES(NEW.ID, NEW.NAME);
END;

22、题目描述:删除emp_no重复的记录,只保留最小的id对应的记录。
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);

示例SQL:

DELETE FROM titles_test
WHERE id NOT IN(SELECT MIN(id)FROM titles_testGROUP BY emp_no
);

23、题目描述:将所有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);

示例SQL:

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

24、题目描述:将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。
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);

示例SQL:

UPDATE titles_test
SET emp_no = REPLACE(emp_no, 10001, 10005)
WHERE id = 5;

25、题目描述:将titles_test表名修改为titles_2017。
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);

示例SQL:

ALTER TABLE titles_test RENAME TO titles_2017;

26、题目描述:在audit表上创建外键约束,其emp_no对应employees_test表的主键id。
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
);

示例SQL:

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

27、题目描述:存在如下的视图:
create view emp_v as select * from employees where emp_no >10005;
如何获取emp_v和employees有相同的数据?
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`));

  • 输出描述:
emp_no birth_date first_name last_name gender hire_date
10006 1953-04-20 Anneke Preusig F 1989-06-02
10007 1957-05-23 Tzvetan Zielinski F 1989-02-10
10008 1958-02-19 Saniya Kalloufi M 1994-09-15
10009 1952-04-19 Sumant Peac F 1985-02-18
10010 1963-06-01 Duangkaew Piveteau F 1989-08-24
10011 1953-11-07 Mary Sluis F 1990-01-22

示例SQL:

SELECT *
FROM emp_v;

28、题目描述:将所有获取奖金的员工当前的薪水增加10%。
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);
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`));

示例SQL:

UPDATE salaries
SET salary = salary * 1.1
WHERE emp_no IN (SELECT salaries.emp_noFROM salariesINNER JOIN emp_bonusON emp_bonus.emp_no = salaries.emp_noWHERE to_date = '9999-01-01'
);

29、题目描述:针对库中的所有表生成select count(*)对应的SQL语句
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`));
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);
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`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));

  • 输出描述:
cnts
select count(*) from employees;
select count(*) from departments;
select count(*) from dept_emp;
select count(*) from dept_manager;
select count(*) from salaries;
select count(*) from titles;
select count(*) from emp_bonus;

示例SQL:

SELECT 'select count(*) from ' || name || ';' AS cnts
FROM sqlite_master
WHERE type = 'table';

30、题目描述:将employees表中的所有员工的last_name和first_name通过(')连接起来。
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`));

  • 输出描述:
name
Facello'Georgi
Simmel'Bezalel
Bamford'Parto
Koblick'Chirstian
Maliniak'Kyoichi
Preusig'Anneke
Zielinski'Tzvetan
Kalloufi'Saniya
Peac'Sumant
Piveteau'Duangkaew
Sluis'Mary

示例SQL:

SELECT last_name || "'" || first_name
FROM employees;

31、题目描述:查找字符串'10,A,B' 中逗号','出现的次数cnt。

示例SQL:

SELECT LENGTH("10,A,B") - LENGTH(REPLACE("10,A,B",",","")) AS cnt;

32、题目描述:获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
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`));

  • 输出描述:
first_name
Chirstian
Tzvetan
Bezalel
Duangkaew
Georgi
Kyoichi
Anneke
Sumant
Mary
Parto
Saniya

示例SQL:

SELECT first_name
FROM employees
ORDER BY SUBSTR(first_name, LENGTH(first_name) - 1, 2) ASC;

附注:

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

33、题目描述:按照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

示例SQL:

SELECT dept_no, GROUP_CONCAT(emp_no, ",") AS employees
FROM dept_emp
GROUP BY dept_no;

附注:

(1)聚合函数:group_concat(x[,y]):x为连接字段,y为连接分隔符(可省略,默认为逗号)。该函数要和group by一起使用

34、题目描述:查找排除当前最大、最小salary之后的员工的平均工资avg_salary。
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`));

  • 输出描述:
avg_salary
69462.5555555556

示例SQL:

SELECT AVG(salary) AS avg_salary
FROM salaries
WHERE salary != (SELECT MAX(salary)FROM salaries
)
AND salary != (SELECT MIN(salary)FROM salaries
)
AND to_date = '9999-01-01';

35、题目描述:分页查询employees表,每5行一页,返回第2页的数据
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`));

示例SQL:

SELECT *
FROM employees
LIMIT 5 OFFSET 5;

附注:

(1)select * from employees order by xxx limit xxx offset xxx中limit:返回显示记录,offset:从第几条记录开始返回(第一条记录为0)。

36、题目描述:获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received ,没有分配具体的员工不显示。
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`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
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`));
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 table emp_bonus(
emp_no int not null,
received datetime not null,
btype smallint not null);

  • 输出描述:
emp_no dept_no btype received
10001 d001 1 2010-01-01
10002 d001 2 2010-10-01
10003 d004 3 2011-12-03
10004 d004 1 2010-01-01
10005 d003  
10006 d002  
10007 d005  
10008 d005  
10009 d006  
10010 d005  
10010 d006  

示例SQL:

SELECT employees.emp_no, dept_emp.dept_no, emp_bonus.btype, emp_bonus.received
FROM employees
INNER JOIN dept_emp
ON dept_emp.emp_no = employees.emp_no
LEFT JOIN emp_bonus
ON emp_bonus.emp_no = employees.emp_no;

37、题目描述:使用含有关键字exists查找未分配具体部门的员工的所有信息。
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`));
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`));

  • 输出描述:
emp_no birth_date first_name last_name gender hire_date
10011 1953-11-07 Mary Sluis F 1990-01-22

示例SQL:

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

38、获取有奖金的员工相关信息。
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`));
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`));
create table emp_bonus(
emp_no int not null,
recevied datetime not null,
btype smallint not null);
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`));
给出emp_no、first_name、last_name、奖金类型btype、对应的当前薪水情况salary以及奖金金额bonus。 bonus类型btype为1其奖金为薪水salary的10%,btype为2其奖金为薪水的20%,其他类型均为薪水的30%。 当前薪水表示to_date='9999-01-01'

  • 输出描述:
emp_no first_name last_name btype salary bonus
10001 Georgi Facello 1 88958 8895.8
10002 Bezalel Simmel 2 72527 14505.4
10003 Parto Bamford 3 43311 12993.3
10004 Chirstian Koblick 1 74057 7405.7

示例SQL1:

SELECT employees.emp_no, first_name, last_name, btype, salary, salary*btype*0.1 AS bonus
FROM employees
INNER JOIN salaries
ON employees.emp_no = salaries.emp_no
INNER JOIN emp_bonus
ON emp_bonus.emp_no  = employees.emp_no
WHERE salaries.to_date = '9999-01-01';

示例SQL2:

SELECT employees.emp_no, first_name, last_name, btype, salary, (CASE btypeWHEN 1 THEN salary * 0.1WHEN 2 THEN salary * 0.2ELSE salary * 0.3END
)AS bonus
FROM employees
INNER JOIN salaries
ON employees.emp_no = salaries.emp_no
INNER JOIN emp_bonus
ON emp_bonus.emp_no  = employees.emp_no
WHERE salaries.to_date = '9999-01-01';

39、题目描述:按照salary的累计和running_total,其中running_total为前两个员工的salary累计和,其他以此类推。 具体结果如下Demo展示。。
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`));

  • 输出描述:
emp_no salary running_total
10001 88958 88958
10002 72527 161485
10003 43311 204796
10004 74057 278853
10005 94692 373545
10006 43311 416856
10007 88070 504926
10009 95409 600335
10010 94409 694744
10011 25828 720572

样例SQL:

SELECT s1.emp_no, s1.salary, (SELECT SUM(s2.salary)FROM salaries s2WHERE s1.emp_no >= s2.emp_noAND s2.to_date = '9999-01-01'
)AS running_total
FROM salaries s1
WHERE s1.to_date = '9999-01-01'
ORDER BY s1.emp_no ASC;

40、题目描述:对于employees表中,给出奇数行的first_name
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`));

  • 输出描述:
first_name
Georgi
Chirstian
Anneke
Tzvetan
Saniya
Mary

示例SQL:

SELECT e1.first_name
FROM employees e1
WHERE (SELECT count(*)FROM employees e2WHERE e1.first_name >= e2.first_name
)%2 = 1;

SQL基础知识(二)相关推荐

  1. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  2. 原创《SQL基础知识第2版》PDF高清版,限时下载!

    内容简介 <SQL基础知识第2版>是一本为新手同学特地准备的入门文档,由公众号[SQL数据库开发]原创出品. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...

  3. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...

  4. oracle:oracle基础知识(二)

    oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...

  5. 《SQL基础知识第2版》PDF高清版,限时下载!

    内容简介 <SQL基础知识第2版>是一本为新手同学特地准备的入门文档,由公众号[SQL数据库开发]原创出品. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...

  6. 大数据系列sql基础知识(史上最全,收藏起来)

    大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...

  7. oracle基础之sql基础知识

    1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...

  8. 数据库基础与SQL基础知识看这篇就够了!

    一.数据库简介 1. DBMS(DataBaseManagement System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完 ...

  9. CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释

    CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...

最新文章

  1. 高逼格的 SQL 写法:行行比较,别问为什么,问就是逼格高。。
  2. mysql 十万条 输出_MySQL一次性插入十万条数据
  3. 面试:说说你对 HashMap 的认识?
  4. python免费试听-哈尔滨Python人工智能课程免费试听
  5. 程序员面试金典 - 面试题 17.04. 消失的数字(数学/位运算)
  6. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...
  7. 加拿大程序员趣闻系列 1/N
  8. 获取SQL Server数据库增长和收缩事件的详细信息
  9. 弹窗编辑jsp报表内数据
  10. m1芯片 服务器,今天来说说苹果M1 和华为ARM PC芯片
  11. 用selenium爬取斗鱼信息
  12. dig命令查询结果解析
  13. java类图资料整理
  14. 4、【办公自动化】Python实现Word转PDF
  15. python浪漫代码表白npy_【交大表白墙】表白dxy小姐姐,十里春风不如你,三里桃花不及卿,要每天开心哦!...
  16. 一文读懂JPEG算法!附C++代码实现JPEG算法,实现从BMP到JPEG转换!
  17. 最新国外虚拟主机对比评论国外虚拟主机购买指南
  18. 【docker ros】docker 开启自启运行容器中的程序
  19. java正则提取字符串中的符号汉字数字字母
  20. 阿里云ECS服务器安装Nginx

热门文章

  1. 腾讯视频qlv转mp4
  2. 每日算法----929. 独特的电子邮件地址----2022/06/04
  3. ubuntu空间扩容--grub修复之boot-repair修复
  4. 记录我在华为的经历----阿冬专栏
  5. 新手亲自踩坑!Jmter使用CSV Data Set Config配置原件测试登录接口,察看结果树无响应问题
  6. 排序函数sort()等的用法
  7. 计算机二级office高级应用试题,2016年计算机二级office高级应用练习题
  8. HBUILDERX怎么导入html文件,HBuilderX使用教程 HBuilderX如何导入图片
  9. 项目管理软件有哪些,哪个好用?
  10. ​嘉楠往事:浮沉八载,如今剑指美股