说明:后一个范式,都是在前一个范式的基础上建立的
ubuntu中先切换到root账户,sudo -s
,然后
sudo apt-get install mysql-server mysql-client
service mysql start
service mysql stop
service mysql restart
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address=127.0.0.1
注释grant all privileges on *.* to 'root'@'%' identified by 'mysql' with grant option;
flush privileges;
mysql -uroot -p
####退出
exit;
或quit
远程连接
mysql -hip地址 -uroot -p
create database 数据库名 charset=utf8;
drop database 数据库名;
use 数据库名;
select database();
show databases;
show tables;
create table 表名(列及类型);
如:
create table students(
id int auto_increment primary key,
sname varchar(10) not null
);
alter table 表名 add|change|drop 列名 类型;
drop table 表名;
desc 表名;
rename table 原表名 to 新表名;
show create table '表名';
select * from 表名
全列插入:insert into 表名 values(...)
缺省插入:insert into 表名(列1,...) values(值1,...)
同时插入多条数据:insert into 表名 values(...),(...)...;
或insert into 表名(列1,...) values(值1,...),(值1,...)...;
update 表名 set 列1=值1,... where 条件
delete from 表名 where 条件
本质就是修改操作update
sudo -s
cd /var/lib/mysql
mysqldump –uroot –p 数据库名 > ~/Desktop/备份文件.sql;
mysql -uroot –p 数据库名 < ~/Desktop/备份文件.sql
select distinct gender from students;
like
%
表示任意多个任意字符_
表示一个任意字符in
表示在一个非连续的范围内between ... and ...
表示在一个连续的范围内为了快速统计结果,提供了5个聚合函数。
分组的目的是为了聚合
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
select后面的列必须是在group by后面出现的列名。
比如select gender as 性别,count(*) from students group by gender;
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...
where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
having是对group by的结果进行筛选
select * from 表名
order by 列1 asc|desc,列2 asc|desc,...
select * from 表名
limit start,count
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
inner join
select *
from tableName
inner join tableName2 on condition
inner join tableName3 on condition2 ...
create view view_name as
select * from tableName
where ...;
select * from view_name;
innodb或bdb
类型,才可以对此表使用事务查看表的创建语句
show create table 表名;
修改表的类型
alter table '表名' engine=innodb;
事务语句
开启begin;
提交commit;
回滚rollback;
索引能提高数据库访问性能。
查看索引
show INDEX from tableName
创建索引
create INDEX indexName ON tableName(colName(length),colName2...)
删除索引
drop INDEX [indexName] ON tableName
缺点:
在执行更新操作时需要额外更新索引。
MySQL中测试执行时间
1、set profiling=1;
2、some operation
3、show profiles;show profile
Linux下安装
sudo apt-get install python-mysqldb
Mac下安装:
1、下载地址:https://sourceforge.net/projects/mysql-python
2、解压,cd到这个目录
3、sudo -s 切换到root用户
4、python setup.py install
遇到一些问题可以参考以下博客解决:http://www.cnblogs.com/ppsunlight/p/3817142.html
http://blog.csdn.net/u010499721/article/details/49048643
http://blog.csdn.net/wirelessqa/article/details/50506056
sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.12-intel.egg/_mysql.so
引用
import Mysqldb
创建对象:调用connect()方法:conn=connect(参数列表)
对象的方法
cursor1=conn.cursor()
对象的方法
对象的属性
sname = '北京'
params=[sname] #list
count=cs1.execute('insert into areas(name) values(%s)',params)
类型 | 部分代表 | 特点 |
---|---|---|
列存储 | Hbase、Cassandra、Hypertable | 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 |
文档存储 | MongoDB、CouchDB | 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。 |
key-value存储 | Tokyo Cabinet / Tyrant、Berkeley DB、MemcacheDB、Redis | 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) |
图存储 | Neo4J、FlockDB | 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
对象存储 | db4o、Versant | 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据 |
xml数据库 | Berkeley DB XML、BaseX | 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。 |
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table | joins | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
三元素:数据库,集合,文档
文档,就是一个对象,由键值对构成,是json的扩展Bson形式{'name':'guojing','gender':'男'}
tar -zxvf mongodb.tgz
brew
安装brew install mongodb --with-openssl
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
export PATH=/usr/local/mongodb/bin:$PATH
Mac下安装可以直接使用
brew update
,brew install mongodb
,然后使用mongod —config /usr/local/etc/mongod.conf
启动mongodb的服务
MongoDB官网https://www.mongodb.com/
sudo service mongod start
sudo service mongod stop
mongo
命令
db
查看当前数据库名称db.stats()
查看当前数据库信息show dbs
列出所有在物理上存在的数据库use 数据库名称
切换数据库。如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建;默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中db.dropDatabase()
删除当前指向的数据库,如果数据库不存在,则什么也不做db.createCollection(name, options)
选项参数是可选的
show collections
查看当前数据库的集合
db.集合名称.drop()
删除集合语法:db.集合名称.insert(document)
如db.test.insert({name:'bendeng'})
- 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
语法:db.集合名称.find()
语法
db.集合名称.update(
<query>,
<update>,
{multi: <boolean>}
)
db.test.update({},{name:"newName"})
$set
,db.test.update({},$set:{name:"newName"})
语法:db.集合名称.save(document)
语法:
db.集合名称.remove(
<query>,
{
justOne:
}
)
db.test.remove({_id:1234})
db.stu.remove({})
db.集合名称.find({条件文档})
db.集合名称.findOne({条件文档})
只返回第一条db.集合名称.find({条件文档}).pretty()
将结果格式化$or
。db.stu.find({or:[{_id:{gt:18}},{name:”bendeng”}]})使用$in
,$nin
判断是否在某个范围内
db.test.find({_id:{$in:[18,28]}})
使用//
或$regex
编写正则表达式
db.test.find({name:/^p/})
db.test.find({name:{$regex:’^p’}}})
使用$where
后面写一个函数,返回满足条件的数据
db.test.find({$where:function(){return this.id>20}})
用于读取指定数量的文档
语法:db.集合名称.find().limit(NUMBER)
- 参数NUMBER表示要获取文档的条数
- 如果没有指定参数则显示集合中的所有文档
用于跳过指定数量的文档
语法:db.集合名称.find().skip(NUMBER)
- 参数NUMBER表示跳过的记录条数,默认值为0
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段。如:一个文档有5个字段,需要显示只有3个,投影其中3个字段即可
语法:db.集合名称.find({},{字段名称:1,...})
- 参数为字段与值,值为1表示显示,值为0不显示
- 对于需要显示的字段,设置为1即可,不设置即为不显示
- 特殊:对于_id列默认是显示的,如果不显示需要明确设置为0db.test.find({},{_id:0})
语法:db.集合名称.find().sort({字段:1,...})
- 参数1为升序排列
- 参数-1为降序排列
如:db.test.find().sort({name:1})
,结果是:
{ "_id" : ObjectId("59e1c73d82debd5e42f2d81a"), "name" : "huhu" }
{ "_id" : ObjectId("59e1c73882debd5e42f2d819"), "name" : "kaixin" }
{ "_id" : ObjectId("59e1c61682debd5e42f2d818"), "name" : "newDocumanet" }
{ "_id" : ObjectId("59e1c74082debd5e42f2d81b"), "name" : "pupu" }
语法:db.集合名称.find({条件}).count()
或者db.集合名称.count({条件})
例如:统计年龄大于20的男生人数
db.stu.count({age:{$gt:20},gender:1})
语法:db.集合名称.distinct('去重字段',{条件})
主要用于计算数据,类似sql中的sum()、avg()
语法:db.集合名称.aggregate([{管道:{表达式}}])
ps ajx | grep mongo
如:db.test.aggregate([{$group:{_id:'$name',c:{$sum:1}}}])
这里将name字段进行group分组,并查出每个名字的个数。
结果是
{ "_id" : "panpan", "c" : 3 }
{ "_id" : "pupu", "c" : 1 }
{ "_id" : "huhu", "c" : 1 }
{ "_id" : "kaixin", "c" : 1 }
{ "_id" : "newDocumanet", "c" : 1 }
表达式:’$列名’
db.test.ensureIndex({"name":1})
db.test.ensureIndex({"name":1},{"gender":1})
db.test.getIndexes()
db.test.dropIndex({"name":1})
db.test.ensureIndexes()
角色-用户-数据库
的安全管理方式use admin
db.createUser({
user:'admin',
pwd:'123',
roles:[{role:'root',db:'admin'}]
})
sudo vi /etc/mongod.conf
security:
authorization: enabled
sudo service mongod stop
sudo service mongod start
mongo -u 'admin' -p '123' --authenticationDatabase 'admin'
mongod --bind_ip 192.168.196.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
mongod --bind_ip 192.168.196.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
mongo --host 192.168.196.128 --port 27017
rs.initiate()
rs.status()
rs.add('192.168.196.128:27018')
mongo --host 192.168.196.128 --port 27018
rs.slaveOk()
rs.slaveOk()
db.t1.find()
其它
- 删除从节点rs.remove('192.168.196.128:27018')
- 关闭主服务器后,再重新启动,会发现原来的从服务器变为了从服务器,新启动的服务器(原来的从服务器)变为了从服务器
语法:mongodump -h dbhost -d dbname -o dbdirectory
sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
语法:mongorestore -h dbhost -d dbname --dir dbdirectory
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
查看官方文档
安装pymongo:pip install pymongo
Mac中安装使用
sudo python -m pip install pymongo
1、去Redis官网下载最新的稳定版。目前是4.0.2。curl -O http://download.redis.io/releases/redis-4.0.2.tar.gz
2、解压tar zxvf redis-4.0.2.tar.gz
3、复制:推荐放到usr/local目录下
sudo mv -r redis-3.2.3/* /usr/local/redis/
进入redis目录
cd /usr/local/redis/
4、sudo make
,sudo make test
5、安装:将redis的命令安装到/usr/bin/目录。sudo make install
6、运行redis-server
,按Ctrl+C停止
7、启动客户端:在新终端中运行如下代码。redis-cli
bind 127.0.0.1
port 6379
daemonize no|yes
dbfilename dump.rdb
dir的默认值为./,表示当前目录。推荐改为:dir /var/lib/redis
sudo cp /usr/local/redis/redis.conf /etc/redis/
sudo redis-server /etc/redis/redis.conf
ps ajx|grep redis
sudo kill -9 redis的进程id
set key value
get key
SETEX key seconds value
MSET key value [key value ...]
MGET key [key ...]
INCR key
INCRBY key increment
DECR key
DECRBY key decrement
APPEND key value
STRLEN key
KEYS pattern
比如KEYS *
EXISTS key [key ...]
TYPE key
DEL key [key ...]
EXPIRE key seconds
TTL key
HSET key field value
HMSET key field value [field value ...]
HGET key field
HMGET key field [field ...]
HGETALL key
HKEYS key
HLEN key
HVALS key
HEXISTS key field
HDEL key field [field ...]
HSTRLEN key field
LPUSH key value [value ...]
RPUSH key value [value ...]
LINSERT key BEFORE|AFTER pivot value
LSET key index value
LPOP key
RPOP key
LRANGE key start stop
LTRIM key start stop
LLEN key
LINDEX key index
SADD key member [member ...]
SMEMBERS key
SCARD key
SINTER key [key ...]
SDIFF key [key ...]
SUNION key [key ...]
SISMEMBER key member
ZADD key score member [score member ...]
ZRANGE key start stop
ZCARD key
ZCOUNT key min max
ZSCORE key member
SUBSCRIBE 频道名称 [频道名称 ...]
UNSUBSCRIBE 频道名称 [频道名称 ...]
PUBLISH 频道 消息
bind 192.168.1.10
bind 192.168.1.11
slaveof 192.168.1.10 6379
set hello world
get hello
sudo pip install redis
或者使用源码安装
unzip redis-py-master.zip
cd redis-py-master
sudo python setup.py install
import redis
try:
r=redis.StrictRedis(host='localhost',port=6379)
except Exception,e:
print e.message
r.set('name','hello')
r.get('name')
pipe = r.pipeline()
pipe.set('name', 'world')
pipe.get('name')
pipe.execute()
import redis
class RedisHelper():
def __init__(self,host='localhost',port=6379):
self.__redis = redis.StrictRedis(host, port)
def get(self,key):
if self.__redis.exists(key):
return self.__redis.get(key)
else:
return ""
def set(self,key,value):
self.__redis.set(key,value)