liunx下MySQL基本操作

212 阅读10分钟

1.数据库的访问

1.1登录数据库的操作

    #-u输入用户名,-p输入密码
    MySQL -u root -p

1.2远程登录数据库

    远程登录MySQL数据库的客户端常用的sqlyog和navicat

2.数据库库表操作

2.1数据库的操作(创建、删除、查看)

2.1.1 MySQL默认数据库

    MySQL默认有4个数据库,分别为:information_schema、mysql、performance_schema、test数据库

2.1.2 数据库的创建

    create databases 数据库名; #数据库名不用中文,不用纯数字
     create databases 数据库名 charset='utf8';  #制定字符集,防乱码

2.1.3查看数据库

    show databases; #显示所有的数据库,注意复数形式
    show databases like '%db%';#只显示一部分查询结果

2.1.4 显示创建语法

    show create database db1;

2.1.5 删除数据库

#删除实体(非表中的数据)用drop  database 数据库名
drop detabase db2;

2.1.6 使用数据库

    use 数据库名;

2.2 表的操作

表的操作包括:表的的查看,表的创建,修改,删除,查看表结构(有哪些字段)

2.2.1 表的创建

创建表是为了存储数据的,所以创建的表一定要字段名,字段类型和约束

1).MySQL常见的字段类型

有整数int,小数flot和numeric(m.n),字符char(m)和varchar(m)以及其他(主要是日期)

2).表的创建语法

    create table t1(
        id inr,  #第一个字段内容,字段里面是用空格分隔
        name char(10),   #字段与字段之间用逗号分隔
        birth date  #最后一个字段因为,诶呦后面的内容了,所以不需要逗号
    )

3).表的约束

为了防止添加和修改的表格数据重复或有问题,这时候强制要求这个列的规制,列如:不能为空,不能重复,不输入时使用默认值,这个东西就是约束。常见的约束有:主键约束,外键约束,非空约束,唯一值约束,默认值约束,自增长约束6种。
        主键约束  primsry key
        外键约束  foreigner key
        非空约束  not null
        唯一值约束  unique key
        默认值约束  default
        自增长约束  auto_increment
    create table student(
        sid int primary key auto_increment, #使用了主键约束,自增长
        sname char(12) unique key,  #唯一性约束
        sex set('男','女') default '男',  #使用集合类型,默认值约束
        birth date not null   #非空约束
    )

2.2.2 表的查看

查看数据库中有哪些表,其操作与查看数据库相似

    show  tables;  #查看所有表

2.2.2 查看所有表的创建语法

    show create table tb1;

2.2.3 删除表的语法

删除表的语法和删除数据库的语法相似

    drop table tb1;

2.2.4查看表结构

    desc tb1; #describe描述这个表

2.2.5字段的修改

我们可以对表字段进行修改,常见的修改操作有:增加字段、删除字段、修改字段。

    alter table student (表名)
        add column address(列名称) varchar(255) not null, #增加字段,带各种属性
        add column classid int after birth, #增加的字段在birth字段后面
        add column sid int primary key first,  #增加到第一个位置
        modify column classid char(4) not null, #修改属性,现在写的属性才是能后有的属性
        modify column classid char(6), #相当于将4位长度修改为6位长度同时去掉了not null属性
        drop column classid  #在删除时,只要能够唯一找到要删除的内容就可以了

3.数据的增、删、改

3.1 插入数据

3.1.1 插入语句标准语句

忘表中插入数据,需要先知道插入到哪张表,插入一些什么样的数据

    #insert into 表名称 values(字段1值,字段2值,字段3值);
    insert into tb1 values(1,'xdq','2022.04.04');
    insert into tb1 values(2,null,null);
    #指定字段的插入
    insert into tb1(id,name) values(3,'admin'); #字段名对应字段值

3.1.2插入数据时使用表达式

    #插入空数据,空数据用null表示,注意不要加单引号 
    insert into tb1 values(2,null,null);  
    #插入数据可以用表达式,例如使用加法 
    insert into tb1 values(1+2,'admin') 
    insert into tb1 values(4,'root',current_date-1)  #可以用函数和五则运算 #插入数据的时候用默认值 
    insert into tb1 values(4,'zhangfei',default) ; insert into tb1(sname) values('guanyu') ;   #假设id自增长,birth有默认值

3.1.3非标准的插入语句

