牛客簡單SQL在線編程題記

視圖創建
題目描述
針對actor表創建視圖actor_name_view,只包含first_name以及last_name兩列,並對這兩列重新命名,fist_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 as
select first_name  fist_name_v, last_name  last_name_v
from actor

查詢奇數行數據

對於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));

SELECT E1.first_name
FROM employees E1
WHERE
 (SELECT COUNT(*) FROM employees E2 WHERE E1.first_name>E2.first_name)%2=0; 

題目描述
獲取當前(to_date=’9999-01-01’)薪水第二多的員工的emp_no以及其對應的薪水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));

select emp_no,salary
from salaries
where to_date='9999-01-01'
order by salary desc
limit 1,1;

查找當前薪水(to_date=’9999-01-01’)排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不準使用order by
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));

select e.emp_no,max(s.salary),e.last_name,e.first_name 
from salaries s,employees e,
(select emp_no,max(salary) from salaries where salaries.to_date = '9999-01-01') temp
where e.emp_no=s.emp_no and e.emp_no!=temp.emp_no
and s.to_date = '9999-01-01';

題目描述
查找員工編號emp_now爲10001其自入職以來的**薪水salary漲幅值**growth
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 (
(SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1)
- (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date LIMIT 1)
) AS growth;

題目描述
查找所有員工自入職以來的薪水漲幅情況,給出員工編號emp_noy以及其對應的薪水漲幅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));

select a.emp_no, (b.salary - c.salary) as growth
from
    employees as a
    inner join salaries as b
    on a.emp_no = b.emp_no and b.to_date = '9999-01-01'
    inner join salaries as c
    on a.emp_no = c.emp_no and a.hire_date = c.from_date
order by growth asc

對於表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’)))

insert or ignore into actor values('3','ED','CHASE','2006-02-15 12:34:33') 

題目描述
獲取select * from employees對應的執行計劃

explain select * from employees;

題目描述
存在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 actor
add column
create_date datetime not null default ('0000-00-00 00:00:00') 

後面應該可以加上 after last_update

題目描述
統計各個部門對應員工漲幅的次數總和,給出部門編碼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));

下面這條sql是統計薪資變化次數 變化 不等同漲幅

select d.dept_no ,dept.dept_name,count(salary) 
from salaries s ,dept_emp d,departments dept
where s.emp_no = d.emp_no and d.dept_no=dept.dept_no 
group by dept.dept_no;

這個sql 是統計工資漲的次數

select dt.dept_no,dt.dept_name,count(*)
from salaries sa left join dept_emp de
on sa.emp_no = de.emp_no
left join departments dt 
on de.dept_no = dt.dept_no
inner join salaries saa 
        where saa.salary > sa.salary
        and saa.emp_no = sa.emp_no 
        and saa.from_date = sa.to_date
group by dt.dept_no,dt.dept_name;

題目描述
針對如下表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

create unique  index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name);

題目描述
構造一個**觸發器**audit_log,在向employees表中插入一條數據的時候,觸發插入相關的數據到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_test
begin
 insert into audit values(new.id,new.name);   
end

題目描述
將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);

insert into titles_test values (‘1’, ‘10001’, ‘Senior Engineer’, ‘1986-06-26’, ‘9999-01-01’),
(‘2’, ‘10002’, ‘Staff’, ‘1996-08-03’, ‘9999-01-01’),
(‘3’, ‘10003’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’),
(‘4’, ‘10004’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’),
(‘5’, ‘10001’, ‘Senior Engineer’, ‘1986-06-26’, ‘9999-01-01’),
(‘6’, ‘10002’, ‘Staff’, ‘1996-08-03’, ‘9999-01-01’),
(‘7’, ‘10003’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’);


/*update titles_test set emp_no = replace(emp_no,10001,10005) where id=5*/
replace into titles_test values(5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章