Coursera课程《Using Databases with Python》 密歇根大学

Week2 Basic Structured Query Language

15.1 Relational Databases

Terminology

  • 数据库(Database) - 包含很多个表
  • 关系或表(Relation or Table) - 包含很多元组和属性
  • 元组或行(Tuple or Row) - 一组数据,它们一般代表着一个“实体”
  • 属性或列(Attribute or Column) - 与行所展示的实体相关的许多元素之一

SQL

SQL语言,是结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

15.2 Using Databases

Two Roles in Large Projects

  • Application Developer应用开发员 - 创建应用的逻辑、外观和感受 - 解决应用有关的问题
  • Database Administrator数据库管理员 - 在程序运作过程中管理和调试数据库
  • 通常两类人都参与“数据模型(Data model)”的构建

Large Project Structure

Data Analysis Structure

Common Database Systems

有三个主要的数据库管理系统被广泛使用:

  • Oracle - 大型,商业化,企业级,非常tweakable(?) - 一般用于企业
  • Mysql - 更简洁但是也更快捷和可扩展 - 商业的开源项目 - 一般用于网页
  • SqlServer - 很好 - 来自Microsoft(以及Access)

还有一些更小的项目,但是免费而且开源,比如说HSQL,SQLite,Postgress,...

15.3 Single Table CRUD

SQLite Browser

SQLite是一个非常常用的数据库,它是免费的,而且又快又小。

SQLite Browser允许我们直接操作SQLite文件,网站是http://sqlitebrowser.org/

SQLite已经植入了包括Python在内的很多语言。


安装好了之后,然后我们新建一个数据库,随意存在一个自己找得到的地方就行。新建了之后,弹出来的对话框暂且不管,关掉它。

Start Simple - A Single Table

现在我们来新建一个表。

选择执行SQL这个标签,输入下面的SQL代码。

CREATE TABLE Users(
name VARCHAR(128),
email VARCHAR(128)
)

这样,我们就创建了一个叫User的表,以及有两列。其中一列是name,最多可以有128个字符;另外一列是email,也是最多有128个字符。也就是说,我们定好了一个表的框架。

然后我们可以向这个表里添加一点数据。在浏览数据的标签页里,使用新建记录可以添加我们想要的数据。而这种方式是用户交互的方式,有点像我们使用Excel。但是这些其实相当于是应用在给我们写SQL,也就是SQL日志里显示的这些。

SQL Insert

向一个表里加一行新的记录的SQL语句如下

INSERT INTO Users(name,email) VALUES('Kristin','kf@umich.edu')

仍然在执行SQL标签页里去执行这句语句,可以看到我们这样就新建了一条记录。

SQL Delete

在一个表里删除一条特定的记录的SQL语句如下

DELETE FROM Users WHERE email='kf@umich.edu'

执行这句,我们可以发现刚刚添加的这条记录就被删除了。

这个WHERE有点像if语句,找到符合条件的记录。

SQL Update

对一个表内已有的数据进行修改的SQL语句如下

UPDATE Users SET name='Charles' WHERE email='huangyingjing@whu.edu.cn'

执行这句,就可以把找到对应email的name改为Charles。这里仍然使用到了WHERE。

Retrieving Records: Select

select语句可以取到一部分记录,同样使用WHERE就能进行筛选。

SELECT * FROM Users
SELECT * FROM Users WHERE email='huangyingjing@whu.edu.cn'

Sorting with ORDER BY

我们可以在SELECT语句中加上ORDER BY语句,这样我们的结果就能按一定的顺序排列。

SELECT * FROM Users ORDER BY email
SELECT * FROM Users ORDER BY name

Worked Example: Counting Email in a Database

import sqlite3

conn = sqlite3.connect('emaildb.sqlite')
cur = conn.cursor() cur.execute('DROP TABLE IF EXISTS Counts') cur.execute('''
CREATE TABLE Counts (email TEXT, count INTEGER)''') fname = input('Enter file name: ')
if (len(fname) < 1): fname = 'mbox-short.txt'
fh = open(fname)
for line in fh:
if not line.startswith('From: '): continue
pieces = line.split()
email = pieces[1]
cur.execute('SELECT count FROM Counts WHERE email = ? ', (email,))
row = cur.fetchone()
if row is None:
cur.execute('''INSERT INTO Counts (email, count)
VALUES (?, 1)''', (email,))
else:
cur.execute('UPDATE Counts SET count = count + 1 WHERE email = ?',
(email,))
conn.commit() # https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT email, count FROM Counts ORDER BY count DESC LIMIT 10' for row in cur.execute(sqlstr):
print(str(row[0]), row[1]) cur.close()

上面是一个建表并且更新或增加表项的过程,这个过程就会在当前目录下新建一个emaildb.sqlite的sql文件。

需要注意的是第26行commit(),只有在执行它之后才会将结果写入文件,所以放到循环外卖执行会快很多。

作业:Counting Email in a Database

注意:一定要把mbox.txt下载下来,而不是复制网页文本。不然最后统计的邮件会出错。

