MySQL
- 登錄:mysql -uroot -p
- 退出:exit;
- 啓動:/etc/inint.d/mysqld start
- 停止:/etc/inint.d/mysqld stop
- 重啓:/etc/inint.d/mysqld restart
用戶增刪查、授權
# 修改當前登錄用戶密碼
set password = password('新密碼');
# 查看用戶
select user,host from mysql.user;
# 創建用戶
create user '用戶名'@'loaclhost' identified by '密碼';
# 授權
grant all on 數據庫名.* to '用戶名'@'loaclhost';
# 授權root權限[ with grant option ] 代表此用戶可以給其他用戶授權
grant all on *.* to '用戶名'@'localhost' with grant option;
# 修改用戶密碼
set password for 用戶名@localhost = password('新密碼')
# 刪除用戶
drop user 用戶名@'%';
# 刷新
flush privileges;
數據定義語言(DDL)
- 查看庫:
show databases;
,會顯示當前服務器上所有的數據庫 - 創建庫:
create database test charset=utf8;
,創建數據庫test,指定字符集 - 刪除庫:
drop database test;
,刪除數據庫test - 選擇庫:
use test;
,選擇數據庫test- 查看當前使用的數據庫
show tables;
select database();
- 查看當前使用的數據庫
- 查看所有表:
show tables;
,查看當前數據庫下的所有數據表 - 創建表:
create table user(username varchar(20), password char(32));
- 查看錶結構:
desc user;
- 查看創建方式:
- 查看庫:
show create database test;
- 查看錶:
show create table user;
- 查看庫:
- 刪除表:
drop table user;
- 指定字符集:
- 創建時指定:
create table xxx() charset=utf8;
- 創建時指定:
- 修改字段:
alter table user modify username varchar(30);
,不能修改字段名alter table user change email em varchar(32);
,可以修改字段名
- 添加字段:
- 默認在最後添加:
alter table user add age int(3);
- 在指定字段後添加:
alter table user add email varchar(60) after password;
- 在開頭添加字段:
alter table user add id int(11) first;
- 默認在最後添加:
- 刪除字段:
alter table user drop age;
- 修改字段位置及名稱:add/modify/change
alter tablr user modify em varchar(32) first;
- 修改表名:
alter table user rename new_user;
數據操作語言(DML)
-
說明:在大多數的操作中,使用的都是增刪改查操作(CURD)。
-
準備:一張用於測試的表
mysql> create table tb_name( -> id int auto_increment, -> name varchar(20) not null, -> money float not null, -> province varchar(20) default null, -> age tinyint unsigned not null, -> sex tinyint not null, -> primary key(id) -> )engine=innodb default charset=utf8;
-
插入數據:
- 方式1:不指定字段,添加數據時需要寫完整所有的字段
insert into tb_name values(1, '劉亦菲', 20000000, '武漢', 28, 1);
可以一次性插入多條數據,一條數據需要使用一個()包括起來。
- 方式2:指定字段,只需要傳遞指定字段的值
insert into tb_name(name, money, age, sex, province) values('趙麗穎', 8000000, 31, 1, '河北');
插入數據的順序與前面指定的字段名要一致。
- 注意:插入數據時可以不傳值的字段
- 自增的字段
- 有默認值的
- 可以爲空的
- 說明:插入數據時,第二種方式使用的比較多。
-
查詢數據:
select * from tb_name;
-
查詢指定數據:
select * from tb_namewhere id=1;
-
修改數據:
update tb_nameset age=31, money=10000000 where id=1;
- 警告:修改操作一定不要忘了指定條件,否則後果自負。
-
刪除數據:
delete from tb_namewhere id=2;
- 警告:刪除操作一定不要忘了指定條件,否則後果自負。
查詢數據語言(DQL)
-
基礎查詢:
select * from tb_name;
-
指定字段查詢:
select name, money, province from tb_name;
-
刪除重複記錄:
select distinct province, sex from tb_name;
- 使用distinct指定的字段不能重複,指定多個字段時,字段組合不能重複
-
指定條件查詢:
-
- 示例:
select * from tb_name where age > 30; select * from tb_name where age > 30 and sex=1; select * from tb_name where age > 30 or province='河南'; select * from tb_name where age [not] between 30 and 40; select * from tb_name where id [not] in(1,3,5); select * from tb_name where province like '%北%'; # 包含北 的地區 select * from tb_name where province like '北_'; # 北x 的地區 select * from tb_name where province like '*北'; # 以北 開頭的地區 select * from tb_name where length(name)<6;
-
通配符:like模糊查詢使用
- %:表示任意個字符,可匹配任意類型和長度的字符
- _:表示單個任意字符,常用來限制表達式的字符長度語句(可以代表一箇中文字符)
- *:以某個字符開頭或結尾
-
結果集排序:
- 示例:
select * from tb_name order by age asc; select * from tb_name order by money desc;
-
- 多字段排序:當前面字段值一樣時,按照後面指定的字段進行排序
select * from tb_name order by sex asc, age desc;
-
限制結果集:
- limit:用於限制結果集的數量
-
示例:
select * from tb_name limit 5; # 取前5條數據 select * from tb_name limit 5 offset 2; # 偏移2條,取5條數據 select * from tb_name limit 2, 5; # 功能同上 省略offset的寫法 就是將偏移量放到前面 將限制每頁條數的放在後面
- 分頁查詢:
每頁10條數據,用pageSize,page是當前頁面,請寫出對於頁碼的查詢條件 第一頁:limit 10 第二頁:limit 10, 10 第三頁:limit 20, 10 page頁:limit (page-1) * pageSize, pageSize
-
常用聚合函數:
函數 說明 count 統計個數 sum 求和 avg 平均值 max 最大值 min 最小值 -
示例:
select count(*) as c from tb_name;
select max(money) as max_money from tb_name;
as可以給查詢結構字段起別名
-
分組及過濾:
- 示例:
select * from tb_name group by sex; # 只分組,結果集中每個組中只有一條數據 select count(*) as c, sex from tb_name group by sex; # 分組並統計信息 select count(*) as c, province from tb_name group by province having c>1; having後面做的是分組後的顯示過濾 # 分組後條件不能使用where,只能使用having
創建多表關係:
foreign key(o_buyer_id)references s_user(u_id),
foreign key(o_seller_id)references s_user(u_id)
alter table emp add constraint foreign key emp(deptno) refetences dept(deptno);
FOREIGN KEY(o_buyer_id) REFERENCES s_user(u_id),
FOREIGN KEY(o_seller_id) REFERENCES s_user(u_id)
ALTER TABLE EMP ADD CONSTRAINT FOREIGN KEY EMP(DEPTNO) REFERENCES DEPT (DEPTNO);
多表聯合查詢
select distinct
:清楚查詢
-
隱式內連接:沒有出現
join
關鍵字- 示例:
select username, name from user, goods where user.gid=goods.gid;
- 說明:查看哪個用戶購買了哪個商品
- 示例:
-
顯式內連接:SQL語句中出現了
join
關鍵字- 示例:
select username,name from user join goods on user.gid=goods.gid;
- 說明:功能同上
- join前可以添加
inner
或cross
關鍵字,可以省略
- 示例:
-
左外連接:以左表爲主,
left outer
- 示例:
select username, name from user left outer join goods on user.gid=goods.gid;
- 說明:顯示左表所有數據,右表有對應就顯示數據,沒有對應顯示NULL
- 示例:
-
右外連接:以右表位住,
right outer
- 示例:
select username, name from user right outer join goods on user.gid=goods.gid;
- 說明:顯示有表所有數據,左表有對應就顯示數據,沒有對應顯示NULL
- 示例:
-
子(嵌套)查詢
select * from user where gid in (1,3,5); select * from user where gid in (select gid from goods);
-
記錄聯合
- 語法:
select 語句1 union select 語句2
- 說明:
- union all:將兩邊查詢結果直接拼在一起
- union:是union all的去重結果
- 語法:
-
聯合更新數據
- 示例:
update user u, goods g set u.gid=0, g.price=g.price-200 where u.gid=g.gid and u.id=7;
- 說明:可以給操作的表起別名,還可以對字段的原有隻進行運算
- 示例:
事務處理語言(DTL)
-
說明:測試的表的存儲引擎要支持事務(InnoDB)
-
開啓事務:禁止自動提交
set autocommit=0;
-
操作回滾:通常在出現操作異常時使用
rollback;
-
提交操作:整個事務過程中沒有問題
commit;
開啓事務:
start transaction
提交事務:
commit
回滾操作:
rollback
數據控制語言(DCL)
-
查看授權:
- 格式:
show grants [for 'user'@'host'];
- 示例:
show grants for 'root'@'localhost';
- 說明:查看當前登錄用戶授權時可以不指定用戶及主機
- 格式:
-
創建用戶:
- 格式:
create user 'user'@'host' identified by 'password';
- 示例:
create user 'test'@'10.8.156.%' identified by '123456';
- 說明:%表示通配符,任意的
- 格式:
-
用戶授權:
- 格式:
grant 權限 privileges on 庫名.表名 to 'user'@'host' identified by 'password';
- 示例:
grant all privileges on *.* to 'test'@'10.8.156.%' identified by '123456';
- 說明:權限可以是select、delete、insert、update等,all表示所有權限;*表示所有
- 格式:
-
刷新權限:
flush privileges;
-
取消授權:
- 格式:
revoke 權限 privileges on 庫名.表名 from 'user'@'host';
- 示例:
revoke delete privileges on test.* from 'test'@'10.8.156.%';
- 說明:收回當前局域網內的test用戶在test庫下所有的表的刪除權限
- 格式:
-
刪除用戶:
- 格式:
drop user 'user'@'host';
- 示例:
drop user 'test'@'10.8.156.%';
- 格式:
-
linux下遠程登錄:
- 修改 /etc/mysql/mysql.conf.d/mysqld.cnf文件,
將bind-address=127.0.0.1
改爲:
bind-address=0.0.0.0- 添加指定用戶在指定主機的操作權限:
grant all privileges on *.* to 'root'@'%' identified by '123456';
備份與恢復
- 備份:
- 說明:就是將數據庫中的數據(SQL語句)保存到一個文件中
- 示例:
mysqldump -uroot -p test > test.sql
- 恢復:
- 說明:將保存SQL語句的文件解析,挨個執行其中的SQL語句
- 示例:
mysql -uroot -p test < test.sql
python操作MySQL
- 安裝擴展:
pip install pymysql
- 查看安裝包:
pip list
import MySQLdb # sqlite3
# 打開數據庫連接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# 使用execute方法執行SQL語句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取一條數據;fetchall()獲取全部;fetchmany()獲取一條,返回列表
data = cursor.fetchone()
print("Database version : %s " % data)
# 關閉數據庫連接
db.close()
Redis
Redis簡介
- Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
- 非關係型數據庫的一種,經常用作緩存數據庫服務器。
- 官網:http://www.redis.io/ 中文網:http://www.redis.cn/
- 具有豐富的數據類型:字符串、哈希、列表、集合、有序集合
- 端口:6379
redis的特點:
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份
性能極高 支持每秒讀的次數爲110000次/s,寫的速度是81000次/s
redis常用命令
-
常用管理命令:
sudo service mongod start:重啓服務 mongo:連接redis ping:測試連接情況,默認恢復'PONG' quit/exit:退出客戶端 auth:密碼認證 config:配置命令,可以查看和設置配置信息,參考密碼查看與設置 info:查看服務器信息,可以指定具體模塊查看 command:查看支持的命令 select:選擇庫,總共16個,默認爲0數據庫;提示符後會有庫號的提示,沒有就是默認的庫(0) dbsize:查看當前庫key的數量 flushdb:清空當前庫 flushall:清空所有庫 save:前臺執行持久化存儲 bgsave:後臺執行持久化存儲
-
鍵(keys):
exists:判斷指定的鍵是否存在 del:刪除指定的鍵值對 keys *:查看指定樣式的鍵,keys *表示查看所有 ttl:查看指定鍵的剩餘有效時間,單位爲秒,不存在鍵返回-2,永久返回-1 expire:設置指定鍵的生存時間 persist:移除指定鍵的生存時間,之後該鍵永久有效 move:移動指定的鍵到指定的庫 rename:修改指定鍵的名字
-
字符串(string)
set:設置,存在就修改,不存在就添加 get:獲取,獲取指定鍵的值 mset:同時設置多個鍵值對 mget:同時獲取多個鍵對應的值 getset:設置新值,同時返回舊值 setex:設置值及過期時間,單位爲秒 incr:數字值加1 decr:數字值減1 incrby:數字值加上指定值 decrby:數字值減去指定值 incrbyfloat:數字值加上一個浮點數 append:鍵存在,值爲字符串,追加指定的內容到原值的末尾 strlen:返回鍵對應值的字符長度
-
哈希(hash)
hset:設置單個屬性 hget:獲取單個屬性 hmset:設置多個屬性 hmget:獲取多個屬性 hgetall:獲取所有屬性 hexists:判斷指定鍵是否有指定的字段 hdel:刪除指定鍵的指定字段 hkeys:獲取指定鍵的所有字段 hvals:獲取指定鍵的所有字段值 hlen:獲取指定鍵的字段個數 hincrby:在指定鍵的指定字段上增加一個整數 hincrbyfloat:在指定鍵的指定字段上增加一個浮點數
-
列表(list)
lpush:從左邊(頭部)插入數據 lpop:從左邊(頭部)刪除並返回數據 lrange:獲取區間內的數據,0 -1通常可以表示所有範圍 lindex:根據索引獲取元素 llen:統計列表中元素個數 lset:設置指定索引的元素值 lrem:刪除指定數量的元素 linsert:在指定元素的前/後插入元素(before) ltrim:修剪列表元素(保留指定範圍內地,刪除其他) rpop:從右邊(尾部)刪除並返回數據 rpush:從右邊(尾部)插入數據
-
集合
sadd: 向集合中添加一個元素 scard: 獲取集合中的成員數 smembers:返回集合中的所有成員 spop:移除並返回集合中的一個隨機元素
redis的發佈訂閱:
Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的三個客戶端:
創建訂閱頻道名
subscribe name
通過publish name去往頻道名字裏面推送信息
然後客戶端就能收到此訂閱信息
數據類型
-
字符串、哈希、列表
-
集合(set)
sadd:向集合中添加元素(集合不存在會自動創建) scard:統計集合中元素的個數 smembers:返回所有元素 sismember:判斷某個元素是否是集合的成員 spop:隨機刪除並返回指定個數的元素,不指定個數默認一個元素 srandmember:隨機獲取指定個數的元素 srem:移除指定元素 smove:將指定的元素從一個集合移動到另一個集合中 sinter:求交集 sinterstore:求交集並保存到一個集合中 sdiff:求差集 sdiffstore:求差集並保存到一個集合中 sunion:求並集 sunionstore:求並集並保存到一個集合中
-
有序集合(sorted set)
zadd:添加元素 zcard:統計元素個數 zcount:指定分數區間統計 zrange:返回指定索引範圍內的元素(升序),zrevrange:降序 zrangebyscore:返回指定分數區間的元素(升序),zrevrangebyscore:降序 zrank:返回指定元素的索引(升序),zrevrank:降序 zrem:移除元素 zscore:返回元素的分數 zincrby:將元素的分數增加一個值 zinterstore:求交集並保存 zunionstore:求並集並保存
Python操作Redis
-
安裝擴展:
pip install redis
-
簡介:
redis擴展庫中有兩個類,Redis和StrictRedis;StrictRedis實現了官方的命令,Redis是它的子類,兼容老版本。擴展中沒有提供select方法,可以在連接時通過參數指定庫。
-
操作:
- 簡單連接:導入類庫,創建Redis對象,然後所有的命名都是Redis對象的方法
- 連接池:多個Redis使用同一個連接池連接,減少了頻繁的連接、斷開數據庫的開銷
- 使用管道:可以先記錄多條命令,然後一次性發送到服務器,避免了多次操作服務器的開銷
redis的安裝:
第一種方法:
1.首先在官網上下載redis最新的版本,命令如下:
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
2.解壓下載的redis壓縮包
tar -vxzf redis-4.0.8.tar.gz
3.進入src目錄並make
make
4.編譯完成後可以使用如下命令進行測試
make test
注:如果make過程中出現瞭如下錯誤:
error: jemalloc/jemalloc.h: No such file or directory
就執行make MALLOC=libc 就OK了,不過在執行這一句之前最好先執行
make clean清理一下。
啓動方法 在src目錄下 ./redis-server
第二種方法:
sudo apt-get update
sudo apt-get install redis-server
啓動 Redis
redis-server
查看 redis 是否啓動?
redis-cli
以上命令將打開以下終端:
redis 127.0.0.1:6379>
127.0.0.1 是本機 IP ,6379 是 redis 服務端口。現在我們輸入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
有時候會有中文亂碼 連接的時候需要 redis-cli --raw
MongoDB
MongoDB簡介
-
MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
-
是一個介於關係型數據庫和非關係型數據庫之間的產品,是非關係型數據庫中最像關係型數據庫的一種,是功能最豐富的非關係型數據庫。
-
安裝和卸載:
1.導入軟件源的公鑰sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
2.爲mongodb創建軟件源list文件 ubuntu12.04: echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list ubuntu14.04: echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list ubuntu16.04: echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list 3.更新軟件源並安裝mongodb sudo apt-get update sudo apt-get install -y mongodb-org 如果想要安裝特定的版本,使用下面命令: sudo apt-get install -y mongodb-org=3.2.9 mongodb-org-server=3.2.9 mongodb-org-shell=3.2.9 mongodb-org-mongos=3.2.9 mongodb-org-tools=3.2.9 4.配置啓動文件 如果是ubuntu16.04的版本,需要手動新建/lib/systemd/system/mongod.service文件,並寫入下面內容: [Unit] Description=High-performance, schema-free document-oriented database After=network.target Documentation=https://docs.mongodb.org/manual [Service] User=mongodb Group=mongodb ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf [Install] WantedBy=multi-user.target
5.啓動、重啓和關閉命令
sudo service mongod start
sudo service mongod restart
sudo service mongod stop
6.mongodb的完全卸載
先停止運行mongodb
sudo service mongod stop
再卸載軟件
sudo apt-get purge mongodb-org*
刪除數據庫和日誌文件
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
如果想要使用遠程連接mongo 那麼需要
sudo vim /etc/mongo.conf
找到net 將 127.0.0.1 改爲0.0.0.0即可
連接到mongodb
直接在終端輸入 mongo
MySQL與MongoDB對比
-
相關概念
MySQL MongoDB database(數據庫) db(數據庫) table(數據表) collection(集合) row(行) document(文檔) column(列) field(域/字段)
db操作
- 查看所有數據庫:
show dbs
,若數據庫中沒有數據,則不會顯示出來 - 查看當前數據庫:
db
或db.getName()
- 創建並切換數據庫:
use python1806
- 數據庫存在直接切換,不存在創建後再切換
- 當數據庫中沒有數據時,
show dbs
不會顯示
- 刪除當前數據庫:
db.dropDatabase()
- 查看幫助:
help
- 退出:
exit
或quit()
collection操作
- 查看當前數據庫下的所有集合:
show collections
- 創建集合:
- 單純創建:
db.createCollection('user')
,會創建一個空集合 - 按需創建:
db.stu.insert({name:'shuorui', age:30})
,直接操作不存在的集合,系統會自動創建
- 單純創建:
- 刪除集合:
db.stu.drop()
document操作
-
增加文檔:
- insert
# 插入一條數據 db.user.insert({name:'jiwei', age:29, height:175, isDelete:0}) # 插入多條數據 db.user.insert([{name:'zhihui',age:18, height:168, isDelete:0},{name:'minghui', age:28, height: 173, isDelete:0}])
- save
# 保存的數據沒有_id字段,會插入一個新的文檔 db.user.save({name:'wenke', age:40, height:178, isDelete:0}) # 保存的數據有_id字段,會修改對應的數據 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:30, height: 178, isDelete:0})
-
更新文檔
- save
# 保存的數據有_id字段,會修改對應的數據,就相當於更新操作 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:25, height: 178, isDelete:0})
- update:
db.集合.update(query, update, {upsert:<boolean>, multi:<boolean>})
- query:表示查詢條件
- update:表示更新設置的內容
- $set:表示設置
- $inc:表示增加
- upsert:更新的查詢結果不存在,是否作爲新數據插入,默認爲false
- multi:符合條件的數據是否全部更新;true表示全部更新,false表示更新一條,默認爲false
db.user.update({age: 25}, {$set:{age:26}}) # 只會更新一條 db.user.update({height:175}, {$inc:{height: 1}}, {multi: true}) # 會更新全部 db.user.updateMany({isDelete: 1}, {$set:{isDelete: 0}}) # 更新全部
-
刪除文檔
- remove:
db.集合.remove(query,{justOne:<boolean>})
db.user.remove({height: 176}) # 默認刪除所有數據 db.user.remove({isDelete:0}, {justOne:true}) # 只會刪除一條數據
- delete:官方推薦
db.user.deleteOne({isDelete: 0}) # 刪除一條數據 db.user.deleteMany({isDelete: 0}) # 刪除所有數據
- remove:
-
查詢文檔
- 格式:
db.集合.find(query, {key1:0/1, key2:0/1, keyn:0/1})
- query:查詢條件
- key:表示字段名
- 第二個參數要麼同時爲1表示顯示的字段,要麼同時爲0表示排除的字段
db.user.find({},{name:1, age:1}).pretty() # 只顯示name和age db.user.find({},{name:0, age:0}).pretty() # 不顯示name和age
- pretty():格式化顯示數據(類似於字典形式顯示)
db.user.find().pretty()
- findOne
db.user.findOne({isDelete:0}) # 只返回條數據
- 格式:
虛擬環境
什麼是虛擬環境:
一個隔離了外界干擾的,獨立的環境
虛擬環境的搭建:
1.pip install virtualenv
2.pip install virtualenvwrapper
3.whereis virtualenvwrapper.sh
4.source 上面的路徑信息
5.source ~/.bashrc
mkvirtualenv name 創建虛擬環境名稱(name就是自定義的虛擬環境名字)
rmvirtualenv name 刪除虛擬環境名稱
workon name 使用某個虛擬環境
deactivate 退出虛擬環境
6.重新打開終端 然後 sudo vim ~/.bashrc
export=/home/huguanyu/.virtualenvs
source /usr/share/virtualenvwrapper
然後強制保存
7.重新source ~/.bashrc
pip install --user virtualenv