DATABASE(数据库)-MySQL

打印 上一主题 下一主题

主题 517|帖子 517|积分 1551

一、数据库发展史(了解)

1、步伐管理阶段(20世纪50年代中期)特点:数据不能恒久生存(存内存中,掉电丢失)2、文件体系阶段(20世纪50年代中期-60年代后期)特点:数据缺乏独立性存硬盘 文件中,恒久生存

3、数据库体系阶段(20世纪60年代后期--至今)特点:数据共享、淘汰冗余不必要的重复) --便于管理数据

常见的数据库产品有哪些?

产品 厂商

SQLServer 微软

Access 微软

MySQL Oracle 甲骨文

Oracle Oracle

DB2 IBM

Sybase Sybase......

二、MySQL介绍

MySQL是一款关系型数据库管理体系(软件) 

 DBMS 数据库管理体系 MySQL管理此中的数据库

 DB 数据库

由瑞典AB公司研发,目前属于Oracle公司的产品

重要版本:社区版(免费)和企业版(付费)

重要特点:体积小、速度快、可跨平台(平台:操纵体系平台Windows、Linux、Mac)


三、数据库访问和配置

1、使用MySQL自带的客户端工具访问

2、使用DOS访问(命令行窗口 Win+R→ cmd)

3、毗连工具(SQLyog或其他Navicat):


四、数据库常用术语

1、关系

一个关系就是一张二维表(表)比如:员工表

编号 姓名 薪水

10001 刘小锤 12000.0

10002 玛丽 13000.0

10003 罗斯 15000.0...

2、元组 表中的一行,一条记录,学名叫元组

3、属性 表中的一列,就是一个属性,也称为:列、字段

五、SQL语句

SQL:结构化查询语言,通过SQL可以操纵数据库

1、SQL分类

1)数据定义语言 DDL

目的:对数据库中库、表,举行创建、修改、删除 管理表结构

<1>创建:create <2>修改:alter<3>删除:drop

2)数据操纵语言 DML 

目的:对表中的数据,举行插入、更新、删除  改变表中的数据

<1>插入:insert<2>更新:update<3>删除:delete

3)数据查询语言DQL

目的:对表中的数据,举行查询 查询:select

4)数据控制语言DCL(了解)目的:用于授于和回收权限

5)事务控制语言TCL(了解)目的:用于控制事务(一个完整的操纵过程)

2、SQL语句的编写规范

1)SQL语句不区分大小写(从功能来说,但是性能有影响)

2)SQL语句中,关键词建议大写,比如CREATE 表名、列名,一样平常小写

3)SQL语句每句话用分号末端;

六、数据库根本语句

exit退出mysql

1、查看当前全部的数据库

语法:show databases;

2、创建数据库

语法格式:create  database 数据库名称 charset 字符集;

说明:数据库的名称不能和之前重复!常见的字符集utf8(最常用) 、gbk、Latin1(不支持中文字符) 如果字符集差别一。中文就会乱码!

案例:创建一个数据库,名称为testing,字符集设置为utf8create database testing  charset utf8;

命令行创建数据库(数据库名不是字母)报错;


 这个问题是语法上的错误,在MySQL中,为了区分MySQL的关键字与普通字符,MySQL引入了一个反引号。改为反引号就不会报错了;


小贴士:命令提示符清屏cls

3、查看创建好的数据库信息

语法格式:show create database 数据库名称;案例:查看testing数据库信息show create database testing;


4、选择(使用)数据库

语法:use数据库;

案例:选择testing数据库

use testing;  

5、查看数据库中的全部表

语法:show tables;

案例:选择testing数据库,并查看数据库中的表

use testing;show tables;

6、删除数据库

语法:drop database 数据库名称

案例:删除testing数据库,并验证drop database testing;show databases;
七、数据类型

 数据类型就是对数据(文字、数字、日期、音频、视频...)的分类,数据类型用于规定某列可以存储的数据风格。

1、整数类型 int

int大概int(n) 表示整数,n表示数值的宽度

比如:int(5)最多5位整数,范围:-99999-99999

2、小数类型 double

double(n,m) 表示小数(浮点数)