Mysql支持一些非标准的插入语句,同样可以执行通过,但是可能在其他数据库中不能执行,所以这部分了解即可。

    #可以没有into关键字 
    insert tb1 values(5,'lucy','1988-1-9') ;
    #可以是value,而不是复数形式 
    insert into tb1 value(6,'lucky','2000-1-9') ; 
    #可以是values但一次性插入多行数据。 
    insert into tb1 values(7,'lilei','2000-1-9'),(8,'hanmeimei','1988-1-9');

3.2更新语句UPDATE

更新语句指修改表中某一行的数据,改成我需要的值。其标准语法为:UPDATE 表名 SET 字段=值 WHERE 表达式。

3.2.1更新语句标准语法

    #更新一个数据 
    UPDATE student SET sname='king' where sid=1 ; 
    #如果没有where条件则会全表更新,这是一定要注意的 
    UPDATE student SET birth='2020-1-10' ; #这个代码很危险

3.2.2跟新时使用表达式

    #更新时可以设置为null值,但是是字段=null,不是is null 
    UPDATE student SET birth=null WHERE sid=2 ; 
    #更新时使用表达式 
    UPDATE student SET birth = birth+10 WHERE sex='男' ;

3.2.3可以批量更新

    #更新时可以一次性更新多条数据
    UPDATE student SET sex='女' WHERE sid=1 or sid=3 ; 
    #更新时可以在某行中一次性更新多个数据 
    UPDATE student SET sname='qianli',city='xiaoqing' WHERE birth='2022.04.04' ;

3.3删除数据操作

将表中的某些行数据给删除,可以使用DELETE FROM 语句也可以使用TRUNCATE TABLE语句。

3.3.1DELETE数据删除

DELETE是删除表中满足条件的数据

    #删除一行数据 
    DELETE FROM student WHERE sid=5 ; 
    #删除多行数据 
    DELETE FROM student WHERE sex='女' ; 
    #也可以删除全部数据,如果不加WHERE条件就会删除全部数据
    DELETE FROM student ;

3.3.2 TRUNCATE截断表

TRUNCATE只能删除表中的全部数据,不能加WHERE表达式。

    #删除表中的全部数据 
    TRUNCATE TABLE student ;

3.3.3TRUNCATE和DELETE的区别

相同点:都可以删除数据,并且都可以删除表中的全部数据 不同点: TRUNCATE只能删除全表数据,DELETE可以删除部分数据 TRUNCATE删除数据速度快,它是一页一页删除,DELETE删除速度慢, 一行一行删除。 TRUNCATE的语法和DELETE的语法是不相同的。(并 且这两个语法都容易忘记)

4.数据库的查询操作

以student表为例,有字段sid,sname,sex,birth,city等为例

4.1单标查询(不带where条件)

查询的时候需要使用到select关键字,select后面接要显示的字段 (列),FROM是数据来自于哪张表。所以单查询 的核心语法是: select 字段 from 表 ;

4.1.1查询全部数据

select * from student;

4.1.2查询部分字段

在select后面接入要显示的字段即可,字段间用逗号分隔,字段内用 空格(用来设置别名称)

    #查询所有的学生姓名,性别 
    select sname,sex from student ;
    #查询的时候可以使用别名称,别名称也可以用as 别名称 
    select sname 学生姓名,sex 学生性别 from student ;
    select sname as 学生姓名,sex as 学生性别 from student
    ;

4.1.3查询时可以带表达式

    #查询学生的年龄 
    current_date-birth 
    select sname,current_date-birthas age from student ; 
    #可以用函数,比如学生姓名长度,length(sname)
    select sname,length(sname) from student ; 
    #可以用if函数做特殊判断 
    select sname,birth,if(birth>='1990-1-1','90后','80后') from student ; 
    #特殊的if判断,ifnull(birth,a),如果某字段为空,则设置为a值,否则原来值 
    select sname,birth,ifnull(birth,current_date) from student ;

4.1.4去重复的查询distinct

如果查询结果有多组相同值,即两行或多行内容完全相同,我们想只 显示一次即可,则需要用distinct去重复。

    #查询哪些天是班上同学的生日日期 
    select distinct birth from student ;

4.1.5排序order by

对查询结果进行排序,使用order by关键字,排序可以是顺序(ASC)也可以倒序(DESC),默认是顺序。虽然 默认就是顺序,但是笔试时要求按顺序排序,则一定要写ASC。

    #查询班上学生信息,按出生日期进行排序 
    select * from student order by birth; 
    #查询班上学生信息,按年龄从大到小排序 
    select * from student order by (current_date-birth) DESC ; 
    #班上有同龄人,可以设置第2排序项。如果生日相同,则按学号排序
    select * from student order by birth asc,sid desc ;

