当前位置:首页 » Mysql技术教程

MySQL数据库

2017-06-17 00:02 本站整理 浏览(4)

                     Mysql数据库

【教学内容】

1、数据库介绍&安装

2、创建库和表

3、简单增删改查语句

4、Mysql函数

5、表的设计和约束

6、多表查询

【教学总结】:

【第一阶段】

【目标:数据库介绍&安装】

1、数据库概述

在前期学习的过程中,数据基本都保存xml或者普通的文件中。在真实企业级开发数据,数据都需要保存专业的软件中,这些软件就是数据库软件。

数据库软件不需要我们去研发,由专门的数据库厂商提供。

常用的数据库软件:

Oracle:Oracle数据库。甲骨文公司,专门数据库厂商,收购BEA 、SUN、MySQL ------- 收费 大型数据库,用于任何系统任何平台。

IBM:BD2数据库。IBM数据库产品,大型收费数据库 websphere服务器一起使用。

Mysql数据库,早期由瑞典一个公司开发的,后期被sun公司收购,随着sun公司的被Oracle收购,Mysql也成了Oracle公司的产品。

Microsoft:Sqlserver数据库。微软公司数据库产品,收费中等规模数据库 ,操作系统要求是windows 结合.net 一起使用。

Sybase:Sybase数据库,中等规模数据库。

Java开发者主要使用 MySQL 、Oracle、DB2 三种数据库。

2、什么数据库

就是一个文件系统,通过标准SQL语言操作文件系统中数据,用来存放数据的软件系统。

3、关系型数据库

一般对于一个软件系统程序,程序中的数据之间或多或少都会有一些关系存在,而上述的这些数据库软件系统恰好就可以保存这些具备一定对应关系的数据。

关系型数据中的数据可以使用E-R图来描述:

E-R图翻译成中文:Entity Relationship Diagram 实体关系图。

在E-R图中:

实体(Java中的对象)使用矩形表示。

实体的属性(Java中对象的属性)使用椭圆表示。

实体和实体之间的关系使用菱形表示。

4、数据库的安装和卸载

mysql提供了2种安装方式:

第一种是解压缩版本的。

第二种是需要完全安装版本(建议使用完全安装版)。

安装的过程需要参考可以参考《MySQL安装图解》

MySQL数据库的卸载也可以参考《mysql卸载图解》

注意:Mysql的卸载中在卸载完Mysql的安装文件之后,还需要删除Mysql的数据文件。数据文件在mysql的按照目录my.ini文件中。

安装细节:选择自定义安装,建议安装的时候mysql的安装目录中不要有空格和中文

安装后进行mysql配置:

1) 配置mysql 默认字符集,默认latin1 等价于 ISO-8859-1 改为 utf8。

2) Include Bin Directory in Window Path 将mysql/bin 目录配置环境变量path ---- 勾选

3) 输入超级管理root 密码

测试mysql是否安装成功 启动cmd窗口 输入 mysql -u root -p 回车 输入密码 1234

出现 mysql> 安装成功

5、超级管理员密码重置

1) 停止mysql服务器 运行输入services.msc 停止mysql服务

2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)

3) 新打开cmd 输入mysql -u root -p 不需要密码

use mysql;

update user set password=password('abc') WHERE User='root';

4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程

5) 在服务管理页面 重启mysql 服务。

【第二阶段】

【目标:创建库】

1、mysql数据库的内部存储结构

在前面学习tomcat的时候介绍过,当一台电脑安装了tomcat服务器,那么这个电脑就是一个web服务器。

当一台电脑安装了mysql数据库,那么这台电脑就称为数据库服务器。

用户可以通过客户端直接去连接这台安装了mysql的数据库的电脑。

用户通过在dos窗口中输入:

mysql (-h 连接的主机ip -P端口3306)-u 用户名 -p 密码

登录mysql数据库。

