likes
comments
collection
share

复习OR学习数据库? 看这篇就够了!

作者站长头像
站长
· 阅读数 10

我正在参加「掘金·启航计划」

闲聊

不知不觉一个学期又即将结束了~

就在刚刚 荔枝 还沉浸在期末狂欢中(三天学完一本书)、突然收到了一个晴天霹雳的消息~

院长:“下学期 你们能别回来就别回来~”

此时,我才意识到 原来我已经即将毕业了啊~ 即将步入社会面临找工作的压力🍐

于是 我赶紧开始恶补!!!(收藏从未停止、阅读从未开始)

复习OR学习数据库? 看这篇就够了!

好了,言归正传 写这篇的目的也是回忆一下学过的数据库。

前言

数据库基础

在学习SQL之前,你应该对数据库的基本概念有些了解


数据库这个术语概念有很多,就仅仅我们程序开发来说 数据库是以某种有组织的方式存储的数据集合。


这里默认读者们已经熟悉明白了数据库术语

如:表、 行、 列、 数据类型、主键、 外键 等

本文就不多做解释 。

理解数据库概念是掌握SQL的重要前提、如果有必要,建议读者们找本书或者花费几分钟简单的了解一下!


什么是SQL

Structured Query Language (结构化查询语言) 一种专门用来与数据库进行沟通的语言


SELECT 检索数据

检索单个列

SELECT name FROM users;

检索多个列

SELECT id, name, phone FROM users;

检索所有列

SELECT * FROM users;

提示💡 :


  1. 虽然使用*通配符会让你省事,但检索不需要的列会降低3检索速度和应用程序的性能
  1. 使用空格 ,在编写SQL语句的时候 空格会被忽略 但自主使用空格 会让SQL语句更加的容易阅读和调试
  1. 多列之间记得用逗号隔开,但在最后一列后不要使用逗号 否则会报错
  1. ;结尾 并没有必要 但为了让语句看起来更加规范 希望大家都能养成这个习惯
  1. SQL语句并不会区分大小写 即 SELECR 和 select 是相同的 但许多开发人员喜欢对SQL关键字使用大写,对列名和表名使用小写

检索不同的值

SELECT DISTINCT id FROM users;

DISTINCT : 不同的

上面语句的含义就是返回id不会重复的数据

提示💡:

  1. 使用 DISTINCT 放在列前
  2. 另外 DISTINCT 不仅仅作用于后面紧跟着的一列 而是所有列

限制结果

SELECT 语句返回指定表中所有匹配的行 如果你只想返回第一行或者一定数量的行应该怎么做呢?

不同的数据库SQL实现方式是不同的 ,本文选择使用MySQL

SELECT id from users LIMIT 5;

LIMIT 5 指示返回数据不超过5行

SELECT id FROM users LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5 指示 返回从第五行起的五行数据

排序检索

排序但列检索

关系型数据库设计理论认为如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义。


SELECT id FROM users ORDER BY id;

对id 进行排序 如果是数字默认从高到低,如果是字符类型 按照a-z顺序

提示💡:


  1. 指定一条ORDER BY 子句时,保证它是SELECT语句最后一句 如果不是最后一句 将出错

按照多个列排序

SELECT id,name FROM users ORDER BY id,name;

按照多个列排序时排序机制也是按照顺序进行 先排序 第一个列条件 按照这种前后的顺序


按列顺序位置排序

SELECT id,name,phone FROM users ORDER BY 2,3;

语句同下:

ELECT id,name,phone FROM users ORDER BY name,phone;

提示💡:

  1. 好处不用在写列名
  2. 坏处容易犯错(我好像在说一种很新的废话)

DESC 降序排序

在末尾加上DESC

ELECT id,name,phone FROM users ORDER BY name,phone DESC;

提示💡:

  1. DESC关键字只应用到直接位于其前面的列名
  2. 如果相对每一列都进行降序排序,必须每一对都指定DESC关键字


过滤数据

只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)



提示💡:在同时使用ORDER BY 和 WHERE 子句的时候 应该 让 ORDER BY 位于WHERE 之后,否则将会产生错误


以下是关于where 条件

复习OR学习数据库? 看这篇就够了!

比如

