MySQL数据库学习之实战-个人笔记与总结

送分小仙女□ 提交于 2020-01-25 01:51:39
  • 使用My’SQL数据库中的数据进行减法运算时,
  • 不是不可以,要注意: 比如说我当前两张表是这样的:
    在这里插入图片描述
    一个是theorder用来存放订单,一个是product用来存放产品,想求库存量,需要用product表中的amount减去theorder表中对应产品的被订购的数量总和。
    我开始写成了这样:
 select (product.amount-select sum(theorder.amount) from theorder where productID=3) as inventory where
    -> product.ID=3 from product;

看着蛮正常的,人就是说这语句有毛病:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select sum(theorder.amount) from theorder where productID=3) as inventory where ’ at line 1
然后我改,分步写:
在这里插入图片描述
反正分开好着整一起就不行了。
后来网上搜了一下,分别select出来,然后再把减完的结果select出来,就成了:

 select(
 (select product.amount as s2)
 -  (select sum(theorder.amount) as s1 from theorder where productID=3)
 )
  as inventory from product where I

在这里插入图片描述
(然鹅乘法我想用这套路,搞不了。)

  • 和小明学的,为了不重复建表:
create table if not exists ohh
(......);
  • 还可以在建表时设置字符集,这样就可以正常显示汉字而不是???了:
 create table  if not exists theOrder(ID int primary key auto_increment,clientID int,number int,orderDate date,productID int,amount int)default charset=utf8

在这里插入图片描述

  • 数据库SQL实战之 查找最晚入职员工的所有信息
    思路:
    首先需要找到入职日期最大的那个员工信息:
 select max(hire_date) from employees;

这只是找到了“最大入职日期”,接下来需要找到“最大入职日期对应的员工”:

  select * from employees
 where hire_date =
  (select max(hire_date) from employees);

(注意括号。)

  • 数据库SQL实战之 查找入职员工时间排名倒数第三的员工所有信息。
    思路:先将员工入职时间降序排列,再生成一个从“1”开始自增1的列,然后选出“1”,“2”,“3”对应的员工信息。
    有个函数“ROW_NUMBER”支持这样的功能:为结果集的每一行增加一个行号,但是这是8.0版本以后才支持的:
    在这里插入图片描述
    应该使用limit子句约束要返回的最大行数"1",配合offset指定偏移量(从"0"开始)“2”:
select * from employees
order by hire_date desc
limit 1 offset 2;
  • 联结🔗:
    “相同的数据出现多次绝不是一件好事。
    这是关系数据库设计的基础。关系表的设计就是把信息分解开来,一类数据一个表,各表通过某些共同的值相互关联。”
    联结的语句是指定要联结的所有表,及关联它们的方式。
    有以下联结:
    (1)where子句建立联结。
    (2)内联结/等值联结。
 A inner join B
 on A.c=B.c;

(3)联结多个表。
不要联结没有必要的表,联结的表越多,性能下降得越厉害。
(4)自联结。
(5)自然联结。
排除多次出现,使每一列只返回一次。
(6)外联结。
许多联结将一个表中的行与另一个表中的行相关联,但有时候需要包含关联行的那些行。例如:
对每个顾客下的单计数,包括那些至今未下单的顾客。
列出所有产品和订购数量,包括没有人订购的产品
计算平均销售规模,包括那些至今尚未下单的顾客
数据库实战之 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
这种情况就应该用外联结
必须用 leftright 关键字指定包括其所有行的表。( 牛客网编辑器不支持右连接哦! )比如本题中“包含所有行的表”是employees表,而另一个表dept_emp中的属性dept_no可以为null。

LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
“即便无对应数据” 也就可以得到"null"了。

from LEFTTABLE as l left/right (outer) join RIGHTTABLE as r
on l.a=r.b;
  • 数据库SQL实战之 查找薪水涨幅超过15次的员工号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分组,再统计每个组的emp_no的个数,即可得到对应的涨薪次数,要注意的是,与group by 搭配使用的是having子句,而不是where 。

select emp_no,count(emp_no) as t
from salaries 
group by emp_no 
having t>15;

group by必须出现在where子句之后,order by 子句之前。
where 过滤指定的是行,而不是分组。having 过滤才是基于分组聚集值。
事实上,目前所学的所有类型的where子句都可以用having 子句代替。
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!