当电脑安装了mysql数据库软件之后,在这个数据库软件中可以拥有多个多个数据库,每个数据库中又可以拥有多个数据表。即就是一个数据库软件可以管理多个数据库,每个数据库又分别去管理自己库中真正存放数据的数据表。而每个数据表是真正存放数据的地方。

2、SQL语句

SQL语句:Structured Query Language结构化查询语言。SQL语句不依赖于任何平台,对所有的数据库是通用的。学会了SQL语句的使用,可以在任何的数据库使用。

SQL语句是一个非过程性的语言,每一条SQL执行完都会有一个具体的结果出现。

比如前面学习的Java等语言属于过程性语言,在其中可以定义变量等完成复杂的运算。而SQL语句本身是不支持这些的,但是不同的数据库厂商针对自己数据库的特点在原有的SQL语句上进行的增强。比如 Sqlserver中的T-SQL、Oracle中的PL/SQL等可以编写复杂的SQL语句。

SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能。

3、SQL分类

DDL (数据定义问题)

数据定义语言 - Data Definition Language

用来定义数据库的对象,如数据表、视图、索引等

DML  (数据操纵问题)

数据处理语言 - Data Manipulation Language

在数据库表中更新,增加和删除记录

如 update, insert, delete

DCL (数据控制问题)

数据控制语言 – Data Control Language

指用于设置用户权限和控制事务语句

如grant,revoke,if…else,while,begin transaction

DQL (数据查询问题)

数据查询语言 – Data Query Language

select

学习SQL语言,按照学习路线:

1、数据库的操作   

2、数据表的操作  

3、数据表中数据的操作

4、查询所有数据库

在操作数据库之前,首先我们需要连接到数据库上:

查询所有数据库:show databases;

查询当前数据的编码表:show create database 数据库名;

5、创建数据库

SQL语言的语法由W3C组织指定,查阅对应的帮助文档即可学习相关的语法规则。先学习通过sql语句对数据库的增删改查操作。

创建数据的语法:

1、create database 数据库名:由于创建数据库时没有指定编码表,因此会使用安装数据库时默认的编码表

2、create database 数据库名 character set 编码表名; 创建数据库会使用指定的编码表

3、create database 数据库名 character set 编码表名 collate 排序规则; 使用指定的编码表同时还可以根据编码表指定排序规则。

练习:

创建一个名称为mydb1的数据库。

创建一个使用utf8字符集的mydb2数据库。

创建一个使用utf8字符集,并带校对规则的mydb3数据库。

补充:每次创建一个数据库在 数据存放目录中生成一个文件夹 , 每个文件夹中存在 db.opt 存放默认字符集和校对规则

6、删除数据库

语法 :drop database 数据库名称;

删除前面创建的mydb1数据库

查看当前数据库服务器中的所有数据库

查看前面创建的mydb2数据库的定义信息

7、修改数据库编码集

语法:alter database 数据库名称 character set 字符集 collate 比较规则;

修改mydb2字符集为gbk

8、切换数据和查看正在使用的数据

切换当前使用数据库

语法:use 数据库名

查看当前使用的数据库:

语法:select database();

所有数据库相关操作语句都属于DDL 语句

【第三阶段】

【目标:创建表的语句】

1、数据表的创建

语法:create table 表名(列名 类型(长度),列名 类型(长度)... );

一个数据表可以存在很多列(字段),每列具有类型和长度。

注意:

1、创建表时没有指定字符集,将采用数据库默认字符集。

2、创建表之前必须使用use db 语法指定操作数据库。

创建数据表时,一个表中的字段就和Java中的对象的属性是对应的。一个对象就是这张表中的一行数据记录。

class Employee{

private String name;

private int age;

private String password;

private Date birthday;

}

上述的Java类,在数据库对应的表的创建方式应该是:

create table user(

);

而Java类中的每个属性的数据类型在数据库中也有对应的数据类型:

Java中的类型

数据库中的类型

说明

String,char

char(长度),varchar(长度)

char是定长 varchar是变长

解释:

