本帖最后由 行云流水2016 于 2018-4-2 10:44 编辑
今天,我们看到的SQL,是一种在使用数据库时非常重要的语言。本篇文章会让大家更容易去理解SQL的功能,一点点努力你就会发现学习SQL可以是非常有趣和简单的。让我们开始吧。
数据库:它们是什么? 在我们开始用一个新的工具处理所有数据之前,让我们来了解一下数据库是什么。数据库是有组织的数据集合,可以是金融数据,大学学生,在线视频游戏中的玩家等等。数据库对于各种公司和机构都非常有用,并且种类繁多。
在搜索数据库或科技博客时,您可能已经看到了像Oracle,MySQL,PostgreSQL等数据库。这些被称为关系数据库管理系统。简而言之,这些软件允许我们创建和管理数据库。本篇文章中,我们将使用RDMS SQLite,它很容易设置。
关系数据库中的存储、更新、更改和删除数据通过SQL语言来实现。为了向你展示它是如何工作的,我将在SQLite中创建一个数据库,并创建与电子游戏“街头霸王5”相关的数据。
创建数据库和导入文件 我们要做的第一件事就是创建一个数据库。我们将其称为testDB。 -- Creating a new Database Note, statementsgo after sqlite> sqlite> .open C:/sqlite/testDB.db sqlite> .databases seq name file --- --------------- -------------------- 0 main C:\sqlite\testDB.db
执行! 第一行告诉SQLite我想在名为testDB的特定位置创建一个永久数据库。 第二行是确保文件已被创建。是不是很简单?但是,我们的数据库是空的,现在我们来解决这个问题。
就像我之前提到的,我在SF5中创建了一个与字符相关的CSV格式的数据文件。 和R一样,我可以把这个文件上传到数据库中,以便开始使用它。
--First create a table sqlite> create table SF5Characters( NameText Not Null, Health Int Not Null, Stun Int Not Null, Origin Text Not Null,Projectile Text Not Null,Command_Grab Text Not Null); sqlite> .mode csv sqlite> .importC:/sqlite/SF5Characters.csv SF5Characters sqlite> .header on sqlite> .mode column
在create table语句中,我创建了一个表。 这个表与R中的数据框几乎是一样的。它拥有一组特定的数据供我们查看操作等。下面的行是列的名称,列将被接受的数据类型不为空,这意味着它不会接受空白字段。每个列名都用逗号分隔,而语句以分号结尾。
接下来的两行是让SQLite知道一个CSV文件将被导入。 最后两行可以确保我们SQL语句的输出将是干净的。
使用数据:SQL语句和查询
我们现在终于可以开始玩SQL了!大多数SQL查询看起来像这样: SELECT column_name FROM table_name WHEREcolumn_name = "Frank"; filter(dataframe, column_name =="Frank") #dplyr equivalent inR
所有查询以分号结尾。查询是由语句(大写字母)组成的,这些语句构成您希望返回数据的方式。 四个最常见的陈述是: 选择:选择这个数据 更新:更改这些数据 插入:添加新数据 删除:删除这些数据 对于那些不太熟悉“街头霸王5”的人来说,下面是一些列的含义。 血量: 一个角色可以承担多大的伤害。 晕值: 一个角色在被 "震慑"或被固定之前会受到怎样的伤害。 起源: 来源哪一款街头战斗机游戏。 飞行道具: 一个角色是否有“火球”式的移动。 指令抓取: 这个角色除了通用之外还有特殊的抓取吗? 但是,以上定义暂时不重要。现在,让我们从计算下表中的行数开始: SELECT COUNT(*) FROM SF5Characters; ---------- 27 我们的第一个查询,除了有一个问题之外,其他的看起来不错。这个数据集有26条数据,为什么结果有27行? 让我们来调查一下。 sqlite> SELECT Name from SF5Characters; Name Name Ryu "Chun li" Nash "M. Bison" Cammy Birdie Ken Necalli Vega "R. Mika" Rashid Karin Zangief Laura Dhalsim F.A.N.G Alex Guile Balrog Ibuki Juri Urien Akuma Kolin Ed Abigail 找到问题了。作为数据集的一部分,列名“名称”被偶然添加进来。 让我们把它删除。 sqlite> DELETE FROM SF5Characters WHEREName = 'Name'; sqlite> SELECT COUNT(*) FROMSF5Characters; ---------- 26 现在让我们来回答一些基本的问题。街头霸王系列中的哪些角色是全新的? sqlite> SELECT * FROM SF5Characters WHEREOrigin = "SF5"; Name Health Stun Origin Projectile Command_Grab ---------- ---------- ---------- ---------- ---------- ------------ Rashid 950 1000 SF5 Yes No Laura 1000 1000 SF5 Yes Yes F.A.N.G 950 950 SF5 Yes No Alex 1025 1050 SF5 No Yes Kolin 1000 1000 SF5 Yes No Ed 1000 1000 SF5 Yes No Abigail 1100 1050 SF5 No Yes 如果在Select之后使用*,则SQL语句可以一次为您提供所有需要的数据。这是很方便的,因此你不需要用额外的语句来解决这个问题。 但是我们又遇到了一个问题,亚历克斯并不是新来的街头霸王,但内卡利是。 因此,数据需要更新。 sqlite> UPDATE SF5Characters Set Origin ="SF5" WHERE Name = "Necalli"; sqlite> UPDATE SF5Characters Set Origin ="SF3" WHERE Name = "Alex"; sqlite> SELECT * FROM SF5Characters WHEREOrigin = "SF5"; Name Health Stun Origin Projectile Command_Grab ---------- ---------- ---------- ---------- ---------- ------------ Necalli 1000 1000 SF5 No Yes Rashid 950 1000 SF5 Yes No Laura 1000 1000 SF5 Yes Yes F.A.N.G 950 950 SF5 Yes No Kolin 1000 1000 SF5 Yes No Ed 1000 1000 SF5 Yes No Abigail 1100 1050 SF5 No Yes
更新完成。到目前为止,该系列新增了7条数据。 2个角色的血量不到1000,5个有飞行道具攻击,3个有指令抓取。 我们如何组织一下呢?让我们从最低到最高的血量值列出所有人物的名单。 我们可以使用一个名为ORDER BY的语句来做到这一点。它是FROM之后的一个语句,用于在更具体的命令下返回数据。
sqlite> SELECT Name, Health FROMSF5Characters ORDER BY Health ; Name Health ---------- ---------- Akuma 900 Cammy 900 Karin 900 Dhalsim 925 Chun li 950 Nash 950 R. Mika 950 Rashid 950 F.A.N.G 950 Guile 950 Ibuki 950 Juri 950 Urien 950 Ryu 1000 M. Bison 1000 Ken 1000 Necalli 1000 Vega 1000 Laura 1000 Kolin 1000 Ed 1000 Birdie 1025 Alex 1025 Balrog 1025 Zangief 1050 Abigail 1100 如果你只想要拥有飞行工具和指令抓取的角色呢?使用AND语句很容易就能实现了, 基本上,如果那两个字段都有数据,你就可以得到结果。 sqlite> SELECT Name, Health FROMSF5Characters WHERE Projectile = "Yes" AND Command_Grab ="Yes" ORDER BY Health ; Name Health ---------- ---------- Laura 1000 在SQL中,想一想返回的数据是不是你想要的,并创建一个对应的查询。通过一些练习,你可以很快掌握这门语言。
|