首页 > 代码库 > MongoDB与Mysql常用命令解释
MongoDB与Mysql常用命令解释
原文
本文旨在介绍MongoDB,Mysql的常用命令:将MongoDB 和传统的关系型数据库的常用命令对照起来学习,更加便于记忆和理解。
mongodb与mysql命令对比
MongoDB是由数据库(database/repository)、集合(collection)、文档对象(document)三个层次组成。MongoDB中集合对应关系型数据库里的表,但是集合中没有列、行和关系的概念,这体现了模式自由的特点。
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,
一、常用命令介绍:
MySQL | MongoDB | 说明 |
mysqld | mongod | 服务器守护进程 |
mysql | mongo | 客户端工具 |
mysqldump | mongodump | 逻辑备份工具 |
mysql | mongorestore | 逻辑恢复工具 |
| db.repairDatabase() | 修复数据库 |
mysqldump | 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 | db.users.find().sort({name:-1}) | 排序 |
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连接进远程主机使用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”);
mysql> flush privileges;
同第一种方法,也要刷新权限表
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语句找出在服务器上当前存在什么数据库:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 3 rows in set (0.00 sec) |
2、创建一个数据库abccs
mysql> CREATE DATABASE abccs;
注意不同操作系统对大小写的敏感。
3、选择你所创建的数据库
mysql> USE abccs
Database changed
此时你已经进入你刚才所建立的数据库abccs.
4、 创建一个数据库表
首先看现在你的数据库中存在什么表:
mysql> SHOW TABLES;
Empty set (0.00 sec)
说明刚才建立的数据库中还没有数据库表。下面来创建一个数据库表mytable: 我们要建立一个你公司员工的生日表,表的内容包含员工姓名、性别、出生日期、出生城市。
mysql> CREATE TABLE mytable (name VARCHAR(20), sex CHAR(1), -> birth DATE, birthaddr VARCHAR(20)); Query OK, 0 rows affected (0.00 sec) |
由 于name、birthadd的列值是变化的,因此选择VARCHAR,其长度不一定是20。可以选择从1到255的任何长度,如果以后需要改变它的字 长,可以使用ALTER TABLE语句。);性别只需一个字符就可以表示:"m"或"f",因此选用CHAR(1);birth列则使用DATE数据类型。
创建了一个表后,我们可以看看刚才做的结果,用SHOW TABLES显示数据库中有哪些表:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | mytables | +---------------------+ |
5、显示表的结构:
mysql> DESCRIBE mytable; +-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | deathaddr | varchar(20) | YES | | NULL | | +-------------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) |
6、 往表中加入记录
我们先用SELECT命令来查看表中的数据:
mysql> select * from mytable;
Empty set (0.00 sec)
这说明刚才创建的表还没有记录。 加入一条新记录:
mysql> insert into mytable -> values (′abccs′,′f′,′1977-07-07′,′china′); Query OK, 1 row affected (0.05 sec) |
再用上面的SELECT命令看看发生了什么变化。我们可以按此方法一条一条地将所有员工的记录加入到表中。
7、用文本方式将数据装入一个数据库表
如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。创建一个文本文件“mysql.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以在CREATE TABLE语句中列出的列次序给出,例如:
abccs f 1977-07-07 china mary f 1978-12-12 usa tom m 1970-09-02 usa |
使用下面命令将文本文件“mytable.txt”装载到mytable表中:mysql> LOAD DATA LOCAL INFILE "mytable.txt" INTO TABLE pet;
再使用如下命令看看是否已将数据输入到数据库表中:mysql> select * from mytable;