char(8) 保存 lisi,因为lisi 只有四个字符,所有会补充四个空格,成为8个字符存入 char(8)中

如果有 varchar(8) 自动根据存放内容改变长度

byte、short、int、long、float、double

TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE

boolean

bit

存放0或者1

Date

date (只有日期)

time(只有时间)

datetime(日期时间都有)

timestamp(日期时间都有 )

datetime和timestamp 表现形式上完全相同,区别就在于timestamp 在数据库可以自定更新(当前时间)

大数据类型 inputStream 二进制文件 Reader 文本文件

blob(存放大二进制数据)

text(存放大的文本文件)

tinyblob tinytext 255字节

blob text 64KB

mediumblob mediumtext 16MB  

longblob longtext 4GB

上述的Java类对应的数据库中的数据表为:

create table employee(

name varchar(32),

age int,

password varchar(32),

birthday date

);

查看表结构 desc 表名;

创建数据表时,只有字符串类型必须写长度,而其他类型都有默认长度。

2、单表创建时约束

在创建数据表的时候,一般都需要对表中的字段进行约束限制,而把这个约束称为表的约束。

约束的作用:保证数据有效性和完整性。

表的约束有三种:

1、主键约束,primary key

主键主要作用是记录某个列(字段)可以唯一区分其他一行信息记录,这个列(字段)就可以是主键 (唯一非空)

2、唯一约束,unique

该列(字段)的值不允许重复。

解释:一张表中可以有很多个唯一约束,只能有一个(两个)作为主键约束。

即就是在一张表唯一约束的列可以有多列,但是主键一般只会使用一列或者两列(联合主键)

3、非空约束,not null

该字段的值不能为空

创建有约束的单表:

create table employee2(

id int primary key auto_increment,

name varchar(32) unique not null,

age int not null,

password varchar(32)  not null,

birthday date

);

如果表中的主键约束类型为 数值型 int bigint ,添加auto_increment ,在给表中增加数据的时候,主键会自定增加,不用插入。

3、数据表结构修改

表结构修改语法:

alter table 表名 增/删/改 列名 类型(长度) 约束;

1、增加列: alter table 表名 add 列名 类型(长度) 约束;

2、修改现有列类型、长度和约束 语法:alter table 表名 modify 列名 类型(长度) 约束;

3、修改现有列名称 语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;

4、删除现有列 语法:alter table 表名 drop 列名 ;

5、修改表名 rename table 旧表名 to 新表名;

6、修改表的字符集:alter table person character set utf8;

练习:

1、在employee2表上增加salary列。

2、修改birthday列不能为null

3、修改列名name为username

4、修改username列的长度为60

5、删除age列

6、将employee2表名修改为person表

4、数据表删除

语法:drop table 表名;

5、查看数据表结构

desc 表名; 查看表结构

show tables ; 查看当前库内所有表名

show create table 表名; 查看建表语句和字符集

所有数据表结构操作语句都是 DDL

【第四阶段】

【目标:简单增删改查】

学习了数据表本身的增删改查之后,现在学习对数据表中的数据的操作。学习的顺序是:增,改,删,查询。

1、向数据表插入记录

语法:insert into 表名 (列名,列名,列名......) values (值,值,值......);

.

上述的语法是给表中每列插入数据,需要注意以下问题:

1、插入值类型必须和列类型匹配。

2、值长度不能超过列定义长度。

3、值的顺序和列顺序对应。

4、字符串和日期型值必须写单引号。

5、插入空值可以写null。

创建一个学生表,拥有id,年龄,姓名,性别,成绩,出生年月日字段:

create table student(

id int primary key auto_increment,

sage int ,

sname varchar(32) not null,

gender varchar(10) not null,

score double not null,

birthday date

);

插入数据:

insert into student (id,sage,sname,gender,score,birthday) values(null,22,'zhangsan','male',98.99,'1999-09-09');

如果是给数据表中每列都插入数据,可以省略列名:但是后面值必须要和表中所有列进行匹配,按照表中列顺序

