数据库实战-入门到精通

数据库实战-入门到精通

前言:
博主研究方向为网络信息与安全,本科是从底层嵌入式跳到后端开发的野生程序猿一只。
后端也纯属爱好,一起来敲代码吧!参考题库为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)
    )

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵙嵙程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值