n表示总的有效数位,m表示小数点后位数

比如:double(7,2) 123.56 1234.56 对的

数据范围的大小和“需求有关”!

测验成绩100 double(3.1) 100 99.5 0

3、字符类型

1)固定长度字符 char

char(n) 存储固定长度的字符,n表示字符的长度(个数)

比如:char(5) 'ABC' 不够的自动用空缺补齐

2)可变长度类型 varchar

varchar(n)存储可变长的字符,n表示字符的最大长度(个数)

比如:varchar(10) 最多只能生存10个字符

'abc123' 'abcdefg123'

'Hello World!'超了


3、日期时间类型

1)日期类型:date

date 用于存储日期,一样平常日期格式:YYYY-MM-DD  2022-07-22

datetime用于存储时间日期,一样平常格式:YYYY-MM-DD HH:mm:ss

比如:2022-07-22 16:01:53

八、数据库操纵语句

1、创建表

语法:create table 表名( 列名1 数据类型, 列名2 数据类型, ……, 列名n 数据类型);

训练:在testing库中,创建一个test01表

use testing;

create table `1111`( #`1111`反引号 id int(8), #编号 name varchar(30), #姓名 gender char(3), #性别 score double(4,1) #分数  最后一个字段后不写,);

2、查看表结构

语法:desc 表名;

如果这个表不存在:提示不存在

如果表存在:显示表的结构

3、插入语句

1)向表中针对全部列插入数据

语法格式:

insert into 表名 values(列值1, 列值2,...,列值n);

说明:

每执行一条insert语句,如果乐成,就会向表中插入一条记录!(一行)

values中的列值 和 表结构中的列的序次 是一致的!

在数据库中,数值类型数据 直接填写

字符串 和 日期类型数据,需要添加单引号!

案例:向test01表中,插入一条记录,默认是全部列

 1)查看test01表的结构 desc `1111`; #反引号 2)根据语法,插入数据

#查看结果

2)向表中的指定列插入数据

语法:

insert into 表名(列名1, 列名2,......, 列名n) values(列值1, 列值2, ......., 列值n);

说明:如果未提供的列,值默认是空值null

案例:向1111表,指定的列,插入以下数据

id

name

gender

score


king

99.5


#查看表结构desc `1111`;#根据语法、指定的列插入数据
#查询验证select * from `1111`;

规律:整数、小数 直接写值

字符串、日期、要写单引号

char varchar date datetime

4、更新语句

语法:

update 表名 set 列名=该列新值, 列名=该列新值,....where 记录匹配条件;

如果不写where条件,表示对全部行都操纵!

案例:更新1111表,将id是101的记录,将性别改为男


#查询验证select * from `1111`;


5、删除表中的数据

语法:

delete from 表名 where 记录匹配条件;

说明:如果不写where子句,表示无条件,删除表中的全部记录(行)!

案例:删除1111表中,姓名(name)是king的记录


select * from `1111`;


6、删除表

语法:drop table 表名;

案例:删除test03表,并验证


九、查询语句(重点DQL)



1、查询全部

语法:

select * from 表名;

说明:*表示全部例

由于不写where子句,表示无条件,找到全部行!

2、查询表中指定列数据

语法:select 列名1, 列名2, ......,列名n from 表名;

案例:查询表中,姓名(name)、年事(age)


3、给列起别名(关键字:as)

语法:select 列名1 as 别名1, 列名2 as 别名2, ......列名n as 别名n from 表名;

说明:可以省略as, 列名和别名之间使用空格隔开!


思绪:平时给列起别名,一样平常用英文、拼音、少用中文名,目的是为了简化列名

4、去除重复的列值(distinct)

语法:select distinct 列名 from 表名;

案例:查询a表中,员工的age,并去重显示


5、分页查询(限定 limit)

语法:

select */列名 from 表名 limit 初始位置,每页行数;

说明:

初始位置:表示从那里开始查询,是可选项,可以不写(页码-1)*每页条数

如果不写,默认值是0,表示第一条记录开始

如果写了,比如是9,表示从第10条开始

每页行数:表示每页要查询的记录行数

