一、数据库的好处
1、可以持久化数据到本地
2、结构化查询
二、数据库的常见概念 ★
1、DB:数据库,存储数据的容器
2、DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
3、SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
三、数据库存储数据的特点
1、数据存放到表中,然后表再放到库中
2、一个库中可以有多张表,每张表具有唯一的表名用来标识自己
3、表中有一个或多个列,列又称为“字段”,相当于java中“属性”
4、表中的每一行数据,相当于java中“对象”
四、常见的数据库管理系统
mysql、oracle、db2、sqlserver
MySQL服务的启动和停止
方式一:通过命令行
net start 服务名
net stop 服务名
方式二:计算机——右击——管理——服务
MySQL服务的登录和退出
登录:mysql 【-h 主机名 -P 端口号】 -u 用户名 -p密码
密码:qq134*******
退出:exit或ctrl+C
MySQL的实例
单个表
查找最晚入职员 SQL195
select *
from employees
where hire_date = (
select max(hire_date)
from employees
)
查找入职员工时间排名倒数第三的员工 SQL196
select *
from employees
where hire_date = (
select DISTINCT hire_date
from employees
ORDER by hire_date DESC
limit 1 offset 2 )
获取薪水第二多的员工
SELECT
a.emp_no,
a.salary -- 再套一层查询
FROM
(
SELECT
emp_no,
salary,
dense_rank() over (
ORDER BY
salary DESC
) rank_num
FROM
salaries
WHERE
to_date = '9999-01-01'
) a
WHERE
a.rank_num = 2;
SELECT
a.emp_no,
a.salary -- 再套一层查询
FROM salaries a
where salary=(
select salary
from salaries
where to_date = '9999-01-01'
order by salary desc
limit 1 offset 1
)
查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t SQL201
select emp_no, count(emp_no) as t
from salaries
group by emp_no
having t > 15;
统计单个列出现过的数 SQL202
select distinct salary
from salaries
order by salary desc
请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工 SQL209
select *
from employees as e
where e.last_name!="Mary" and e.emp_no%2=1
order by hire_date DESC
所有员工的薪水按照salary降序先进行1-N的排名,并有一列显示当前排第几 SQL217
select
emp_no,
salary,
dense_rank() over (
order by
salary desc
) as t_rank
from
salaries
where
to_date = '9999-01-01'
使用子查询的方式找出属于Action分类的所有电影SQL224
select
f.title,
f.description
from
film f
left join film_category fc on f.film_id = fc.film_id
where
fc.category_id = (
select
category_id
from
category
where
name = 'Action'
)
将employees表的所有员工的last_name和first_name拼接起来作为Name SQL226
select
concat (last_name, " ", first_name)
from
employees
两个表
left join: 包含左表的所有行,对应的右表行可能为空
right join: 包含右表的所有行,对应的左表行可能为空
inner join: 只包含左右表都匹配并且不为空的行
join: 只包含左右表都匹配并且不为空的行
left outer join: 包含左表的所有行,对应的右表行可能为空。
两个表有一列相同,查找领导表的薪水表 SQL197
SELECT s.emp_no,s.salary,s.from_date, s.to_date,d.dept_no
from salaries as s, dept_manager as d
where s.emp_no = d.emp_no
order by s.emp_no
两个表员工表、部门表,查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工 SQL199
select e.last_name, e.first_name,d.dept_no
from employees as e left JOIN dept_emp AS d
on e.emp_no = d.emp_no;
查找一个表中,没有在另一个表的元素 SQL204
select emp_no
from employees as e
where emp_no not in (
select emp_no
from dept_manager)
员工表dept_emp、部门经理表,获取所有员工当前的manager SQL205
select e.emp_no, d.emp_no
from
dept_emp as e
inner join dept_manager as d on e.dept_no = d.dept_no
where
e.emp_no != d.emp_no
你统计出各个title类型对应的员工薪水对应的平均工资avg SQL210
select
title,
avg(salary) as a
from
titles as t
inner join salaries as s on t.emp_no = s.emp_no
group by
t.title
order by
a
获取每个部门中当前员工薪水最高的相关信息 SQL206
员工表、薪水表
select
t1.dept_no,
t2.emp_no,
t1.salary
from
(
select
d.dept_no,
max(s.salary) salary
from
dept_emp d
join salaries s on d.emp_no = s.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
group by
d.dept_no
) t1
join (
select
d.emp_no,
d.dept_no,
s.salary
from
dept_emp d
join salaries s on d.emp_no = s.emp_no
and d.to_date = '9999-01-01'
and s.to_date = '9999-01-01'
) t2 on t1.dept_no = t2.dept_no
and t1.salary = t2.salary
order by
t1.dept_no;
在职员工自入职以来的薪水涨幅情况 SQL215
select
b.emp_no,
(b.salary - a.salary) as growth
from
(
select
e.emp_no,
s.salary
from
employees e
left join salaries s on e.emp_no = s.emp_no
and e.hire_date = s.from_date
) a -- 入职工资表
inner join (
select
e.emp_no,
s.salary
from
employees e
left join salaries s on e.emp_no = s.emp_no
where
s.to_date = '9999-01-01'
) b -- 现在工资表
on a.emp_no = b.emp_no
order by
growth
三个表
查找所有员工的last_name和first_name以及对应的dept_name也包括暂时没有分配部门的员工 SQL213
员工表、部门表、部门员工关系表
select
e.last_name,
e.first_name,
d.dept_name
from
employees e
left join dept_emp de on e.emp_no = de.emp_no
left join departments d on de.dept_no = d.dept_no
统计各个部门的工资记录数 SQL216
部门表、关系表、薪水表
select
d.dept_no,
d.dept_name,
count(*) as sum
from
(
departments d
join dept_emp de on d.dept_no = de.dept_no
)
join salaries s on de.emp_no = s.emp_no
group by
d.dept_no
order by
dept_no
获取员工其当前的薪水比其manager当前薪水还高 SQL219
select
a.emp_no,
b.emp_no manager_no,
c.salary emp_salary,
d.salary manager_salary
from
dept_emp a
inner join dept_manager b on a.dept_no = b.dept_no
inner join salaries c on a.emp_no = c.emp_no
inner join salaries d on b.emp_no = d.emp_no
where
c.salary > d.salary
汇总各个部门当前员工的title类型的分配数目 SQL220
select
d.dept_no,
d.dept_name,
t.title,
count(title)
from
departments d
join dept_emp de on d.dept_no = de.dept_no
join titles t on de.emp_no = t.emp_no
where
de.to_date = "9999-01-01"
and t.to_date = "9999-01-01"
group by
dept_no,
title
order by
dept_no
四个表
获取所有非manager员工薪水情况 SQL218
SELECT
b.dept_no,
a.emp_no,
d.salary
from
employees a,
dept_emp b,
dept_manager c,
salaries d
WHERE
a.emp_no = b.emp_no
AND b.dept_no = c.dept_no
AND b.emp_no != c.emp_no
AND a.emp_no = d.emp_no