数据库实战-入门到精通
前言:
博主研究方向为网络信息与安全,本科是从底层嵌入式跳到后端开发的野生程序猿一只。
后端也纯属爱好,一起来敲代码吧!参考题库为Leetcode。
文章目录
入门篇
595. 大的国家
使用Select语句和where语句就可以:
使用 WHERE 子句过滤所有记录,获得满足条件的国家。
根据定义,大国家至少满足以下两个条件中的一个:
面积超过 300 万平方公里。
人口超过 2500 万。
使用下面语句获得满足条件 1 的大国家。
//Mysql:
SELECT name, population, area FROM world WHERE area > 3000000
//使用下面语句获得满足条件 2的大国家。
SELECT name, population, area FROM world WHERE population > 25000000
使用OR语句连接在一起。
MYSQL&Oracle:
//MySQL:
SELECT
name, population, area
FROM
world
WHERE
area >= 3000000 OR population >= 25000000
;
1757. 可回收且低脂的产品
select product_id from products where low_fats='Y' and recyclable ='Y'
584. 寻找用户推荐人-多表连接
select customers.name as 'Customers'
from customers
where customers.id not in
(
select customerid from orders
);
183. 从不订购的客户
注意在筛选的时候,NULL这个情况也需要考虑,否则的话仅仅是referee_id!=2这个条件是不会把NULL算进行去的。
# Write your MySQL query statement below
select name
from customer
where referee_id != 2 or referee_id is null;
1873. 计算特殊奖金
主要是判断id是否为奇数、用户名第一个是否为M。
所需要的知识点为:
1.case when
case when详细讲解
case when 的格式为:
case when 条件 then 语句
when 条件2 then 语句
…
else 语句
end
2.As语法
as语法的使用
3.left函数
4.运算符
<>为!=
Oracle:
select
employee_id,
case when employee_id % 2 = 1 and left(name, 1) <> 'M' then salary else 0 end as bonus
from Employees
order by employee_id asc;//默认排序方式为升序,以id为升序
627. 变更性别
利用函数Replace:
replace函数的使用
首先用法 replace(‘总字符串’,要下场的字符,要上场的字符) 为了理解逻辑,当做两步看
第一步: set sex=‘fm’ 此时所有的性别变成 fm (注意这只是为了理解,实际上sex没有变化,因为什么都没执行,怎么会变化)
第二步:对所有的‘fm’字符串进行替换,具体来说就是用空值替换掉"fm"里面的sex部分
核心知识点是:replace里面 下场字符可以是变量,这里是sex=(f/m) 上场字符可以是空值,起到一个删除的作用。
MySQL
update salary
set sex = replace("fm", sex, "")
利用Case when结构来进行解决:
Oracle
update salary
set sex=(case
when sex='f' then 'm'
when sex='m' then 'f'
end)
196. 删除重复的电子邮箱
MySQL
1.采用自连接的方式进行解决,首先进行筛选出需要删除的某一列。
select p1 from Person p1,Person p2
where p1.email =p2.email and p1.id> p2.id
2.把Select换成delete即可。
DELETE p1 FROM Person p1,
Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
Oracle
oracle的自连接方式只能允许使用Select,当替换成Delete的同时,会出现语法错误,不支持这种形式的书写,所以需要另寻思路;
首先必须使用的是delete语句,那么条件考虑是表id!=重复字段对应最小的id的时候,条件成立,而且能够保留id最小的字段。
delete from Person e
where e.id<>(select min(t.id) from Person t where t.email=e.email)
在Oracle中,常见的连接方式有内连接(自然 连接)、外连接、自连接三种方式。
其中内连接是对两表之中的共同字段进行输出。
外连接则分为左/右外连接以及全外连接,假设有A、B两个表
左外连接:
A的记录将会全部表示出来而B只会显示符合搜索条件的记录。B表没有匹配到的地方均为NULL
右外连接:
B的记录将会全部表示出来而A只会显示符合搜索条件的记录。B表没有匹配到的地方均为NULL
全外连接:
AB表的字段全部输入
外连接比较类似数学的集合之间的概念,如图所示:
1667. 修复表中的名字
科普一下SQL的常用函数:
转小写
select lower(ename) from emp;
转大写
select upper(ename) from emp;
首字母大写后面小写
select initcap(ename) from emp;
所以本题题解;
select u.user_id,initcap(u.name) as name
from Users u
order by u.user_id
1484. 按日期分组销售产品
1.去重
select distinct sell_date,product from activities
2.Oracle日期格式转换
直接select sell_date 会打印出’yyyy-mm-dd hh-mm-ss’
to_char(sell_date,‘yyyy-mm-dd’)
3.使用 listagg() WITHIN GROUP () 将多行合并成一行
/* Write your PL/SQL query statement below */
select to_char(sell_date,'yyyy-mm-dd')sell_date,count(product)num_sold,
listagg(product,',') within group(order by sell_date)products
from
(
select distinct sell_date,product from activities
)
group by sell_date
order by sell_date
1527. 患某种疾病的患者
like语法的使用
like语法为“%DIAB1%”的时候,%代表占位符
select * from Patients
where conditions like 'DIAB1%' or conditions like '% DIAB1%'
1965. 丢失信息的雇员
select Salaries.employee_id
from Salaries
left join Employees
on employees.employee_id = Salaries.employee_id
where Employees.employee_id is null
union
select Employees.employee_id
from Employees
left join Salaries
on employees.employee_id = Salaries.employee_id
where Salaries.employee_id is null
order by employee_id
1795. 每个产品在不同商店的价格
select
product_id,lower(store) as store,price
from
Products
unpivot
(
price for store in(store1,store2,store3)
)