insert into 表名values(值,值,值……);

如果表中的列可以为空,或拥有默认值,省略可以为空,有默认值部分列名,后面值要和前面列进行匹配

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

使用控制台插入中文:

错误原因:mysql client 采用默认字符集编码 gbk

查看系统所有字符集 : show variables like 'character%';

看到mysql中默认客户端是UTF8的编码表,而我们的dos控制台使用的GBK。这样我们使用控制台给数据库中插入的数据全部都是会乱码。

这时我们需要修改mysql中控制台的编码表为gbk即可。

MYSQL中共有6个地方字符集 :client connetion result 和客户端相关 、database server system 和服务器端相关

修改客户端的编码表有2种方式:

第一种:当前窗口临时修改 set names gbk ;只对当前窗口有效,关闭后就会失效

第二种:配置mysql/my.ini 文件

[mysql] 客户端配置

[mysqld] 服务器端配置

修改客户端字符集 [mysql] 后字符集  default-character-set=gbk

修改了mysql的配置文件之后,需要重启mysql服务。

2、数据记录更改操作

语法: update 表名 set 列名=值,列名=值.... where条件语句; 如果没有where条件语句,默认修改所有行数据

注意:一般修改数据表中的数据,都需要添加where条件,否则将会把整个表中的数据修改,开发时需要十分谨慎。

练习:

1、将所有学生的年龄修改为20岁

2、将姓名为’zhangsan’的学生成绩修改为60分

3、将姓名为’lisi’的学生成绩修改为80分,性别改为女

4、将wangwu的成绩在原有基础上减去10分

3、数据记录的删除操作

语法:delete from 表名 where条件语句 ;

如果不加where条件就会删除当前表中的所有数据。

练习:

1、删除表中名称为’zhangsan’的记录

2、删除表中所有记录

如果要删除表中所有数据记录,使用 truncate table 表名; 等价于 delete from 表名;

4、面试题

使用delete删除表中所有记录和使用truncate table删除表中所有记录有何不同 ?

truncate 删除数据,过程先将整个表删除,再重新创建

delete 删除数据,逐行删除记录

ttruncate 效率要好于 delete

truncate 属于DDL ,delete 属于DML

事务管理只能对DML 有效 ,被事务管理SQL语句可以回滚到SQL执行前状态

insert update delete 属于DML 语句

5、数据表记录的查询

5.1、语法一 :

select [distinct] * | 列名,列名... from 表名;

select * from 表名; 查询该表中所有列信息

select 列名,列名... from 表名;  查询表中指定列的信息

distinct 用于去除掉查询中的重复数据。

重新给student表中插入如下数据:

insert into student (id,sage,sname,gender,score,birthday) values(null,23,'zhangsan','male',98.99,'1990-09-09');

insert into student (id,sage,sname,gender,score,birthday) values(null,23,'lisi','男',56.99,'1990-02-09');

insert into student (id,sage,sname,gender,score,birthday) values(null,24,'王五','女',75.99,'1988-01-01');

insert into student (id,sage,sname,gender,score,birthday) values(null,25,'赵六','男',80.99,'1980-11-12');

练习:

1、查询表中所有学生的信息

2、查询表中所有学生的姓名和对应的成绩

3、过滤表中重复数据 (查询成绩,排除完全相同重复数据)

给数据表中插入相同的成绩:

insert into student (id,sage,sname,gender,score,birthday) values(null,18,'田七','女',80.99,'1980-11-12');

5.2、语法二 :

select 表达式(列名执行运算) from 表名;

练习:

1、在查询到的所有学生分数上加10分

这里仅仅是在查询的成绩上加了10分,而数据表中的成绩是没有变化的。上述lisi的成绩发现小数位数很多,这时因为在设计学生表的时候成绩字段我们使用的double,double表示的小数是一个近似值,需要表示精确数据,可以使用numeric(数据长度,小数长度)

在上述显示的结果中显示的成绩列名为score+10这样很不友好,可以使用给SQL语句中的列,表等信息起别名。