4.1.6只显示多少行数据limit

如果要查询的数据非常多,你又不能确保你的SQL语句一次性就写对,所以我们会选择验证SQL语句的时候只显示 小部分数据,这时候要用到limit关键字

    #查询班上学生信息,只显示前5行记录
    select * from student limit 5 ;
    select * from student limit 0,5 ; #从第0行开始显示,显示5行 
    select * from student limit 5,4 ; #从第6行开始显示,显示4行

4.2单表查询(带where条件)

其语法为:select 字段 from 表 where 表达式 order by 排序 limit 少量显示。

4.2.1等于查询

其语法为:select 字段 from 表 where 表达式 order by 排序 limit 少量显示。

    #查询年龄为2020-1-7出生的学生信息 
    select * from student where birth='2020-1-7' ; #可以等于数字也可以等于字符 
    select * from student where birth=sex ; #可以将两个字段进行比较,前提这两个字段值得比较 
    select * from student where 1=1 ; #恒等于,会显示全部数据,相当于没有where条件

4.2.2不等于查询

常见的不等于查询有:大于系列> >= 小于系列 < <= 不等于系列!= <>

    select * from student where birth>'2020-1-7' ; #生日在2020-1-7出生的学生

4.2.3多条件查询and和or

AND是条件的同时满足,OR是条件的任意满足

    #查询2020-1-7出生的女生,题目要求同时满足 
    select * from student where birth='2020-1-7' and sex='女' ;

4.2.4模糊查询like

等于查询是需要某个值完整等于,而LIKE关键字只需要满足其中一部分即可。

    #匹配满足的数据一定要%,表示任意内容
    select * from student where sname like '%a%b%' ; 
    #也可以使用 _ 表示匹配一个字符,只能是一个字符,不能多不能少 
    select * from student where sname like '_a%' ;
    #支持not like操作,即第2位不是u的同学 
    select * from student where sname not like '_u%' ;

4.2.5在某个区间

查询学生的学号在3~5号之间的学生信息,我们可以用and来做,但是还有一种方法叫做between and 来实现

#用and实现的方法,会让结果看起来比较长并且有点松散
select * from student where sid>=3 and sid<=5 ;
#用between and来实现,一定要注意是小的数在前面,大的数在后面,并且只针对数字有效
select * from student where sid between 3 and 5 ; 
#支持not between and 操作 
select * from student where sid not between 5 and 8 ; 
#以下结果看起来正确,实际上错误
select * from student where 3<=sid<=5 ;

4.2.6在某个集合中

查询学号是1,3,5的学生信息,刚好是学号在(1,3,5)这个集合中,如果这时候用集合效果会很好。

    #查询学号是1,3,5的学生信息 
    select * from student where sid in (1,3,5) ; 
    #查询学号不是1,3,5的学生信息 
    select * from student where sid not in (1,3,5) ; 
    #查询班级101班性别是女,班级是102班性别是男的学生信息
    --从题目看是两组值的集合((101,'女'),(102,'男')) 
    select * from student where (cid,sex) in ((101,'女'),(102,'男'))

4.3分组查询

我们会将数据分成若干个块(小组),针对于每个小组都要出同样的人(某种人)。从分组查询中,我们需要明确 分组项,再从每个组取达到某个要求(最大,最小,统计个数,求和,求平均值)的数据。

select 分组项,分组表达式(聚合函数)
fromwhere 筛选条件 
group by 分组项
having 二次选择

4.3.1MySQL函数

Mysql自带了很多函数,例如now(),length(),ifnull(),current_date等。可以在select中使用,例如: select now() ,也可以在where 子句中使用,例如: select * from student where birth < current_date-1

4.3.2MySQL聚合函数

在数据库中,用得最多是五个聚合函数,分别为count(),max(),min(),sum(),avg()。这五个函数用得特别 多,并且这五个函数不能用在where子句中,只能用在select子句中。 count:是某个列有多少数据,不包含Null值

max:在表(组)中获取最大的值

min:在表(组)中输出最小的值

sum:获取某列数据的和

avg:获取某列数据的平均值

我们在使用聚合函数的时候,特别需要注意对谁做什么操作count(sid),是统计数量则用count,统计学生的数 据,则列必须足以表达这是学生。 统计时去重复 有时候在统计数量的时候,需要先去重复再做聚合操作,这时候语法为:

    select count(distinct birth) from student ;

4.3.3MySQL分组查询