SELECT id FROM users WHERE id < 10;
SELECT id FROM users WHERE id <= 10;
SELECT id FROM users WHERE id BETWEEN 3 AND 10;
SELECT id FROM users WHERE id IS NULL ;

高级过滤

AND 、OR

SQL 允许给出多个WHERE子句。 这些子句有两种使用方式,即以AND子句或OR子句的方式使用。


SELECT id , name FROM users WHERE id < 10 AND name = '荔枝';

与之 相对的 OR 就是或者的意思。

提示💡: 由于AND在求值优先级是比OR高 所以 多使用()来帮助我们书写语句

IN

含义类似 BETWEEN 但使用 IN 更加直观规范。

SELECT id , name FROM users where id IN (3,4) ORDER BY name;

提示💡:

  1. IN操作符一般比一组OR操作符执行的更快
  2. IN最大优点是可以包含其他SELECT语句,能够更动态的简历WHERE子句

NOT操作符

NOT关键字用在要过滤的列前,而不仅是在其后


NOT

WHERE 子句用来否定其后条件的关键字

SELECT id from users WHERE NOT id = '1' ORDER BY id;

提示💡:在与IN操作符联合使用时,NOT可以非常简单地找出与条件列表不匹配的行



通配符进行过滤

LIKE操作符

通配符

用来匹配值的一部分的特殊字符


SELECT name,id FROM users WHERE name LIKE '荔%'

提示💡:

  1. 通配符搜索只能用于文本字段(字符串)不可以应用在非文本数据类型(日期、int)
  2. 根据DBMS的不同及配置 搜索可以是区分大小写的 如果区分大小写‘sheep%’与 Sheep can fly就不匹配

下划线(_)通配符

下划线用途与%一样,但它只匹配单个字符而不是多个


提示💡:

  1. 不要过度使用通配符,如果其他操作符能达到相同的目的 应该使用其他操作符
  2. 在确实需要使用通配符时,尽量不要把他们用在搜索模式的开始处,用在搜索模式开始处 搜索起来是最慢的

(小声bb : 我都用mysql了 我会在乎速度吗.....)

  1. 注意通配符的位置,不要放错位置造成返回错误的数据

计算字段

计算字段并不实际存在数据库表中,计算字段是运行时在SELECT语句内创建的。


拼接字段

在MySQL中 拼接字段关键字是Concat


SELECT Concat (name,'(',id,')') FROM users ORDER BY name ;

AS别名

SELECT name AS '姓名' FROM users; 

别名的名字即可以是一个单词,也可以是一个字符串,如果是后者,字符串应该括在引号中,虽然这样做法是合理的但是并不建议这样去做,多单词的名字可读性很高,不过会给客户端应用带来各种问题 所以 别名最常见的使用方式是将多个单词的列名重命名为一个单词的名字。


算术计算

复习OR学习数据库? 看这篇就够了!

SELECT id + iphone AS '编号' FROM users ORDER BY '编号';

提示💡: 注意运算数据类型 否则不能参与运算操作



函数

文本处理函数

复习OR学习数据库? 看这篇就够了!

数值处理函数

复习OR学习数据库? 看这篇就够了!

聚集函数

复习OR学习数据库? 看这篇就够了!

比如AVG 返回此列的平均数

SELECT AVG(id) AS avg_id from users;

组合聚集函数

SELECT COUNT(*) AS items,
	MIN(price) AS price_min,
	MAX(price) AS price_max,
	AVG(price) AS price_avg FROM users;

数据分组

使用分组可以将数据氛围多个逻辑组,对每个组进行聚集计算。


分组是使用SELECT语句的GROUP BY 子句建立的。


GROUP BY 子句 可以包含任意数目的列,因而可以对分组进行嵌套,更细致的进行数据分组。


如果在GROUP BY 子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(不能从个别的列取回数据)


GROUP BY 出现在 WHERE 子句后 ORDER BY 子句前。



过滤分组

WHERE过滤行,而HAVING 过滤分组


SELECT id,COUNT(*) AS item 
FROM users
GROUP BY id
HAVING COUNT(*) >= 2;

WHERE 子句在这里不起作用,因为过滤是基于分组聚集值,而不是特定行的值。


分组和排序

复习OR学习数据库? 看这篇就够了!

