MySQL基本命令总结

一. 基本命令
1. 启动服务
    windows: net start mysql
    linux: service mysqld start
    mac: /usr/local/mysql/support-files/mysql.server start  (gz解压包方式安装,路径按照解压安装时的目录查找)
         brew services start mysql  (brew install mysql方式安装启动方式)
    为了方便操作,可以自定义启动命令,修改~/.bash_profile文件,添加以下内容:
    
    # mysql快捷命令
    alias mysqlstart='sudo /usr/local/mysql/support-files/mysql.server start'  # 启动服务
    alias mysqlstop='sudo /usr/local/mysql/support-files/mysql.server stop'  # 停止服务
    alias mysqlstatus='sudo /usr/local/mysql/support-files/mysql.server status'  # 查看状态
    alias mysqlrestart='sudo /usr/local/mysql/support-files/mysql.server restart'  # 重启服务
    添加完成后,可以直接执行mysqlstart,mysqlstop命令启动停止服务.
2. 停止服务
    windows: net stop mysql
    linux: service mysqld stop
    mac: /usr/local/mysql/support-files/mysql.server stop
         brew services stop mysql
3. 连接数据库
    mysql -u root -p
4. 退出登录
    exit;
5. 查看数据库版本
   select version();
6. 查看当前时间
   select now();
7. 远程链接
   mysql -h 远程ip -u 用户名 -p 密码
8. 更改密码
    下面几种方法都可以:
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
    mysqladmin -u root password "newpass";  # 更改前root密码为空时使用此命令
    mysqladmin -u root password "oldpass" "newpass";  # 更改前root已经设置过密码
    update mysql.user set authentication_string=password('新密码') where User='root'; 
    UPDATE mysql.user SET Password = PASSWORD('newpass') WHERE user = 'root';


二. 数据库操作
1. 创建数据库
    格式: create database 数据库名 charset=utf8;
2. 删除数据库
    格式: drop database 数据库名;
3. 切换数据库
    格式: use 数据库名;
4. 查看当前选择的数据库
    格式: select database();


三. 表操作
1. 查看数据库中所有表
    show tables;
2. 创建表
    格式: create table 表名(列及类型);
    示例: create table student(id int auto_increment primary key, name varchar(20) not null, age int not null, gender bit default 1, address varchar(64), isDelete bit default 0);
    1) 创建表时,直接引用其他数据库中的表结构及数据:
    create table tablename select * from otherdb.othertable;
    2) 创建表时,直接引用其他数据库中的表结构,不引入表中数据:
    reate table tablename select * from otherdb.othertable where 1>2;  # 指定一个为假的条件,则只引用表结构
3. 删除表
    格式: drop table 表名;
    示例: drop table student;
4. 查看表结构
    desc 表名;
    desc student;
5. 查看建表语句
    格式: show create table 表名;
    示例: show create table student;
6. 重命名表名
    格式: rename table 原表名 to 新表名;
    示例: rename table student to newstudent;
7. 修改表结构
    格式: alter table 表名 add|change|drop 列名 类型;
          alter table 表名 add|change|drop 列名 类型 default 默认值;  (有默认值方式)


四. 数据操作
1. 增
    a. 全列插入
        格式: insert into 表名 values(...);
        说明: 主键列是自动增长的,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准
        示例: insert into student values(0,"jason",20,1,"BJ",0);
    b. 缺省插入
        格式: insert into 表名(列1,列2...) values(值1,值2...);
        示例: insert into student(name,age,address) values("tom",18,"上海");
    c. 同时插入多条数据
        格式: insert into 表名 values(...),(...),(...)...
        示例: insert into student values(0,"jackson",22,1,"SH",0), (0,"lily",20,0,"GZ");
2. 删
    格式: delete from 表名 where 条件;
    示例: delete from student where id=2;
    注意: 没有条件是全部删除,谨慎使用
3. 改
    格式: update 表名 set 列1=新值,列2=新值 where 条件;
    示例: update student set age=25 where name="jason";
    注意: 没有条件是全部列都修改,谨慎使用
4. 查
    说明:查询表中的全部数据
    格式: select * from 表名;
    示例: select * from student;