格式:使用 as 关键字就可以完成。

select 列名 as 别名 from 表名;

在对列起别名时,as可以省略。

问题:下面2个sql语句有啥区别:

1)select sname , score  from student;  查询sname  和math两列的值

2)select sname  score   from student; 查询sname 列的值,并给这列起的别名为score。

5.3、语法三 :

select 列名 from 表名 where条件语句;

练习:

1、查询姓名为zhangsan的学生信息

2、查询成绩大于80分的学生信息

5.4、运算符:

1) 相等= 不等 <>

2) between  ...and... 在两者之间取值 between 70 and 80 等价于 >=70 <=80  ----- 注意前面那个数要比后面那个数要小

3) in(值,值,值) 在指定值中任取一个 in(70,80,90) 值可以是70、80或者90

4) like '模糊查询pattern' 进行模糊查询 ,表达式有两个占位符 % 任意字符串 _ 任意单个字符 例如: name like '张%' 所有姓张学员  

name like '张_' 所有姓张名字为两个字学员

5) is null 判断该列值为空

6) and 逻辑与 or 逻辑或 not 逻辑非

练习:

1、查询成绩在80~100之间的学生信息

上述的查询语句也可以使用:

select * from student where score between 80 and 100;

2、查询年龄为18,23,25的同学信息

3、查询所有姓赵的学生信息

4、查询年龄>23,成绩>80的同学信息

insert into student (id,sage,sname,gender,score,birthday) values(null,null,'秋香','女',84,null);

查询没有生日学员信息

在SQL中不能使用=null,或者<>null ,判断是否为null 需要使用 is null, 不是null,需要使用 is  not  null

查询有年龄学员信息

5.5、语法四 :

select * from 表名 order by 列名 asc|desc ;

asc是升序排列,desc是降序排列

练习:

1、对成绩排序后输出

2、对年龄排序按从高到低(降序)的顺序输出

3、对学生成绩按照降序排序,成绩相同按照年龄降序

【第五阶段】

【目标:SQL中的函数】

聚集函数:也成为分组函数,主要是指SQL语句中的内置函数。用于分组统计。

1、count函数:

统计查询结果记录条数,语法:select count(*)|count(列名) from 表名;

练习:

1、统计一个班级共有多少学生?

2、统计成绩大于80的学生有多少个?

2、sum函数:

统计某一列数据的和,语法:select sum(列名) from 表名;

练习:

1、统计一个班级成绩和

2、分别统计年龄和成绩的和

3、统计年龄和成绩和值

上述这个结果是错误,在第2题目中分别统计出来的年龄和成绩和值明显比现在统计的值大。

这是因为在表中秋香的年龄为null 在把秋香的年龄和成绩 计算到一起的时候,在mysql中所有的null与其他数据运算的结果还是一个null,导致秋香的成绩没有加到总和中。

在mysql中有ifnull函数可以判断某列是否为null,当为null时,可以给这里设置一个值。

上述的ifnull(sage,0) 意思就是当某个学生的sage为null时,给其设置值为零。

3、avg函数:

统计某一列平均值  语法: select avg(列名) from 表名;

练习:

求一个班级平均分

可以使用计算出班级成绩总和,除以总人数,也可以使用avg函数

4、max,min函数:

max统计一列最大值

min 统计一列最小值

5、group by分组函数

select 分组函数 from exam group by 列名; 按照某列进行分组统计

分组操作,就是具有相同数据记录分到一组中,便于统计

创建订单表,演示分组函数。

create table orders(

id int,

product varchar(20),

price float

);

insert into orders(id,product,price) values(1,'电视',900);

insert into orders(id,product,price) values(2,'洗衣机',100);

insert into orders(id,product,price) values(3,'洗衣粉',90);

insert into orders(id,product,price) values(4,'桔子',9);

insert into orders(id,product,price) values(5,'洗衣粉',90);

练习:

