SQL基础知识(二)
SQL基础知识(二)
目录:
- 查找所有员工自入职以来的薪水涨幅情况
- 统计各个部门对应员工涨幅的次数总和
- 对所有员工的当前薪水按照salary进行按照1-N的排名
- 获取所有非manager员工当前的薪水情况
- 获取员工其当前的薪水比其manager当前薪水还高的相关信息
- 汇总各个部门当前员工的title类型的分配数目
- 给出每个员工每年薪水涨幅超过5000的员工编号emp_no
- 查找描述信息中包括robot的电影对应的分类名称以及电影数目
- 使用join查询方式找出没有分类的电影id以及名称
- 使用子查询的方式找出属于Action分类的所有电影对应的title,description
- 获取select
- 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
- 创建一个actor表,包含如下列信息
- 批量插入数据
- 批量插入数据,如果数据已经存在,请忽略,不使用replace操作
- 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表
- 对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索引idx_lastname
- 针对actor表创建视图actor_name_view
- 针对上面的salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005
- 在last_update后面新增加一列名字为create_date
- 构造一个触发器audit_log,在向employees表中插入一条数据的时候,触发插入相关的数据到audit中
- 删除emp_no重复的记录,只保留最小的id对应的记录
- 将所有to_date为9999-01-01的全部更新为NULL,且from_date更新为2001-01-01
- 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现
- 将titles_test表名修改为titles_2017
- 在audit表上创建外键约束,其emp_no对应employees_test表的主键id
- 如何获取emp_v和employees有相同的数据no
- 将所有获取奖金的员工当前的薪水增加10%
- 针对库中的所有表生成select
- 将employees表中的所有员工的last_name和first_name通过(')连接起来
- 查找字符串'10,A,B'
- 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
- 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees
- 查找排除当前最大、最小salary之后的员工的平均工资avg_salary
- 分页查询employees表,每5行一页,返回第2页的数据
- 获取所有员工的emp_no
- 使用含有关键字exists查找未分配具体部门的员工的所有信息
- 获取有奖金的员工相关信息
- 统计salary的累计和running_total
- 对于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基础知识(二)相关推荐
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- 原创《SQL基础知识第2版》PDF高清版,限时下载!
内容简介 <SQL基础知识第2版>是一本为新手同学特地准备的入门文档,由公众号[SQL数据库开发]原创出品. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...
- mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
SQL 基础知识梳理(六)- 函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...
- oracle:oracle基础知识(二)
oracle基础知识(二)笔记:高级查询 文章目录 分组查询 多属性分组语法: 过滤查询 group by 语句增强 sqlplus报表功能 多表查询 等值连接 外连接 自连接 子查询 子查询中的空值 ...
- 《SQL基础知识第2版》PDF高清版,限时下载!
内容简介 <SQL基础知识第2版>是一本为新手同学特地准备的入门文档,由公众号[SQL数据库开发]原创出品. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...
- 大数据系列sql基础知识(史上最全,收藏起来)
大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...
- oracle基础之sql基础知识
1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...
- 数据库基础与SQL基础知识看这篇就够了!
一.数据库简介 1. DBMS(DataBaseManagement System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完 ...
- CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释
CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...
最新文章
- 高逼格的 SQL 写法:行行比较,别问为什么,问就是逼格高。。
- mysql 十万条 输出_MySQL一次性插入十万条数据
- 面试:说说你对 HashMap 的认识?
- python免费试听-哈尔滨Python人工智能课程免费试听
- 程序员面试金典 - 面试题 17.04. 消失的数字(数学/位运算)
- oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...
- 加拿大程序员趣闻系列 1/N
- 获取SQL Server数据库增长和收缩事件的详细信息
- 弹窗编辑jsp报表内数据
- m1芯片 服务器,今天来说说苹果M1 和华为ARM PC芯片
- 用selenium爬取斗鱼信息
- dig命令查询结果解析
- java类图资料整理
- 4、【办公自动化】Python实现Word转PDF
- python浪漫代码表白npy_【交大表白墙】表白dxy小姐姐,十里春风不如你,三里桃花不及卿,要每天开心哦!...
- 一文读懂JPEG算法!附C++代码实现JPEG算法,实现从BMP到JPEG转换!
- 最新国外虚拟主机对比评论国外虚拟主机购买指南
- 【docker ros】docker 开启自启运行容器中的程序
- java正则提取字符串中的符号汉字数字字母
- 阿里云ECS服务器安装Nginx
热门文章
- 腾讯视频qlv转mp4
- 每日算法----929. 独特的电子邮件地址----2022/06/04
- ubuntu空间扩容--grub修复之boot-repair修复
- 记录我在华为的经历----阿冬专栏
- 新手亲自踩坑!Jmter使用CSV Data Set Config配置原件测试登录接口,察看结果树无响应问题
- 排序函数sort()等的用法
- 计算机二级office高级应用试题,2016年计算机二级office高级应用练习题
- HBUILDERX怎么导入html文件,HBuilderX使用教程 HBuilderX如何导入图片
- 项目管理软件有哪些,哪个好用?
- ​嘉楠往事:浮沉八载,如今剑指美股