首先,我们经常说的MySQL是一个数据库管理系统,而非数据库。数据库是组织、存储和管理数据的仓库,存储数据的容器。而数据库管理系统是操纵和管理数据库的大型软件,建立、使用和维护数据库。数据表是真正的数据存储单元,其他对象的基础。三者之间的关系为:一个数据库管理系统维护了多个数据库,一个数据库包含若干数据表。
关于数据库的分类,可能有很多种分类。一般来说,我们用到最多的就是关系型数据库和NoSQL数据库。而其中关系型数据库又是应用最为广泛的。1.2SQL语句概念及分类
SQL:一种结构化查询语句,用于访问和操作数据库的标准计算机语言。通常用途为操作数据库对象(表、存储过程、函数、索引),表记录的增删改查。SQL是一门弱语言,不区分大小写。通常,将SQL语句分为下面五大类。
1.3MySQL数据类型
MySQL支持多种数据类型,大致可以分为四大类,如下图所示。关于MySQL数据类型的详细内容,请参考链接MySQL常见的数据类型
查询所有数据库
showdatabases;创建数据库
createdatabase数据库名称;删除数据库
dropdatabase数据库名称;查询数据库详情、查看数据库的字符集
showcreatedatabase数据库名称;创建指定字符集数据库
##创建数据库语句后面用characterset设置数据库字符集,注意这里是utf8,不是utf-8createdatabase数据库名称charactersetgbk/utf8;选中数据库
##创建数据库表语句如下:CREATETABLEIFNOTEXISTS表名(字段名1字段类型,字段名2字段类型)ENGINE=InnoDBDEFAULTCHARSET=utf8;##实际案例语句CREATETABLEIFNOTEXISTSNUMBER(IDINTNOTNULLAUTO_INCREMENT,USERNAMEVARCHAR(40),PRIMARYKEY(ID))ENGINE=INNODBDEFAULTCHARSET=UTF8;查询所有表
showtables;查询表详情
showcreatetable表名;查看表结构
desc表名;删除表
renametable原表名to新表名;修改表引擎和字符集
altertable表名engine=innodb/myisamcharset=gbk;添加表字段(在最后)
altertable表名add字段名字段类型;添加表字段(最前面)
altertable表名add字段名字段类型first;添加字段(某个字段后添加)
altertable表名add字段名A字段A类型after字段名B;删除表字段
altertable表名drop字段名;修改表字段名称和类型
对于测试工程师而言,SQL语言中最常用的就是DML——数据操作语言,即为增删改查。而其中用到最多的就是DQL——数据查询语句。插入数据(全表插入)
insertinto表名values(字段1值,字段2值);insertinto表名values(字段1值,字段2值),(字段1值,字段2值);插入数据(指定字段)
insertinto表名(字段1,字段2)values(值1,值2);insertinto表名(字段1,字段2)values(值1,值2),(值1,值2);删除数据
#删除指定数据deletefrom表名where字段名=值;#删除表中全部数据deletefrom表名;修改数据
#修改指定值update表名set字段名=值1where字段名=值2;#修改全部值update表名set字段名=值1;查询数据
#查询所有select*from表名三、DQL(查询)详解DQL即为数据查询语句,也是使用最多的一种SQL语句。将该部分的内容分为以下几部分:其中最为常用的是关联查询、分组、分页、排序、条件查询这几种。对于其中常用的where、groupby、having、orderby、limit,其顺序为:·select*from表Ajoin表Bon条件where条件groupby分组字段having聚合函数过滤orderby排序字段limit...3.1条件查询
判断是否为空(isnull、isnotnull)
#分别代表大于、小于、大于等于、小于等于、不等于、不等于#案例查看图书表中图书id大于2的图书信息SELECT*FROMbookWHEREbook_id>2and和or
##等同于&&和||,表示同时满足两个条件和满足两个条件中一个##案例1:查询图书借阅表中用户id和图书id都为1的图书信息SELECT*FROMbook_borrowWHEREuser_id=1ANDbook_id=1;##案例2:查询图书借阅表中用户id为1或者图书id为1的图书信息SELECT*FROMbook_borrowWHEREuser_id=1ORbook_id=1;in在某些可选值范围内
#select*from表名where字段in(值1,值2,值3);#案例1查询图书借阅表中读者id在1,2,3范围内SELECT*FROMbook_borrowWHEREuser_idin(1,2,3);between和notbetween
#字段between值1and值2;字段在值1和值2之间#案例1:查询图书借阅表中读者id在1-2范围内,包含1和2SELECT*FROMbook_borrowWHEREuser_idBETWEEN1AND2;模糊查询like_代表单个字符,%代表0个或多个字符
别名——使用as关键字或空格给表名或字段别名
#案例查询员工表中所有的员工名称,且不重复selectdistinctemployeeNamefromemployee;3.3排序、分页查询
排序——orderby(ASC升序默认、DESC降序)
#案例:查询学生表数据并以id降序、年龄升序排序select*fromstudentorderbyiddesc,age;分页查询——limit跳过条数A每页数量B
聚合函数——sum(字段名)求和
#案例对分数表中分数进行求和SELECTSUM(a.score)FROMtable_socreasa;聚合函数——avg(字段名)平均值
#案例求分数表中分数平均值SELECTAVG(a.score)FROMtable_socreasa;聚合函数——max(字段名)最大值
#案例求分数表中最大值SELECTMAX(a.score)FROMtable_socreasa;聚合函数——min(字段名)最小值
#案例求分数表中最小值SELECTMIN(a.score)FROMtable_socreasa;聚合函数——count(字段名)统计数量
分组——groupby
groupby的常规用法是配合聚合函数,利用分组信息进行统计。
#案例以title字段分组,查询每个分组中score的最大值SELECTt.t.title,MAX(score)FROMtable_socretGROUPBYt.title;having——解决聚合函数过滤问题,一般配合groupby一起使用。
#案例以title字段分组,查询每个分组中score的最大值,并且通过最大值必须大于20来过滤数据SELECTt.t.title,MAX(score)FROMtable_socretGROUPBYt.titlehavingMAX(score)>20;3.6子查询
写在where/having后作为查询条件的值
#案例查询员工工资最低的员工信息,由于可能最低有多个员工,所以需要先查询出最低工资SELECT*FROMemployeesWHEREsalary=(SELECTMIN(salary)FROMemployees);临时表——用在from后面,当做一个新表,新表必须有名称
#案例将一个查询结果作为一个新表,让后从这个新表中查询数据selectcou,namefrom(selectcount(*)AScou,enabledASnamefrom`user`groupbyenabled)asawherecou>03.7关联查询
参考链接:Mysql中的关联查询(内连接,外连接,自连接)
内连接——表Ainnerjoin表Bon条件,特点:只查询连接的表中能够有对应的记录的数据
#查询员工姓名及对应部门名称没有部门的人员和没有人员的部门都不显示SELECTe.empName,d.deptNameFROMt_employeeeINNERJOINt_deptdONe.dept=d.id;左外连接——表Aleftjoin表Bon条件,特点:以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null
#查询员工表中员工姓名及对应部门名称,若员工没有部门,则显示nullSELECTe.empName,d.deptNameFROMt_employeeeLEFTJOINt_deptdONd.id=e.dept;右外连接——表Arightjoin表Bon条件,特点:与坐外连接类似,只是基准表变了,用右表去匹配左表。所以左外连接能做到的事情,右外连接也能做到。
#查询所有部门和对应的员工,如果部门没有员工,则显示nullSELECTe.empName,d.deptNameFROMt_employeeeRIGHTJOINt_deptdONd.id=e.dept;自连接——当前表与自身连接查询
#查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表SELECTe.empName,b.empNameFROMt_employeeeLEFTJOINt_employeebONe.bossId=b.id;四、约束、索引、存储过程、事务4.1约束
MySQL中约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
4.2索引
MySQL中的索引是一种高效获取数据的存储结构——B+Tree;MySQL中索引的好处在于加快查询速度,坏处就是降低了增删改的速度,增大了表的文件大小(索引文件可能比数据文件还要大)。MySQL索引实现原理可以参考:mysql索引实现原理#1.如何创建索引注意:添加主键约束是,会自动创建主键字段的索引createindex索引名on表名(字段);#2.查看索引showindexfrom表名;#3.删除索引dropindex索引名on表名;
4.3存储过程
MySQL中存储过程类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现。#1.查看数据库中的存储过程showprocedurestatus;#2.查看存储过程的创建代码showcreatePROCEDURE存储过程名;#3.创建存储过程CREATEPROCEDURE名称()BEGIN.........END#4.创建存储过程,并执行存储过程#4.1创建存储过程dropprocedureifexistsproc_addNum;createprocedureproc_addNum(inxint,inyint,outsumint)BEGINSETsum=x+y;end#4.2执行过程,out输出返回值callproc_addNum(2,3,@sum);select@sum;4.4事务
参考链接:MySQL数据库事务的四大特性以及事务的隔离级别
事务:是数据库中执行SQL语句的工作单元,可以保证事务内的SQL语句要么全部成功,要么全部失败。