案例:查询emp表中的前2条记录

select * from a limit 0,2;select * from a limit 2;


6、排序(order by)

语法:select */列名 from 表名 order by 列名1 asc/desc,列名2 asc/desc;

asc 表示升序,默承认以不写,desc表示降序,若需要,不能省略

多列排序规则,先按照列名1举行排序(第一梯队),如果列名1的值雷同,再按照列名2排序(第二梯队)

案例:查询emp表中,员工姓名(ename),职位(job),工资(sal),部分编号(deptno),先根据部分编号降序排序,再根据工资升序排序


7、条件查询(where)重点

select */列名,表达式

from 表名

where 查询条件 

order by 列名1 asc/desc,列名2 asc/desc;

查询条件说明:

1)关系运算符

> < = >= <= (!= <>)不即是

2)逻辑运算符

and or not与 或 非

3)特别用法

is  in  between 5 and 10 like是 在....之列 在5和10之间的任何一个值 像 模糊查询

案例:查询a表中,分数(score)不即是90分的,学员的姓名(name),分数(score),年事(age),根据分数降序排序


训练:查询a表中,地址不即是北京大概年事大于30岁的,学员姓名(sname),年事(age),地址(address),根据年事升序排序

select sname, age, address from stu01 where address!='北京' or age>30 order by age asc;

规律:此中有两个地址是null值,导致记录没有匹配到!(null值影响之一)

案例:查询emp表中,职位(job)不是manager的员工信息。

select * from emp where job!='manager';select * from emp where not job='manager';select * from emp where job<>'manager';

训练:查询student表中,班级(sclass)是1年1班,1年2班,1男3班的学员的信息

select * from student where sclass='1年1班' or sclass='1年2班' or sclass='1年3班';#等价于(列名 in (值1,值2,值3,......))select * from student where sclass in ('1年1班','1年2班','1年3班');

案例:查询emp表中,员工的奖金(comm)为null的员工信息

写法1:不对!任何值,包括空值null,都无法和null值直接比较!直接比较,结果都为假select * from emp where comm=null;精确写法select * from emp where comm is null;

结论:任何值和null值比较,要求使用 is null 、is not null 、否则无法比较!

案例:查询emp表中,工资(sal)在1250-4500之间(包括边界)的员工信息

select * from emp where sal between 1250 and 4500;select * from emp where sal >=1250 and sal<=4500;

技巧:模糊查询(like...像...那样)

select */列名 from 表名

where 列名 like 条件;

#条件说明:

%:表示0个或多个字符(恣意字符)

_:表示恣意一个字符

训练:查询表中,姓名的开头第一个是x的信息;

训练:查询表中,姓名(sname)包开头是x并且年事(age)大于18岁的,学员的姓名(name),根据学员编号降序序分列


8、聚合函数(组函数,分组函数)

1)sum(列名)

功能:针对某列的累加和,求和

案例:查询表中,员工的年事的总和是多少

#为函数表达式起别名

2)avg(列名)

功能:针对某列值求平均数

案例:查询出a表中,学员的平均分(score)是多少?


3)min(列名)

功能:求出某列的最小值

案例:查询a表中,学员的最低分


4)max(列名)

功能:求出某列的最大值

训练:查询a表中,学员的最高分


训练:查询a表中,学员的最高分和最低分?