五. 查
1. 基本语法
    格式: select * from 表名;
    说明:
        1) from关键字后面是表名,表示数据来源于这张表
        2) select后面写表中的列名,如果是*表示在结果集中显示表中的所有列
        3) 在select后面的列名部分,可以使用as为列名起别名,这个别名显示在结果集中
        4) 如果要查询多个列,中间使用逗号分隔
    示例:
        select * from student;
        select name, age from student;
        select name, address as addr from student;
2. 消除重复行
    在select后面列前面使用distinct可以消除重复的行
    示例:
        select gender from student;
        select distinct gender from student;   
3. 条件查询
    a. 语法
        格式: select * from 表名 where 条件;
    b. 比较运算符
        等于              =
        大于              >
        小于              <
        大于等于          >=
        小于等于          <=
        不等于            !=<>
        需求: 查询id大于5的所有学生
        示例: select * from student where id>5;
    c. 逻辑运算符
        and    并且
        ornot    非
        需求: 查询id大于5的男同学
        示例: select * from student where id>5 and gender=1;
    d. 模糊查询
        like
        % 表示任意多个任意字符
        _ 表示任意一个任意字符
    e. 范围查询
        in                  表示在一个非连续的范围内
        between...and...    表示在一个连续的范围内
        需求: 查询编号为8,10,12的学生
        示例: select * from student where id in (8,10,12);
        需求: 查询编号为6到10的学生
        示例: select * from student where id between 6 and 10;
    f. 空判断
        注意: null与""不同
        判断空: is null
        判断非空: is not null
    g. 优先级
        小括号, not 比较运算符, 逻辑运算符
        and比or优先级高,如果同时出现并希望先执行or,需要配合小括号使用
4. 聚合
    为了快速得到统计数据,提供了5个聚合函数
    a. count(\*)     表示计算总行数,括号中可以写*或列名
    b. max(列)       表示求此列的最大值 
    c. min(列)       表示求此列的最小值
    d. sum(列)       表示求此列的和
    e. avg(列)       表示求此列的平均值
    需求: 查询学生总数
    示例: select count(*) from student;
    需求: 查询女生编号的最大值
    示例: select max(id) from student where gender=0;
    需求: 查询所有学生的年龄和
    示例: select sum(age) from student;
    需求: 查询所有学生的年龄平均值
    示例: select avg(age) from student();
5. 分组
    按照字段分组,表示此字段相同的数据会放到一个集合中.
    分组后,只能查询出相同的数据列,对于有差异的数据列无法显示在结果中.
    可以对分组后的数据进行统计,做聚合运算
    语法: select 列1,列2,聚合... from 表名 group by 列1,列2...
    需求: 查询男女生总数
    示例: select gender,count(*) from student group by gender;

    分组后的数据筛选,使用having,表示对分组后的结果再过滤.
    示例: select gender,count(*) from student group by gender having gender;
    
    where与having区别:
    where是指对from后面指定的表进行筛选,属于对原始数据的筛选;
    having是对group by的结果进行筛选
6. 排序
    语法: select * from 表名 order by 列1 asc|desc, 列2 asc|desc, ...
    说明:
        a. 将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序
        b. 默认按照从小到大的顺序排序
        c. asc 升序
        d. desc 降序
    需求: 将没有被删除的数据按照年龄排序
    示例: 
        select * from student where isDelete=0 order by age desc; 
        select * from student where isDelete=0 order by age desc, id desc;
7. 分页
    语法: select * from 表名 limit start,count;
    说明: start 索引从0开始; count 结果集中显示个数
    示例:
        select * from student limit 0,3;
        select * from student limit 3,3;
        select * from student where gender=0 limit 0,3;


六. 关联
    一对多示例
    建表语句:
    1. create table class(id int auto_increment primary key, name varchar(20) not null, stuNum int not null);
    2. create table students(id int auto_increment primary key, name varchar(20) not null, gender bit default 1, classid int not null, foreign key(classid) references class(id));
    # 使用外键关联班级表的主键. 注: 表的外键必须是另一张表的主键
    
    插入一些数据:
    insert into class values(0, "python01", 45), (0, "python02", 50), (0, "python03", 60);
    insert into students values(0, "jason", 1, 1);
    insert into students values(0, "lily", 1, 10);  # 此条语句报错
    insert into students values(0, "curry", 1, 2);
    关联查询:
    select students.name,class.name from class inner join students on class.id=students.classid;
    select students.name,class.name from class left join students on class.id=students.classid;
    
    分类:
    1. 表A inner join 表B
        表A与表B匹配的行会出现在结果集中
    2. 表A left join 表B
        表A与表B匹配的行会出现在结果集中,外加表A中独有的数据,未对应的数据使用null填充
    3. 表A right join 表B
        表A与表B匹配的行会出现在结果集中,外加表B中独有的数据,未对应的数据使用null填充