分组查询需要先明确分组项是谁,一般分组项有两种表述方式:查询每个班级有多少人,查询男生有多少人,女生 有多少人。接下来是分完组后,你想干啥,是统计数量还是求最大值和最小值?

也就是分组表达式(聚合函数)

    #查询男生有多少人,女生有多少人。
    --分析过程:男生女生有多少人,说明是按男女分组,男女是属于sex字段,也就是按sex分组 
    --多少人:多少是统计数量用count,人:需要找一个能够表示人的字段,可以用sid或sname 
    select sex,count(sid) from student group by sex ;
    #查询每个城市的男生有多少人,女生有多少人
    --分析过程:每个城市,说明按城市city分组。男女生各多少人,说明还要按性别sex分组 
    select city,sex,count(sid) from student group by city,sex ;

4.3.4MySQL二次筛选

where一次筛选 即先筛选再分组,因为WHERE子句在GROUP BY的前面,所以它会先筛选再分组

案例:

    #查询生日不为空的学生中,男生多少人,女生多少人
    --分析过程:先要筛选保留生日不为空的学生信息再进行分组 
    select sex,count(sid),max(birth),min(birth) #可以多个聚合函数 from student where birth is not null group by sex

HAVING二次选择 先分组后再进行筛选,所以筛选是在GROUP BY的后面,用HAVING加筛选条件

案例:

    #查询每个类别的最大点击次数,只显示最大点击次数为0的 
    select cat_id,max(click_count) mcc from goods 
    group by cat_id 
    having mcc=0

4.4多表查询

多表连接就是将两个表串起来,可以看全我们需要的信息。连接需要明确知道连接条件是什么,然后需要知道该显 示什么数据,而且所有的字段都要 表名.字段名。

4.4.1等值连接

等值连接就是降俩个表的连接条件用=号连接起来

    select s.*,e.* 
    from student s,exam e
    where s.sid=e.sid

等值连接又叫内连接,可以使用join…… on……来实现

    select s.*,e.*
    from student s inner join exam e on s.sid=e.sid 
    where e.score<60

4.4.2自身表连接

自身表连接需要把这个表看成是两张表,类似于等值连接的做法。

4.4.3外连接(左右连接)

外连接包含左连接和右连接,左连接是指以左边表为基准表(主表),右边表连接左边,如果右边有左边的数据, 则显示两边的数据。如果右边表没有与左边表对应的数据,则左边表的数据依然显示,右边以null回应。总之左边 表的数据要全部显示,右边来连接左边的过程。

    select s.*,e.* 
    from exam e right join student s on e.sid=s.sid

4.4.4不等值连接

不等值连接是一种特殊的连接,一般用between……and……进行连接,其实我们只要清楚了其中的逻辑关系,这个 题是可以很快做出来的。

    select e.*,s.* 
    from exam e join sclevel s on e.score between s.minscore and s.maxscore;

4.5子查询

4.5.1多表查询和分组查询的合并使用

我们首先知道分组的语法:

    select 分组项,聚合函数 from where 表达式
    group by 分组项 having 二次筛选;

分组很明显的告诉我们,表来源先于分组。如果要先多表,则可以在from完成,也可以在where中完成,完成后 再分组便可。

例如:查询每个分数等级有多少个学生

    select s.slevel,count(distinct e.sid) 
    from exam e join sclevel s on e.score 
    between s.minscore and s.maxscore

4.5.2查询中包含查询

让我们语句变成一个很重要的技术

    #查询年龄最大的学生信息 
    select * from student where birth=(select max(birth) from student);

4.5.3子查询在from中

把他看成一张表即可。

    #查询语文成绩高于数学成绩的学生信息
    select a.*,b.* from (select * from exam where course='语文')
    a join (select * from exam where course='数学')
    b on a.sid=b.sid where a.score>b.score

4.5.4子查询结果为集合

子查询的结果为单列多行数据或多列多行数据时,查询条件就不能用=查询了。需要用IN来连接集合,并且条件和 子查询的列必须完全匹配。

5.数据库在工作中的作用

  1. 我们在页面上做操作(测试),其测试结果会保存在数据库中,所以我们可以通过SELECT查找出测试结果。
  2. 在测试时需要用到一些特殊数据,我们可以在数据库中根据某些条件查找出我要的测试数据去开展测试。
  3. 在测试时,需要还原测试环境。这时候可以对测试数据进行修改,UPDATE操作。
  4. 在测试执行时如果有出现Bug,可以采用数据库手段进行定位。