MySQL的基本操作

时间:2022-09-16 21:04:46

一、mysql的启动和连接

  1.、服务控制(启动、查看状态、停止、重启,重载)

     两种方法(Ubuntu系统)

    • sudo /etc/init.d/mysql start | status | stop | restart | reload
    • service mysql start | status | stop | restart | reload

  2 、连接数据库

    • mysql -h主机地址 -u用户名 [-P3306] -p密码

二、库的管理

  1、创建库(指定字符集)

    create database 库名;

    create database 库名 default charset = utf8 #指定字符集

  2、查看库的字符集

    show create database 库名;

  3、查看当前所在库

    select database();

  4、切换库

    use 库名;

  5、查看库已有表

    show tables;

  6、删除库

    drop database 库名;

三、表管理(表的创建、查看、删除)

  1、创建表

    create table 表名(字段名1 数据类型1,字段2 数据类型2...);

    create table 表名(字段名1 数据类型1,字段2 数据类型2...)default charset = utf8;

  2、查看表的字符集和存储引擎

    show create table 表名;

  3、查看表结构

    desc 表名;

  4、删除表

    drop 表名;

四、表字段管理

  1、添加字段(add)

    alter table 表名 add 字段名 数据类型;  #默认添加到末尾

    alter table 表名 add 字段名 数据类型 first;  #添加到第一个字段

    alter table 表名 add 字段名 数据类型 after 字段名;  # 添加到指定字段后面

  2、修改字段数据类型

    alter table 表名 modify 字段名 新数据类型;

    注: 修改数据类型时会受到表中原有数据类型的限制

  3、修改字段名

    alter table 表名 change 旧名 新名 数据类型;

  4、删除字段

    alter table 表名 drop 字段名;

  5、修改表名 

    alter table 表名 rename 新表名;

五、表记录操作(表内容的增、删、改、查)

  1、插入表记录  

    insert into 表名 values(记录1的字段的值),(记录2的字段的值)...;

    insert into 表名(指定要插入的字段名) values(记录1的字段的值),(记录2的字段的值)...;

    注意: 没有指定插入字段名的话,后面必须插入全部字段的值,如果指定了只需插入指定字段值即可。

 

  2、查询表记录

    select * from 表名;  # 查看所有的表记录

    select 字段1,字段2...... from 表名;  # 查看指定字段记录

    注:其它更复杂的查询后面逐步说明

  3、删除表记录

    delete from 表名 where 条件;

    注:delete 语句后面如果不加where子句,会将表中所有记录删除。

  4、更新表记录

    update 表名 set 字段1=值1,字段2=值2...... where 条件;

    注意:update 语句后面如果不加where子句,会将表中所有记录修改。

 

 

进阶查询部分

PS:此表作为下面示例所用(表名:sanguo)

 id name gongji fangyu sex country
1 诸葛亮 120 20 蜀国
2 司马懿  119    25 魏国
3 关5羽 188 60 蜀国
4 赵云6 200 66 魏国
5 孙权 100 60 吴国
6 貂蝉 666 10 魏国
7 NULL 1000 99 魏国
8   1005 88 蜀国
9 9周瑜 80 100 吴国
10 黄忠 130 80 蜀国
11 孙策 110 90 吴国
12 荀粲 80 100 魏国
13 华佗 60 200 NULL

 

六、where 子句

  ps:配合查询、修改、删除操作

  语法格式(以查询为例):

    select * from 表名 where 条件;

  1、where 子句后的运算符操作

    数值比较运算符:=、!=、>、>=、<、<=
    字符比较运算符:=、!=
    示例:
      找出攻击力高于150的英雄和攻击值
       select name,gongji from sanguo  where gongji > 150;
      找出防御力不等于100的英雄信息
       select * from sanguo where fangyu != 100;
  2、逻辑比较
     运算符:and  、or
     and:两个或多个条件需要同时满足
     or:两个或多个条件满足一条即可
    示例:
      找出攻击值大于200的蜀国英雄的名字和攻击值
       select name,gongji from sanguo where gongji > 200 and country = "蜀国";  
      将吴国英雄中攻击值为110的英雄的攻击值设置为100,防御值设置为60
       update sanguo set gongji=100 where gongji=110;
  3、范围内比较
    between  and 、in、not in
    语法:
      字段名 between 值1 and 值2
      字段名 in 值1 或 字段名 in (值1,值2...)
      字段名 not in 值1
    示例:
      
      查找攻击值在100-200之间的蜀国英雄信息
        select * from sanguo where gongji between 100 and 200;
      找到蜀国和吴国以外国家的女英雄信息
       select * from sanguo where sex="女" and country not in ("蜀国","吴国");
  4、查询空
    is null 、is not null
    示例:
      查找姓名为NULL的蜀国女英雄信息
        select * from sanguo where name is null and sex="女";
      查找姓名为""的英雄的id、姓名和国家
       select * from sanguo where name="";
      注意: null 为空值,必须用 is 或者 is not 去匹配,而""为空字符串,用 = 或者 != 去匹配。
  5、模糊比较
    语法:where 字段名 like 表达式;
      表达式:
        _ : 匹配单个字符
        % : 匹配0到多个字符(null不会被匹配)
    示例: 
      匹配名字中至少有两个字的英雄
       select * from sanguo where name like "_%_";
      匹配名字为三个字的英雄
       select * from sanguo where name like "___";
      匹配姓赵的英雄
       select * from sanguo where name like "赵%";
 
  6、正则匹配查询 regexp
    语法:where 字段名 regexp 正则表达式;
    常用的正则表达式符号:
      ^ : 以...开头
      $ : 以...结尾
      .  : 匹配任意一个字符
      [] : 包含...内容
      *  : 匹配前面的子表达式零次或多次
 
    示例:
      匹配名字中带数字的英雄信息
       select * from sanguo where name regexp "[0-9]";
      匹配名字中以数字开头的记录
       select * from sanguo where name regexp "^[0-9]";
      匹配名字中以数字结尾的记录
       select * from sanguo where name regexp "[0-9]$";
      匹配以 司 开头,以 懿 结尾的记录
       select * from sanguo where name regexp "^司.*懿$";
 