七. 数据备份,恢复
1. 数据备份
    1) 备份表结构+数据
        mysqldump -u root -p test > test.dump  # 备份test数据库
    2) 只备份表结构
        mysqldump --no-data --databases db1 db2 eb3 > test.dump  # 备份db1,db2,db3的表结构
        或
        mysqldump -u root -p -d test > test.dump  # 备份test的表结构
    3) 备份所有数据库
        mysqldump --all-databases > test.dump
2. 数据恢复
    1) 系统命令行恢复
        mysqldump -u root -p test > test.dump  # 执行这条语句备份(有问题,暂时情况是终端没报错,但数据没有恢复到db2中)
        mysqldump -uroot -p -d db2 < test.dump  # 将备份的数据恢复到本地的db2数据库(db2已经存在且为空,新建的即可)
    2) mysql命令行恢复
        mysqldump -u root -p test > test.dump # 执行这条语句备份
        mysql> use db1;
        Database changed
        mysql> show tables;
        Empty set (0.00 sec)
        mysql> source test.dump;  # source后可以接绝对路径,如果不用绝对路径,那么要先切换到test.dump所在的目录
        mysql> show tables;  # 可以看到备份文件中的表已经恢复
        +---------------+
        | Tables_in_db1 |
        +---------------+
        | class         |
        | juniorStus    |
        | student       |
        +---------------+
        3 rows in set (0.00 sec)


八. 补充内容
    1. 重置密码
    1)windows
        net stop mysql  # 停止服务
        mysqld --skip-grant-tables  # 以跳过授权表的方式启动服务
        mysql -uroot -p  # 直接回车登录不需要输入密码
        update mysql.user set authentication_string =password('新密码') where User='root';  # 设置新密码
    2)linux/mac
        ./mysqld_safe --skip-grant-tables  # 安装mysql的bin目录下执行
        mysql -uroot -p  # 直接回车登录
        update mysql.user set authentication_string =password('新密码') where User='root';
    2. 创建用户and授权
    root身份登录,然后进入mysql数据库下操作
    mysql> use mysql
    Database changed
    1)新用户的增删改
        新增: create user '用户名'@'ip地址' identified by '用户密码';
        删除: drop user '用户名'@'ip地址';
        修改: 
            rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
            set password for '用户名'@'IP地址'=Password('新密码');
        示例:
        # 指定允许ip:192.118.1.1的jason用户登录
        create user 'jason'@'192.168.1.10' identified by '123';
        # 指定允许ip:192.118.1.开头的jason用户登录
        create user 'jason'@'192.168.1.%' identified by '123';
        # 指定允许任何ip的jason用户登录
        create user 'jason'@'%' identified by '123';
    2)用户权限管理
        新增用户默认是没有任何权限的,不能查看数据库,表...
        查看权限: show grants for '用户名'@'ip地址';
        授予权限: grant operation on dbname.tablename to '用户名'@'ip地址';
        取消权限: revoke operation on dbname.tablename from '用户名'@'ip地址';
  
       示例: # 授权jason用户仅对test.students文件有查询、插入和更新的操作
grant select,insert,update on test.students to "jason"@'%'; # 表示有所有的权限,除了grant这个命令,这个命令是root才有的. jason用户对test下的students文件有任意操作 grant all privileges on test.students to "jason"@'%'; # jason用户对test数据库中的文件执行任何操作 grant all privileges on test.* to "jason"@'%'; # jason用户对所有数据库中文件有任何操作 grant all privileges on *.* to "jason"@'%'; # 取消权限 # 取消jason用户对test的students文件的任意操作 revoke all on test.students from 'jason'@"%"; revoke all on test.* from 'jason'@"%"; revoke all on *.* from 'jason'@"%";
  
  刷新权限:
  flush privileges;



grant all privileges  on *.*  to "root"@'%' indenttified by '123456'; # 远端登录用123456就算用户主机改了密码,远端登录也是123456  

 indenttified by password;

posted @ 2018-09-19 12:36  小学弟-  阅读(353)  评论(0编辑  收藏  举报