原文
本文旨在介紹MongoDB,Mysql的常用指令:将MongoDB 和傳統的關系型資料庫的常用指令對照起來學習,更加便于記憶和了解。
MongoDB是由資料庫(database/repository)、集合(collection)、文檔對象(document)三個層次組成。MongoDB中集合對應關系型資料庫裡的表,但是集合中沒有列、行和關系的概念,這展現了模式自由的特點。
傳統的關系資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,
常用指令介紹:
MySQL | MongoDB | 說明 |
mysqld | mongod | 伺服器守護程序 |
mysql | mongo | 用戶端工具 |
mysqldump | mongodump | 邏輯備份工具 |
mongorestore | 邏輯恢複工具 | |
db.repairDatabase() | 修複資料庫 | |
mongoexport | 資料導出工具 | |
source | mongoimport | 資料導入工具 |
grant * privileges on *.* to … | Db.addUser() Db.auth() | 建立使用者并權限 |
show databases | show dbs | 顯示庫清單 |
Show tables | Show collections | 顯示表清單 |
Show slave status | Rs.status | 查詢主從狀态 |
Create table users(a int, b int) | db.createCollection("mycoll", {capped:true, size:100000}) 另:可隐式建立表。 | 建立表 |
Create INDEX idxname ON users(name) | db.users.ensureIndex({name:1}) | 建立索引 |
Create INDEX idxname ON users(name,ts DESC) | db.users.ensureIndex({name:1,ts:-1}) | |
Insert into users values(1, 1) | db.users.insert({a:1, b:1}) | 插入記錄 |
Select a, b from users | db.users.find({},{a:1, b:1}) | 查詢表 |
Select * from users | db.users.find() | |
Select * from users where age=33 | db.users.find({age:33}) | 條件查詢 |
Select a, b from users where age=33 | db.users.find({age:33},{a:1, b:1}) | |
select * from users where age<33 | db.users.find({'age':{$lt:33}}) | |
select * from users where age>33 and age<=40 | db.users.find({'age':{$gt:33,$lte:40}}) |
select * from users where a=1 and b='q' | db.users.find({a:1,b:'q'}) | |
select * from users where a=1 or b=2 | db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } ) | |
select * from users limit 1 | db.users.findOne() | |
select * from users where name like "%Joe%" | db.users.find({name:/Joe/}) | 模糊查詢 |
select * from users where name like "Joe%" | db.users.find({name:/^Joe/}) | |
select count(1) from users | Db.users.count() | 擷取表記錄數 |
select count(1) from users where age>30 | db.users.find({age: {'$gt': 30}}).count() | |
select DISTINCT last_name from users | db.users.distinct('last_name') | 去掉重複值 |
select * from users ORDER BY name | db.users.find().sort({name:-1}) | 排序 |
select * from users ORDER BY name DESC | ||
EXPLAIN select * from users where z=3 | db.users.find({z:3}).explain() | 擷取存儲路徑 |
update users set a=1 where b='q' | db.users.update({b:'q'}, {$set:{a:1}}, false, true) | 更新記錄 |
update users set a=a+2 where b='q' | db.users.update({b:'q'}, {$inc:{a:2}}, false, true) | |
delete from users where z="abc" | db.users.remove({z:'abc'}) | 删除記錄 |
db. users.remove() | 删除所有的記錄 | |
drop database IF EXISTS test; | use test db.dropDatabase() | 删除資料庫 |
drop table IF EXISTS test; | db.mytable.drop() | 删除表/collection |
db.addUser(‘test’, ’test’) | 添加使用者 readOnly-->false | |
db.addUser(‘test’, ’test’, true) | readOnly-->true | |
db.addUser("test","test222") | 更改密碼 | |
db.system.users.remove({user:"test"}) 或者db.removeUser('test') | 删除使用者 |
use admin | 超級使用者 |
db.auth(‘test’, ‘test’) | 使用者授權 |
db.system.users.find() | 檢視使用者清單 |
show users | 檢視所有使用者 |
db.printCollectionStats() | 檢視各collection的狀态 |
db.printReplicationInfo() | 檢視主從複制狀态 |
show profile | 檢視profiling |
db.copyDatabase('mail_addr','mail_addr_tmp') | 拷貝資料庫 |
db.users.dataSize() | 檢視collection資料的大小 |
db. users.totalIndexSize() | 查詢索引的大小 |
mongodb文法
MongoDB的好處挺多的,比如多列索引,查詢時可以用一些統計函數,支援多條件查詢,但是目前多表查詢是不支援的,可以想辦法通過資料備援來解決多表查詢的問題。
MongoDB對資料的操作很豐富,下面做一些舉例說明,内容大部分來自官方文檔,另外有部分為自己了解。
查詢colls所有資料
db.colls.find() //select * from colls
通過指定條件查詢
db.colls.find({‘last_name’: ‘Smith’});//select * from colls where last_name=’Smith’
指定多條件查詢
db.colls.find( { x : 3, y : “foo” } );//select * from colls where x=3 and y=’foo’
指定條件範圍查詢
db.colls.find({j: {$ne: 3}, k: {$gt: 10} });//select * from colls where j!=3 and k>10
查詢不包括某内容
db.colls.find({}, {a:0});//查詢除a為0外的所有資料
支援<, <=, >, >=查詢,需用符号替代分别為$lt,$lte,$gt,$gte
db.colls.find({ “field” : { $gt: value } } );
db.colls.find({ “field” : { $lt: value } } );
db.colls.find({ “field” : { $gte: value } } );
db.colls.find({ “field” : { $lte: value } } );
也可對某一字段做範圍查詢
db.colls.find({ “field” : { $gt: value1, $lt: value2 } } );
不等于查詢用字元$ne
db.colls.find( { x : { $ne : 3 } } );
in查詢用字元$in
db.colls.find( { “field” : { $in : array } } );
db.colls.find({j:{$in: [2,4,6]}});
not in查詢用字元$nin
db.colls.find({j:{$nin: [2,4,6]}});
取模查詢用字元$mod
db.colls.find( { a : { $mod : [ 10 , 1 ] } } )// where a % 10 == 1
$all查詢
db.colls.find( { a: { $all: [ 2, 3 ] } } );//指定a滿足數組中任意值時
$size查詢
db.colls.find( { a : { $size: 1 } } );//對對象的數量查詢,此查詢查詢a的子對象數目為1的記錄
$exists查詢
db.colls.find( { a : { $exists : true } } ); // 存在a對象的資料
db.colls.find( { a : { $exists : false } } ); // 不存在a對象的資料
$type查詢$type值為bsonhttp://bsonspec.org/數 據的類型值
db.colls.find( { a : { $type : 2 } } ); // 比對a為string類型資料
db.colls.find( { a : { $type : 16 } } ); // 比對a為int類型資料
使用正規表達式比對
db.colls.find( { name : /acme.*corp/i } );//類似于SQL中like
内嵌對象查詢
db.colls.find( { “author.name” : “joe” } );
1.3.3版本及更高版本包含$not查詢
db.colls.find( { name : { $not : /acme.*corp/i } } );
db.colls.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );
sort()排序
db.colls.find().sort( { ts : -1 } );//1為升序2為降序
limit()對限制查詢資料傳回個數
db.colls.find().limit(10)
skip()跳過某些資料
db.colls.find().skip(10)
snapshot()快照保證沒有重複資料傳回或對象丢失
count()統計查詢對象個數
db.students.find({‘address.state’ : ‘CA’}).count();//效率較高
db.students.find({‘address.state’ : ‘CA’}).toArray().length;//效率很低
group()對查詢結果分組和SQL中group by函數類似
distinct()傳回不重複值
連接配接MYSQL
格式: mysql -h主機位址 -u使用者名 -p使用者密碼
1、例1:連接配接到本機上的MYSQL。
首先在打開DOS視窗,然後進入目錄 mysqlbin,再鍵入指令mysql -uroot -p,回車後提示你輸密碼,如果剛安裝好MYSQL,超級使用者root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>
2、例2:連接配接到遠端主機上的MYSQL。假設遠端主機的IP為:110.110.110.110,使用者名為root,密碼為abcd123。則鍵入以下指令:
mysql -h110.110.110.110 -uroot -pabcd123
(注:u與root可以不用加空格,其它也一樣)
3、退出MYSQL指令: exit (回車)
注意:想要成功連接配接到遠端主機,需要在遠端主機打開MySQL遠端通路權限
方法如下:
在遠端主機中以管理者身份進入
輸入如下指令
mysql>GRANT ALL PRIVILEGES ON *.* TO 'agui'@%'IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
//賦予任何主機通路資料的權限
mysql>FLUSH PRIVILEGES
//修改生效
agui為我們使用的使用者名
密碼為123
即:在遠端主機上作好設定,我們即可通過mysql -h110.110.110.110 -uagui -p123連接配接進遠端主機
修改和取消MySQL超級使用者root密碼
(一)、密碼的修改:
使用mysqladmin指令
1、例如你的 root使用者現在沒有密碼,你希望的密碼修改為abc,那麼指令是:mysqladmin -u root password abc
2、如果你的root現在有密碼了,那麼修改密碼為abc的指令是:mysqladmin -u root -p password ‘newpassword'
注意,指令回車後會問你舊密碼,輸入舊密碼之後指令完成,密碼修改成功。
(二)、密碼的消除
1、以root登入:mysql -u root -p
2、mysql>use mysql;
3、mysql>update user set password='' where user='root';
重新開機mysql服務就生效了。
修改Mysql中普通使用者的密碼:
1.直接在資料庫中修改記錄
mysql> use mysql
mysql> update user set password = password(”new_password”) where user = “user_name”;
mysql> flush privileges;
其實這種方法就是更新一條資料庫記錄,與普通update語句不同的是,密碼加密存儲,需用password()函數來生成,另一個不同點是需要重新整理權限表。
2.在資料庫中運作set password
mysql> set password for user_name = password(”new_password”);
同第一種方法,也要重新整理權限表
3.直接在shell環境運作mysqladmin
> mysqladmin -u user_name -p password “new_password”
> mysqladmin flush-privileges
這個方法我試了幾次,每次都能将密碼記錄修改掉,但是每次修改後都無法登入,即使重新開機資料庫也無濟于事。是以建議不要采用本方法修改使用者密碼,尤其是root密碼。
4.grant all privileges on db.table to user_name@localhost identified by “your_pwd”;
使用者名密碼的生效不必用flush privileges重新整理
注:
db.table: db表示授權哪個庫,table是相應庫裡的表。可以用*.*表示所有庫所有表。注意,如果想表示某個庫的所有表,必須用db_name.*,後面的”.*”不可省略,否則權限将無法賦予。
user_name@localhost: user_name表示使用者名,localhost表示該使用者隻能在本地通路該庫,可以用%表示從任何地方通路該庫,也可以用111.11.22.33來表示位址
your_pwd: 給使用者設定的密碼
Mysql建立普通使用者
1.使用
insert into mysql.user(Host,User,Password) values("localhost","ea",password("ea"));
時有可能遇到:Field 'ssl_cipher' doesn't have a default value的錯誤。
GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
“username”替換為将要授權的使用者名,比如clientusr;
“password”替換為clientusr設定的密碼;
locaohost可以改為%,友善你從别的IP登入。
如:GRANT USAGE ON *.* TO 'ea'@'localhost' IDENTIFIED BY 'ea' WITH GRANT OPTION;
然後對你建的使用者進行授權
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON tablename.* TO 'username'@'localhost' IDENTIFIED BY 'password';
本語句中的權限根據實際需要确定:
"tablename"替換為授權通路的資料表table名
"username"是步驟2授權使用者名
"password"是步驟2授權使用者的設定密碼
這樣就為該使用者授予了對某資料表的SELECT, INSERT, UPDATE, DELETE, CAREATE, DROP權限。
如: GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON easy_activity.* TO 'ea'@'localhost' IDENTIFIED BY 'ea';
生效授權:一句話即可:FLUSH PRIVILEGES;
用MySQL建立資料庫和資料庫表
1、使用SHOW語句找出在伺服器上目前存在什麼資料庫:
|
2、建立一個資料庫abccs
mysql> CREATE DATABASE abccs;
注意不同作業系統對大小寫的敏感。
3、選擇你所建立的資料庫
mysql> USE abccs
Database changed
此時你已經進入你剛才所建立的資料庫abccs.
4、 建立一個資料庫表
首先看現在你的資料庫中存在什麼表:
mysql> SHOW TABLES;
Empty set (0.00 sec)
說明剛才建立的資料庫中還沒有資料庫表。下面來建立一個資料庫表mytable: 我們要建立一個你公司員工的生日表,表的内容包含員工姓名、性别、出生日期、出生城市。
|
由 于name、birthadd的列值是變化的,是以選擇VARCHAR,其長度不一定是20。可以選擇從1到255的任何長度,如果以後需要改變它的字 長,可以使用ALTER TABLE語句。);性别隻需一個字元就可以表示:"m"或"f",是以選用CHAR(1);birth列則使用DATE資料類型。
建立了一個表後,我們可以看看剛才做的結果,用SHOW TABLES顯示資料庫中有哪些表:
|
5、顯示表的結構:
|
6、 往表中加入記錄
我們先用SELECT指令來檢視表中的資料:
mysql> select * from mytable;
Empty set (0.00 sec)
這說明剛才建立的表還沒有記錄。 加入一條新記錄:
|
再用上面的SELECT指令看看發生了什麼變化。我們可以按此方法一條一條地将所有員工的記錄加入到表中。
7、用文本方式将資料裝入一個資料庫表
如果一條一條地輸入,很麻煩。我們可以用文本檔案的方式将所有記錄加入你的資料庫表中。建立一個文本檔案“mysql.txt”,每行包含一個記錄,用定位符(tab)把值分開,并且以在CREATE TABLE語句中列出的列次序給出,例如:
|
使用下面指令将文本檔案“mytable.txt”裝載到mytable表中:mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;
再使用如下指令看看是否已将資料輸入到資料庫表中:mysql> select * from mytable;