七、order by子句(排序)
  语法格式:order by 字段名 排序方式;
  排序方式:asc(默认):升序  desc:降序
  示例:
    将英雄按防御值从低到高排序
     select * from sanguo  order by fangyu asc;  #asc 可不写
    将蜀国英雄按攻击值从高到底排序
    select * from sanguo where country = "蜀国" order by gongji desc;
    将魏蜀两国的男英雄中名字中为三个字的英雄按防御值升序排列
    select * from sanguo
       where sex = "男" and country in ("魏国","蜀国") and name like "___"
       order by fangyu;
八、limit子句
  作用:用于限制显示查询的记录条数
  语法:limit m,n;
    m:表示从第m+1条开始显示记录
    n:表示显示多少条记录
  # m可以省略
  # 永远放在SQL语句的最后面
  示例:
    查找防御值倒数第2名到倒数第4名的蜀国英雄记录
     select * from sanguo where country = "蜀国" order by fangyu limit 1,3;
    查找攻击值前3名且名字不为空值的蜀国英雄的姓名、攻击值和国家
     select name,gongji,country from sanguo
        where country = "蜀国" and name is not null 
        order by gongji desc limit 3;
九、聚合函数
  avg(字段名):求字段的平均值
  sum(字段名):求和
  max(字段名):求最大值
  min(字段名):求最小值
  count(字段名):统计该字段记录的条数
  示例:  
    找到最强攻击值是多少
     select max(gongji) as best from sanguo;
     注:这里的as 相当于设置一个别名best,可以省略。
 
    统计一下id,name两个字段分别有多少记录
     select count(id),count(name) from sanguo;
     注:空值NULL不会被统计,空字符串""会被统计  
   
    统计蜀国英雄中攻击值大于200的英雄的数量
     select count(*) from sanguo where country="蜀国" and gongji > 200; 
     # count(*)的意思是指被筛选出来的记录只要有一个字段不是空值就会被统计
  
十、group by子句(先分组,再聚合)
  作用:给查询的结果进行分组
  语法:group by 字段名;
  
  示例:
    统计sanguo表中一共有哪几个国家
     select country from sanguo group by country;
 
    计算所有国家的平均攻击力
     select countr,avg(gongji) from sanguo group by country;
     # 先分组,在求分组后每组的(国家)平均攻击力,最后将国家去重显示出来。
 
    查找所有国家中,英雄数量最多的前2名的国家的名称及英雄数量
     select country,count(*) as 英雄数量 from sanguo
        group by country  order by  英雄数量 desc limit 2;
     # 可以使用中文作为别名
    
十一、having  
  
 
  示例: 
    找出平均攻击力大于105的国家的前2名,显示国家名称和平均攻击力
     select country,avg(gongji) from sanguo
        group by country having avg(gongji) > 105
        order by avg(gongji) desc limit 2;
     注:1.having 语句通常与group by 语句联合使用,用来过滤有group by语句返回的记录集
      2.having语句弥补了where条件子句不能与聚合函数联合使用的不足,where操作的
      是表中实际的字段,having操作的是集合函数生成的显示列
 
十二、distinct
  作用:不显示字段的重复值 
  示例:
    sanguo表中一共有哪些个国家
     select distinct country from sanguo;
 
    计算蜀国一共有多少个英雄
     select count(distinct name) from sanguo where country = "蜀国";
 
       注:1.distinct处理的是distinct和from之间的所有字段,所有字段的值必须完全相同才可以去重
        2.distinct不能对任何字段做聚合处理
 
十三、查询表记录时可以做数学运算
   + 、-、 *、/、 %
 
  示例:
     查询时显示所有英雄的攻击力 * 10
     select name,gongji*10,country from sanguo;
 
总结(执行顺序)
 
  1、where ...
  2、group by ...
  3、select ... 聚合函数 from 表名
  4、having ...
  5、order by ...
  6、limit ...
 
约束
 
作用:
  为了保证数据的完整性、一致性、有效性,可以限制无效的数据插入到数据表中
 
约束分类:
  默认约束(default)
     作用:在插入记录时,如果不给该字段赋值,则使用默认值
     格式:
      字段名 数据类型 default 默认值,
 
  非空约束
     作用:不允许该字段的值有空值NULL记录
     格式:
      字段名 数据类型 not null
 
   
  示例:
    创建一张表,name字段的默认值是“张三”
     create table t1(name varchar(20) default "张三", age tinyint unsigned);
       
    向表中添加一个字段,值不能为空
     alter table t1 add id int not null;
 
 
索引
 
定义:
  对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中索引用Btree方式)
 
索引的优缺点:
   优点:
    可以加快数据的检索速度
 
  缺点:
     当对表中的数据进行增加、修改、删除的时候,索引需要动态维护,降低了数据的维护速度
     索引需要占用物理存储空间(数据库目录/var/lib/mysql)
 
  创建索引:
     # name字段
      create index name on t1(name);
  
  ps:可以开启性能测试,有索引和无索引的检索用时区别
    1.开启性能测试
       show variables like "%pro%";
         set profiling = 1;
     2.查看性能分析结果      
       show profiles;
      # 与没有索引的进行对比
    3.关闭性能测试
       set profiling = 0;