SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念
Joining
可以同时关联(joining)多张表进行复杂的查询。
相比于用Rails捞出数据再用Ruby进行过滤组合,使用SQL更加高效,节能。
以下是 users has_many events的情景,打开DB Browser for SQLite 并新建一个文件demo2.db.
在terminal中执行sqlite3 demo2.db
CREATE TABLE events (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, capacity INTEGER, user_id INTEGER);
CREATE TABLE users (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT);
INSERT INTO users (name) VALUES ('ihower');
INSERT INTO users (name) VALUES ('john');
INSERT INTO users (name) VALUES ('roy');
INSERT INTO events (name, capacity, user_id) VALUES ('rubyconf',100, 1);
INSERT INTO events (name, capacity, user_id) VALUES ('jsconf', 200, 1);
INSERT INTO events (name, capacity, user_id) VALUES ('cssconf', 150, 2);
INSERT INTO events (name, capacity, user_id) VALUES ('htmlconf', 300, NULL);
跨Tables进行Joining查询,常用的有Inner Joining 和 Left Outer Joining两种:
1. Inner joining合并两张tables,接不起来就不要:
捞出所有活动和该活动的主办人资料:
Classic写法:
SELECT * FROM events INNER JOIN users ON events.user_id = users.id;
Old 写法:
SELECT * FROM events, users WHERE events.user_id = users.id;
对应的Rails语法是 Users.joins(:events);
2. Outer joining合并两张tables,接不起来就填NUll:
捞出所有活动和该活动的主办人资料,包括没有主办人的活动:
SELECT * FROM events LEFT OUTER JOIN users ON events.user_id = users.id;
left outer join 和 left join 一样。
对应的Rails语法是 Users.left_outer_joins(:events) //可以查API(看QueryMethods)
AS语法 (alias)
因为在多张tables进行查询时,可能会出现重复的column name,这时在WHERE条件里可能无法判断,而且可以加上别名AS
Includes(*args)
Specify relationships to be included in the result set.
Event.includes(:user) 相当于另一种SQL策略来Outer joining。
不同的连接组合:
(维恩图,涉及intersect and except)
https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
更好的diagram,Join diagrams!
https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/
Functions
数据库提供一些函数可以用在SQL中:
Aggregate:
['æɡrɪɡət; (for v.) æɡrɪˌɡet]
to put different amounts, pieces of information etc together to form a group or a total
计算
1.数量
SELECT COUNT(*) AS event_count FROM events;//加上AS别名才比较好识别处理
对应的Rails语法是Event.count
2.MIN(列), MAX(列)
对应的Rails语法是Event.minimum()和Event.maximum();
3. SUM(列)
对应的Rails语法是Events.sum()
4.平均有两种 SUM()/COUNT() 或者AVG()
对应的Rails语法是Events.average(列)
分类GROUP BY
GROUP BY 分类功能主要是用来搭配上述 aggregating function 来使用的,例如请回答这个问题:计算每个 user 有多少 events?
SELECT users.name, COUNT(events.id)
FROM users LEFT JOIN events
ON users.id = events.user_id
GROUP BY user_id;
可再加条件和排序: having 和 order by
SELECT users.name, COUNT(events.id) AS c
FROM users LEFT JOIN events
ON users.id = events.user_id
GROUP BY user_id
HAVING c > 1
ORDER BY c DESC;
其中 WHERE 是给 source tables 的条件,HAVING 才是 aggregation 内的条件函数
aggregate:
['æɡrɪɡət; (for v.) æɡrɪˌɡet]总计合计
the total after a lot of different figures or points have been added together
distinct
可以去除重复的数据
SELECT DISTINCT(user_id) FROM events;
数据库还有提供其他函数,例如 字串 SQLite - Useful Functions、时间 SQLite - Date And Time Functions等等。
wiki百科解释sqlite3:
https://zh.wikipedia.org/wiki/SQLite
NOsql
非关系型数据库:
Column-Oriented:
关系型数据库的 Transaction 事务的缺点是效能。数据库在做 Transaction 事务时,不可避免地必须锁住一些数据,避免其他人同时修改。因此如果是一个写入流量非常大的网站,就说是一个售票网站好了,非常多人在开票时准时抢票,这时候数据库的效能就会非常差。
cap theorem :
它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistence)(等同于所有节点访问同一份最新的数据副本)
- 可用性(Availability [ə,velə'bɪləti])(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
- 分区容错性(Network partitioning)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)
根据CAP 定理告诉我们: RDBMS 在多服务器(P)架构下为了维持 C 特性,只能牺牲 A、NoSQL 让你有 tradeoff 的空间,牺牲 C 特性以换得 A、但这不是 C 和 A 二元的选择,而是 C 和 delay 延迟时间的取舍,你愿意容忍多少延迟时间才算作不 Available。
因此这类型的 NoSQL 不讲 ACID,而是讲 BASE 特性 (Basically Available, Soft state, Eventual consistency最终的一致性),重点是 Eventual consistency。想像一个场景: Facebook 和 Twitter 贴文,当你贴文成功的时候,并不是当下马上其他人就可以看到你的贴文,这中间其实是有延迟时间的。这个延迟对于关系型数据库来说是不可以接受的,但是对于这种社交应用来说,却没有关系。牺牲 Consistence 一致性,就可以换到更多的写入反应效能,这就是这类型的 NoSQL 的设计目的。
- Apache HBase 分布式、强调超大 Table: billions of rows X millions of columns (PB以上等级) (Google Big Table 的开源版本,由 Yahoo 推出)
- Apache Cassandra 分布式、最终一致性,高写入场景 (Amazon Dynamo 的开源版本,由 Facebook 推出)
- Amazon DynamoDB
- Google Cloud Datastore
其他:
Graph: neo4j 图形数据库
neo4j 用节点和边来储存数据
Key-value
Redis 可说是一种小型数据结构瑞士刀,作为搭配用的数据库来使用。我们在百宝箱用 sidekiq 实作异步时看过它。
SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念的更多相关文章
- Oracle SQL 基础学习
oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...
- SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...
- SQL基础学习_04_视图
视图 1. 视图的创建 视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作: 由于 ...
- sql基础学习
学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...
- SQL基础学习_05_函数、谓词、CASE表达式
函数 算术函数 1. 四则运算: +.-.*./ 2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的 ...
- SQL基础学习_03_数据更新
数据的插入 1. 基本INSERT语句 INSERT的基本语法为: INSERT INTO <表名> (列1, 列2, 列3, -) VALUES (值1, 值2, 值 ...
- SQL基础学习_02_查询
SELECT语句 1. SELECT语句查询列(字段): SELECT <列名> FROM <表名>; 该语句使用了两个SQL子句,SELECT子句列举了 ...
- SQL基础学习_01_数据库和表
SQL语句及其种类 1. SQL语句分为三类: DDL(Data Definition Language): CREATE.DROP.ALTER; DML(Data Manipulat ...
- SQL基础学习篇--字符函数
字符函数可与SELECT,UPDATE,DELETE RIGHT()----从右侧开始选择 SELECT RIGHT(列,字符数量) FROM 表 LEFT()----从左侧开始选择 SUBSTR ...
随机推荐
- Eclipse 启动项目错误:class not found
其中,很可能的原因:项目存在编译错误,根本没有编译成功,没有生成class文件:可查看problems标签页查看具体错误.
- Hive 大数据倾斜总结
在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...
- linux常用命令:wget 命令
wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...
- 2018跳槽面试必备之深入理解 Java 多线程核心知识
导语:多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线 ...
- P3366 【模板】最小生成树(堆优化prim)
堆优化prim #include<cstdio> #include<cstring> #include<queue> using namespace std; st ...
- CentOS7防火墙之firewalld
今天在centos7上装mysql8,装好了之后发现主机的navicat始终连不上centos中的mysql 搜索发现是防火墙的问题,已查看iptables,嗯?没有了这个防火墙,原来centos换防 ...
- 20145333茹翔《网络对抗技术》Exp6 信息搜集技术
20145333茹翔<网络对抗技术>Exp6 信息搜集技术 实验内容 本次实验的目标是掌握信息搜集的最基础技能.具体有(1)各种搜索技巧的应用(2)DNS IP注册信息的查询 (3)基本的 ...
- 基于Android应用《玩转英语》(总报告)
基于Android应用<玩转英语> 摘 要 ...
- 2018-2019-1 20189218《Linux内核原理与分析》第四周作业
构造简单的Linux内核 显然用实验楼配好的环境做这个实验太简单了,按照没有困难制造困难也要上的原则,在自己的64位虚拟机上做这个实验. 按照课本(视频)上的步骤一直做下去,到编译生成init时出现了 ...
- 怎么在VS监视DataSet类型的数据
旧版本 先监视DataSet,打开dataset,dataset下面有一个tablesTables打开有一个非公共成员,然后下面有一个List,List中存储了每一张表的信息 下图所示的List下面的 ...