5)count(列名/*)

功能:count(*) 统计全部行的总行数

遇到null值也会统计在内!

count(列名)统计某列值得个数,null值会被忽略,不加入统计!

结论:聚合函数遇到null值会忽略,除了count(*)

案例:查询a表中,员工的总记录条数?


案例:查询emp表中,有奖金(comm)的员工的数量?

#思绪:有奖金 就是comm字段的值 不为null#联合聚合函数,针对某字段统计,遇到null会忽略掉select count(comm) from emp;

#没有奖金的有几个?

select count(empno) from emp where comm is null;

训练:查询a表中,年事(age)有多少种?

#思绪,聚合函数中的数据可以去重-distinct 先去重再统计

select后可以跟列名、表达式、函数

select 1+2;

select now();#查看当前体系的时间和日期 函数

9、分组查询(group by)

含义:根据表中的某一列,作为分组条件,将同组记录聚集在一起

分组是为了聚集,聚集是为了计算

语法:select 列名/聚合函数/*

 from 表名

 where分组前的过滤条件

 group by 列名

 order by 列名1 asc/desc,列名2 asc/desc排序;

案例:查询a 表中,男生和女生的人数?

#有几组,就会出现几行结果,每一组出一行结果统计(聚集)

案例:查询student表中,分数在70-90分之间的(包括边界),班级(sclass)的名称、班级的人数,班级的分数总和(score),班级的平均分,要求根据班级的平均分举行降序分列

#聚合函数表达式使用别名,后续按照别名指代,举行排序

select sclass, count(sid), sum(score), avg(score) as avgsc from student where score between 70 and 90 group by sclass order by avgsc desc;+--------+------------+------------+----------+| sclass | count(sid) | sum(score) | avgsc |+--------+------------+------------+----------+| 2年3班 | 1 | 90.0 | 90.00000 || 1年1班 | 2 | 172.5 | 86.25000 || 1年2班 | 2 | 165.5 | 82.75000 || 2年1班 | 1 | 78.0 | 78.00000 || 1年3班 | 3 | 225.5 | 75.16667 |+--------+------------+------------+----------+

10、having子句

说明:having子句对分组后举行过滤,分组后的过滤条件

经常和分组查询一起使用:(group by)

语法:

select 列名、聚合函数、别名,....from 表名where 分组前的过滤条件group by 分组字段having 分组后的过滤条件order by 列名/聚合函数/别名 asc/desc,....

说明:where和having的区别?

where是分组前对整个表格数据举行过滤,where字句中不能使用聚合函数!

比如:where avg(sal)>1000错误的! 未分组,无法计算组函数!

having是在分组后的过滤,可以使用聚合函数的结果作为判断依据;

必须和group by一起使用,不能单独出现!

案例:查询emp表中,部分的平均工资大于2000的,每个部分的编号(deptno)、部分人数、部分总工资(sal)、平均工资,要求按照部分人数降序分列

写法1:错误的 不能在where字句中使用分组函数!需要用havingselect deptno, count(empno), sum(sal), avg(sal)from empwhere avg(sal)>2000group by deptnoorder by count(empno) desc;写法2:精确的select deptno, count(empno), sum(sal), avg(sal)from empgroup by deptnohaving avg(sal)>2000order by count(empno) desc;

11、子查询(嵌套查询)

含义:一个sql语句里,又包罗一个sql语句

在主页查询中,嵌套子查询

(重要目的) (中间步调)

原因:有时1条sql比较 复杂,无法立即查回结果:

可以将中间步调,作为子查询,先执行

将子查询的结果再交给主查询,完成最后任务

头脑:化繁为简,分而治之(逐个击破)

案例:求出谁的工资最低?#子查询 求出最低工资是多少?#将主查询 嵌套 子查询,完成查询的嵌套select ename,sal from empwhere sal=(select min(sal) from emp);

12、多表毗连查询(重点,难点)

1)内毗连查询

含义:将几张表,按照关系举行匹配;

是一种严格的匹配,遇到null值会被忽略掉!(emp最后一个员工在90部分,内毗连查询不出来,无法匹配,导致记录丢失)

语法:

select(别名1.列名1,别名2.表名2.........)from 表名1,别名1,表名2,别名2...........

留意:如果不写表毗连条件,会形成"笛卡尔积",emp表的15条记录会和dept表的7条记录,都组合匹配一次,形成15x7=105条结果!(不写表毗连条件这种叫做交叉查询


加了条件后,就剩下15条员工信息

举例:两个表的毗连查询

#不加任何条件,形成笛卡尔积: * 两个表的全部列 select * from emp,dept; #105 条 #添加表毗连条件   等值关系:等值毗连 #为了区分差别表的雷同字段,需要为表起别名  select *  from emp e,dept d                       两个表  where e.deptno = d.deptno;

自毗连:一个表中的两个字段有关系,将一张表通过起别名的方式,模仿成两张表!

训练:查询emp表中,员工编号,员工姓名,员工职位,员工的领导编号,员工领导的姓名


select e.empno,e.ename,e.job,e.mgr,m.empno,m.enamefrom emp e,emp mwhere e.mgr=m.empno;(员工的领导编号=领导的编号)#等价于:inner join   on 表毗连条件(inner可以省略)select e.empno,e.ename,e.job,m.empno,m.enamefrom emp e inner join emp mon e.mgr = m.empno;

14 rows in set (0.01 sec)#14条记录

说明;以上都是内毗连------inner join

记录会严格匹配,比如遇到null会导致记录丢失(King的mgr为null)

2)外毗连查询(outer join)

说明:用来办理记录的"一个都不能少"的问题

select....from 左表 a left outer join 右表 bon 表毗连条件where 其它过滤条件

分为: 左外毗连 Left outer join on 保证左表的记录一个都不能少!(outer可以)

右外毗连 right outer join on保证右表的记录一个都不能少!

全外毗连 将左边和右边归并 保证两边表的记录一个都不能少!

案例:将以上内毗连,改为外毗连,目的将老板King找回来

select e.empno,e.ename,e.job,m.empno,m.enamefrom emp e left outer join emp m                  (左表毗连右表)on e.mgr = m.empno;15 rows in set (0.01 sec)#15条记录

结论:外毗连是对内毗连的补充,办理记录一个都不能少的问题!

十,约束

说明:创建表的时候,可以设置一些规则,只有满意这些规则,才可以插入数据,我们称这些规则为约束.

好处:确保数据的完整性,一致性!

分类:

主键约束 (PK) primary key

唯一约束(UK) (unique)

非空约束 (NN) not null

默认值约束 default

1.主键约束(primary key)

含义:主键约束的列,作为表中的主属性 唯一且非空

怎样添加:在创建表时,添加主键约束

create table work01( id int primary key, name varchar(30), age int(3));

联合主键:两个列联合起来 唯一且 非空

说明:使用主键约束修饰2列或多列,一样平常使用2列create table work02( id int(8), name varchar(30), age int(3), primary key(id, name)

);

删除主键约束:

alter table 表名 drop primary key;改变   表       移除   主键

案例:删除work01表中的主键约束,并验证

alter table work01 drop primary key;

结论:主键确保行的唯一性!主键=唯一+非空+其它好处

2.唯一约束(unique)

说明:针对某一列,组合列,定义唯一约束,确保数据不重复;

举例:创建表时,添加唯一约束:

create table work03( id int(8) primary key, name varchar(30), phone varchar(20) unique, email varchar(30) unique, address varchar(50));

删除唯一约束:要找到管理约束的信息表(show keys )

语法格式1:

alter table 表名 drop index key-value;

语法格式2:查看约束关系,找到列名和约束key-name的关系,

show keys from 表名;

案例:删除work03表中,phone列的唯一约束

第一步:show keys from work03;     #key-name的值:phone第二步:desc work03;第三步:alter table work03 drop index phone;第四步:desc work03;

3.默认值约束(default)

说明:为某列设置默认值,当插入数据时,不提供值,就使用默认值取代;

如果提供了值,就直接使用.

创建表时,添加默认值约束:create table work04( id int(8)      primary key, name varchar(30), email varchar(30)         unique, age int(3)                default 18, address varchar(50)       default '北京');#插入数据-默认值   只提供前3列的值,后2列会使用默认值insert into work04(id,name,email) values(2,'lucy','lucy@qq.com');+----+------+-------------+------+---------+| ID | name | email       | age  | address |+----+------+-------------+------+---------+|  1 | mary | mary@qq.com |   25 | 杭州    ||  2 | lucy | lucy@qq.com |   18 | 北京    |+----+------+-------------+------+---------+

删除默认值:

语法:使用改变表结构,对枚举行重现定义

alter table 表名 modify 列名 数据类型(宽度) default null;大概:不写默认值为null,默认值就是nullalter table 表名 modify 列名 数据类型(宽度);

案例:删除work04表中age列的默认值,并验证

alter table work04 modify age int(3);

4.非空约束(not null)

说明:用来约束某一列的值不答应为null

好处:数据库表中null会造成很多影响,不答应为null能够从根本上杜绝null值造成的影响

NULL值有哪些影响?

1.null加入算数运算,结果也为空

select comm,comm+100 from emp;

如果comm为null,用0取代;否则还使用comm的值

select comm,ifnull(comm,0) +100 from emp;

2.null值加入比较,结果都为假,导致记录丢失,使用外毗连可找回;

和null值比较,使用 is null , is not null

3.全部的聚合函数都会忽略null值,除了count(*)会将null值统计在内;

sum(comm) avg(comm) max(comm) min(comm) count(comm)

创建表时,添加非空约束:

create table work05( id int(8) primary key, name varchar(30) not null, age int(3) default 18, email varchar(30) unique, address varchar(30));

删除非空约束

alter table 表名 modify 列名 数据类型(宽度);

案例:删除work05表中name列的非空约束

show keys work05;.alter table work05 modify name varchar(30);desc work05;

十一,视图(view)

说明:可以理解为就是一张假造表,通过视图可以查询出'假造表'中的数据

好处:使用视图能够大大的简化后续的sql语句;

已经将复杂sql查询逻辑提前完成,提供的视图供后续使用;

不会进步sql的性能(查询速度更快)

1.创建视图

语法:

create view 视图名称as查询语句;

案例:创建一个视图,视图名称 view_emp,查询emp表中全部数据,作为试图结果

create view view_empasselect * from emp;#使用select empno ,ename,salfrom view_emp;

2:查询视图

原理:通过查询视图,就好对比"假造表"直接查询

'假造表'是通过视图中存储的sql语句查到的结果!

视图中sql是随时使用,结果是最新的!

案例:查询view_emp视图中,员工姓名,职位,工资,根据工资降序分列

select ename,job,salfrom view_emporder by sal desc;

3.删除视图

drop view 视图名称;

案例:删除视图view_emp,并验证

drop view view_emp;#验证:desc view_emp;#报错 无view_emp视图了show tables;#无view_emp视图了

小结:怎样理解视图view?

1.视图也是数据库中的一种对象;

2.视图是为了生存一条sql语句,不占用表空间(存储大量数据);

3.使用视图可以大大简化我们的sql语句;

4,使用视图不会进步查询速度;

十二.索引(index)

说明:索引是创建在表中的某列上,也是数据库中的一种对象;

索引的添加能够进步sql的查询服从(速度);

索引的创建会占据表空间;

索引能够进步查询服从,但是会低落增加,删除,修改的服从

索引适合在大量稳定数据中,查询结果,进步服从使用

1.创建索引

语法:

create index 索引名称 on 表名(列名);#规律:主键是默认的索引列#索引平时根据主键作为条件查询,服从高   where deptno=999

案例:对work06表中,对address列添加索引,索引名称为index_address_work06.

create index index_address_work06 on work06(address);

2.查看表中的索引

show index from 表名;

案例:查看work06表中的索引(三个索引)

show index from work06;

说明:

主键字段,会自动添加索引;

唯一约束的字段,也会自动添加索引;

使用效果:针对哪个字段添加索引,按照该字段查询的服从能进步!

3.删除索引

语法:删除某表的某索引

 drop index 索引名称 on 表名;

案例:删除Word06表中,address列上的索引,索引名称通过sql查看

查看表中的索引名称?show index from work06;删除work06表中的索引index_address_work06drop index index_address_work06 on work06;再查看show index from work06;

思索:软件测试和数据库有关系吗?请举例分析。(有)

1.搭建测试情况中,数据情况的搭建(数据库mysql,库,表,表中数据,数据之间什么关系)

2,预先准备初始数据(insert into),比如向表中添加几条用户账号记录,作为登录的条件.

3.如果业务数据产生了变化,可以通过更新语句(update),修改订单状态,供前端查询

4.如果某项记录引起业务辩说,可以删除(delete)

5.如果注册了账号,下了订单,可以通过查询语句(select)举行验库,检查数据是否乐成添加了

6.步伐员,测试员,一样平常通过sql对数据库举行增,删,改,查操纵.


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表