import sqlite3
import re conn = sqlite3.connect('emaildb.sqlite')
cur = conn.cursor() cur.execute('''
DROP TABLE IF EXISTS Counts''') cur.execute('''
CREATE TABLE Counts (org TEXT, count INTEGER)''') fname = input('Enter file name: ')
if (len(fname) < 1): fname = 'mbox-short.txt'
fh = open(fname)
for line in fh:
if not line.startswith('From: '): continue
all_org = re.findall("@(.+)\s", line)
org = all_org[0]
cur.execute('SELECT count FROM Counts WHERE org = ? ', (org,))
row = cur.fetchone()
if row is None:
cur.execute('''INSERT INTO Counts (org, count)
VALUES (?, 1)''', (org,))
else:
cur.execute('UPDATE Counts SET count = count + 1 WHERE org = ?',
(org,))
conn.commit() # https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT org, count FROM Counts ORDER BY count DESC LIMIT 10' for row in cur.execute(sqlstr):
print(str(row[0]), row[1])
cur.close()

《Using Databases with Python》 Week2 Basic Structured Query Language 课堂笔记的更多相关文章

  1. 数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)

    数据Data 描述事物的符号记录成为数据. 数据是数据库中存储的基本对象.   除了基本的数字之外.像图书的名称.价格.作者都可以称为数据. 将多种数据记录列成一张表.通过数据表管理数据. 每一行的数 ...

  2. SQL Structured Query Language(结构化查询语言) 数据库

    SQL是Structured Query Language(结构化查询语言)的缩写. SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么 ...

  3. JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language

    JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...

  4. Why sql is called structured query language?1 - 12

    SQL has much to do with a researcher at IBM, Edgar F. (Ted) Codd, an Oxford-trained mathematician, w ...

  5. PL/SQL(Procedure Language & Structured Query Language)

    目前的PL/SQL包括两部分,一部分是数据库引擎部分:另一部分是可嵌入到许多产品(如C语言,JAVA语言等)工具中的独立引擎.可以将这两部分称为:数据库PL/SQL和工具PL/SQL. PL/SQL中 ...

  6. Oracle笔记--PL/SQL(Procedure Language & Structured Query Language)

    1.PL/SQL是一种高级数据库程序设计语言,专门用于在各种环境下对Oracle数据库进行访问.该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理. 2.PL/SQL是对SQ ...

  7. 潭州课堂25班:Ph201805201 python 操作数据库 第五课 (课堂笔记)

    一 用 python 操作 mysql 1,导入 pymysql 2,检查配置文件, 3,端口转发 如果 python 在本机,数据库在远程,或虚拟机则需要 4用 python 连接 # -*- co ...

  8. 《Python Data Structures》Week5 Dictionary 课堂笔记

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week5 Dictionary 9.1 Dictionaries 字 ...

  9. 《Python Data Structures》 Week4 List 课堂笔记

    Coursera课程<Python Data Structures> 密歇根大学 Charles Severance Week4 List 8.2 Manipulating Lists 8 ...

随机推荐

  1. php引用 & 详解

    在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 $a = 222; $b = &$a; ...

  2. 【转载】平时的你VS面试的你

    https://www.cnblogs.com/rjzheng/p/10275453.html 引言 大家在面试的时候,特别是最后一面HR面,是不是经常都说自己咳咳咳.博主特意总结了一下平时的你和面试 ...

  3. 牛客假日团队赛6 D 迷路的牛 (思维)

    链接:https://ac.nowcoder.com/acm/contest/993/D 来源:牛客网 迷路的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  4. dubbo 2.8.4(dubbox)的jar包制作【添加到maven本地仓库】

    1. 下载 网址:https://github.com/hongmoshui/dubbox 2.  解压zip文件 3.  用maven编译文件 如果没有配置全局maven,就直接使用cmd命令行[进 ...

  5. 「LCT」

    终于在多篇题解和我的个人超常发挥下抄完了lct的所有题,kx死了. 理解 在我看来,实际上lct的板子没有什么考的,更重要的可能是起到一个数据结构的维护作用实际上就是出题人想给你找点乐子. 前几道题都 ...

  6. 【转】js监听浏览器离开页面操作

    [转]https://www.cnblogs.com/slly/p/7991474.html 序言 大家是否经常遇到在关闭网页的时候,会看到一个确定是否离开当前页面的提示框?想一些在线测试系统.信息录 ...

  7. Python 爬虫插件

    #coding:utf-8import sys,urllib2,re,Queuesys.path.append("..") from lib.Http_Class import H ...

  8. 理解 es7 async/await

    简介 JavaScript ES7 中的 async / await 让多个异步 promise 协同工作起来更容易.如果要按一定顺序从多个数据库或者 API 异步获取数据,你可能会以一堆乱七八糟的 ...

  9. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  10. 参数类型*&是什么意思?

    前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪 (大概是一个样子的)ListNode<T>*& l 这个参数l除了用了一个*之外还用了一个&,直觉 ...