MySQL的基本操作


一、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;