SQL 基础学习(2)

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);

"1" "rubyconf" "100" "1" "1" "ihower"
"2" "jsconf" "200" "1" "1" "ihower"
"3" "cssconf" "150" "2" "2" "john" 

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)

"1" "rubyconf" "100" "1" "1" "ihower"
"2" "jsconf" "200" "1" "1" "ihower"
"3" "cssconf" "150" "2" "2" "john"
"4" "htmlconf" "300" NULL  NULL  NULL  

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 的设计目的。

    如果你的数据量不到 1PB (=1000TB),你就不需要考虑这类型的数据库了,用 MySQL 或 PostgreSQL 足矣。

其他:

Graph: neo4j 图形数据库

neo4j 用节点和边来储存数据

Key-value

Redis 可说是一种小型数据结构瑞士刀,作为搭配用的数据库来使用。我们在百宝箱用 sidekiq 实作异步时看过它。

SQL 基础学习(2) Joining 和function , 作业没有做,需要看百宝箱。NOsql的概念的更多相关文章

  1. Oracle SQL 基础学习

    oracel sql 基础学习 CREATE TABLE USERINFO ( ID ,) PRIMARY KEY, USERNAME ), USERPWD ), EMAIL ), REDATE DA ...

  2. SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.

    SQL is a standard language for storing, manipulating and retrieving data in databases. 关系型数据库:RDBMS( ...

  3. SQL基础学习_04_视图

    视图 1. 视图的创建     视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作:     由于 ...

  4. sql基础学习

    学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...

  5. SQL基础学习_05_函数、谓词、CASE表达式

    函数 算术函数 1. 四则运算: +.-.*./  2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的 ...

  6. SQL基础学习_03_数据更新

    数据的插入 1. 基本INSERT语句     INSERT的基本语法为:     INSERT INTO  <表名> (列1, 列2, 列3,  -) VALUES (值1, 值2, 值 ...

  7. SQL基础学习_02_查询

    SELECT语句 1. SELECT语句查询列(字段):     SELECT <列名>    FROM <表名>;     该语句使用了两个SQL子句,SELECT子句列举了 ...

  8. SQL基础学习_01_数据库和表

    SQL语句及其种类 1. SQL语句分为三类:     DDL(Data Definition Language): CREATE.DROP.ALTER;     DML(Data Manipulat ...

  9. SQL基础学习篇--字符函数

    字符函数可与SELECT,UPDATE,DELETE RIGHT()----从右侧开始选择  SELECT RIGHT(列,字符数量) FROM 表 LEFT()----从左侧开始选择  SUBSTR ...

随机推荐

  1. Python tricks(5) -- string和integer的comparison操作

    我们都知道, python是一个强类型的语言, 也是一个动态类型的语言. 但是在python2.X系列中, 这个强类型是需要打折扣的, 是非常接近强类型. 我们来看下面的代码片段 In [1]: 'a ...

  2. 在windows上构建LLVM 7.0.1

    关于在windows上构建LLVM,网上有不少文章,但都是互相抄来的,写作时极不认真,不是少这个,就是少那个,没有一篇是可以完整照着做下来的,实在气人. 本文的安装和配置过程,我亲自操作过好几遍,不惜 ...

  3. 20145310《网络对抗》Exp2 后门原理与实践

    实验内容 (1)使用netcat获取主机操作Shell,cron启动,使用socat获取主机操作Shell, 任务计划启动. (2)使用MSF meterpreter生成可执行文件,利用ncat或so ...

  4. 从一道题看线程安全--牛客网Java基础题

    从一道题看线程安全 Java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的 ...

  5. Git 同时与多个远程库互相同步

    情形:有两个git服务器,比如github,gitosc,有个项目同时在两个服务器上,要互相同步 其实命令还是比较简单的,比如一个现有的git项目,在github,gitosc中分别创建好对应的项目. ...

  6. 【镜像地址】Maven地址列表

    1.国内OSChina提供的镜像,非常不错 <mirror> <id>CN</id> <name>OSChina Central</name> ...

  7. 51nod 1284 2 3 5 7的倍数

    从1到N 里 是2的倍数 有 N/2 个 然后大概看过这类的blog  所以运用容斥原理 直接计算 是 2 3 5 7 的个数都是多少 然后用N 减去 就是 不是2 3 5 7 的个数了 (离散好像也 ...

  8. EF、Repository、Factory、Service间关系

    EF和Repository 实体(Entities):具备唯一ID,能够被持久化,具备业务逻辑,对应现实世界业务对象. 值对象(Value objects):不具有唯一ID,由对象的属性描述,一般为内 ...

  9. HDU 6178 Monkeys(树上的二分匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:现在有一n个顶点的树形图,还有k只猴子,每个顶点只能容纳一只猴子,而且每只猴子至少和另外一只猴子通过 ...

  10. spring cloud kubernetes之serviceaccount permisson报错

    spring boot项目引用spring-cloud-starter-kubernetes <dependency> <groupId>org.springframework ...