提示💡:

一般在使用GROUP BY子句时,应该也给出ORDER BY 子句 这是保证数据正确排序的唯一方法


子句顺序

复习OR学习数据库? 看这篇就够了!


数据插入

INSERT INTO users VALUES(1,'TOM','17753341xxx');

INSERT INTO users (id,name,address,phone) VALUES(3,'JACK','XXX-XXX-XX','132XXXXXXX');

前者按照表结构顺序进行插入,后者按照字段名定位进行数据的插入


更新输入

更新数据一定要小心,不要遗忘where 语句 否则稍不注意就更新了表中所有行


UPDATE 语句由三部分组成:


  1. 要更新的表
  2. 列名和他们的新值
  3. 确定更新哪些行的过滤条件

UPDATE users SET id = 'xx' WHERER id = '1';

上面语句含义就是将 id为1 数据 id 更新为 xx


多个列 同样的用逗号隔开


UPDATE users SET id = 'xx',
        	 SET address = 'xxx-xxx-xxx'
where id = 'xx';

同样需要注意的是最后一列不加逗号,


删除数据

DELETE FROM users WHERE id = 10000006;

下面分享许多SQL程序员使用UPDATE 或 DELETE 所遵循的重要原则。


  1. 除非确实打算更新和删除每一行,否则不要使用不带where子句的UPDATE 或 DELETE 语句。
  2. 保证每个表都有主键。
  3. 在UPDATE 或 DELETE 语句使用 WHERE 子句前,应先用SELECT 进行测试 保证过滤的是正确的记录 以防止WHERE 子句不正确。



实战

情景描述

最后让我们实战结尾!

就拿我宿舍举例子吧,比如我现在在码字 半夜三更 舍友开着灯打游戏~~~ 谁能懂!!!!

问题

  1. 统计今天开灯 宿舍 打游戏 人数 以及关灯后 睡觉人数
  2. 统计某天关灯后 宿舍 起床次数 最多的某人
  3. 宿舍 打游戏 次数 统计 一个月 超过 30次 荣获游戏王称号 每个月有且只有一个游戏王

让我们用编程思想 来完成以下 这个《简陋的宿舍管理系统》吧!

复习OR学习数据库? 看这篇就够了!

(⊙﹏⊙)

不怎么会画!

我想表达的是 因为每个人都有共同的点 把他们抽象出来 让每个人继承它!

这样 保证了开闭原则 否则 如果 某一天 某个人突然打游戏 那么就不需要去更改父类去 而只修改它的某个人的子类

(●'◡'●) 新学的设计模式! 猜猜这个是什么设计模式?

有点扯远了! 让我们回到刚刚的问题本身。

复习OR学习数据库? 看这篇就够了!

解答:

  1. SELECT COUNT(*)FROM TABLE WHERE 开灯 AND 打游戏 ;
  2. SELECT 姓名 FROM TABLE WHERE 关灯 LIMIT 1 ORDER BY 起床次数;(猜猜我这样写行不行?)
  3. UPDATE TABLE SET 游戏王称号 = 1 where 学号 = SELECT 学号 FROM TABLE WHERE 打游戏 次数 > 30 ,日期 IN (一个月内) LIMIT 1;

评论区 分享一下你的解题思路呢?

结束语

最近在阅读《大话设计模式》这本书 书中 作者将编程与人生结合在一起 给了我很多启发,让我不自觉的就在想 这个房间里的共有的抽象类是什么? 如果这是一个编程系统 我要添加一个东西 比如板凳 如何不破坏封闭原则加入进来? 适配器模式是不是用于这里 老师 学霸 学渣 学霸辅导学渣 学霸是不是适配器模式呢? 同卓 的作业不会写 让我给他做 岂不是我成了代理模式了? 等等等等....

以及上面 哪个最后的实战 我也打算 全面一点 好好搞一下 用Java 编程出来

但我现在实在困得不行 今天就说这些! 上面最后实战内容 改天 我决定再写一篇文章 就叫生活中的编程艺术!

处处留意你的周围!

愿你对你的烦恼进行封闭 对你的快乐进行开放!

我是 新手 荔枝程序员 咱们下期再见! say goodbye!!!

找实习~~~~~~