1、对订单表中商品归类后,显示每一类商品的总价

需要先对商品进行归类,按照商品的名称分组,这样相同的名称商品就可以归纳为一组。然后在计算这些商品的价格和值。

2、查询购买了几类商品,并且每类总价大于100的商品

需要对商品按照名称归类,然后在计算商品的价格和值,最后需要按照价格和值进行过滤。

由于在sql语句中,分组函数不能使用where关键字之后,这里需要使用having关键字。

having关键字和where关键字作用是一致的,都可以对查询的数据进行过滤,区别在于having关键字后面的过滤条件中可以使用分组函数。

6、面试题目:

where 和 having 条件语句的区别 ?

where 是在分组前进行条件过滤,having 是在分组后进行条件过滤

使用where地方都可以用 having替换 , 但是having可以使用分组函数,而where后不可以用分组函数

select语句的小节:

S-F-W-G-H-O 组合 select ... from ... where ... group by... having... order by ... ; 顺序不能改变

解析顺序 : from  - where -  group by - having - select - order by

【第六阶段】

【目标:MySQL 数据库的备份和恢复】

在实际开发中经常需要对数据库中的数据进行备份和恢复。

Mysql提供相应的备份和恢复的机制。

1、备份命令

在mysql的安装目录的bin目录下有mysqldump命令,可以完成对数据库的备份。

语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径

由于mysqldump命令不是sql命令,需要在dos窗口下使用。

演示:

1、重新开启一个新的dos窗口。

2、导出数据。

这样在c盘下面就会有一个day12.sql文件:

这个文件中保存这day12数据库中的所有所有表和数据。

2、恢复命令

上述已经把数据进行了备份,因此就可以删除day12数据库了。

再次查询已经没有day12数据库

还原数据库使用的是mysql安装目录下的mysql命令

语法:

mysql -u 用户名 -p 数据库名 < 磁盘SQL文件路径

还原数据库的时候,是不会创建数据库的,只会还原数据库中的表和数据,因此需要在还原数据库之前,手动的创建数据库。

还原数据:

查询恢复的数据表:

补充:

在还原数据的时候,也可以在已经切换到需要还原的数据库中使用Source命令;

mysql>语法:source 备份文件路径

再次查询day12数据库中的所有数据表:

【第七阶段】

【目标:外键约束和表设计】

外键约束介绍

现在假设有2个表,分别是部门表和员工表。

在一个公司中拥有多个部门,而每一个员工都属于某个部分。也就是员工表中的员工和部门表中的部分之间存在一定的关系。

这样我们一般在设计这2张表的时候,会在员工表中增加一列,用于表示当前员工属于那个部门。而这一列经常会用部门表中的主键。

而把员工表引用的部门表的主键称为员工表中的外键。

外键的语法:

constraint 约束键名 foreign key (列名) references 外键对应的表名(列名)

演示创建上述两张表

create table emp(

id int primary key auto_increment,

name varchar(20),

salary double,

dept_id int,

constraint dept_id_FK foreign key(dept_id) references dept(id)

);

create table dept(

id int primary key auto_increment,

name varchar(20)

);

insert into dept values(null,'财务部');

insert into dept values(null,'技术研发部');

insert into dept values(null,'市场部');

insert into emp values(null,'张三','3500',1);

insert into emp values(null,'李四','3500',1);

insert into emp values(null,'老唐','10000',2);

insert into emp values(null,'老张','10000',2);

insert into emp values(null,'老王','8500',3);

insert into emp values(null,'老刘','8500',3);

使用mysql的图形化工具,这时可以看到两张表之间的关系:

当我们要删除dept部门表中的信息时,就无法删除

上述出错的原因是在删除部门表汇总的市场部时,由于这个部门的id在员工表中有员工引用,因此在删除之前,必须先把员工表引用市场部id的员工安排到其他的部分中,然后保证部门表中的市场部id没有其他表引用,才可以删除掉。

这就是外键约束的作用。外键约束是保证数据完整性和有效性。