Javaweb 第5天 mysql 数据库课程
MySQL数据库课程
两日大纲
● 数据库的概念、MySQL快速入门、SQL语言简介
● 数据库操作、表操作、数据记录操作、数据类型和约束
● 查询
● 多表关系、多表连接查询
● 视图
● 数据备份和还原、用户管理
*************************************************************************************************
1. 数据库的概念
1.1 数据(Data)
对客观事物的符号表示,如图形符号、数字、字母等,数据是数据库中存储的基本对象。
在日常生活中,人们直接用语言来描述事物;在计算机中,为了存储和处理这些事物,就要将事物的特征抽象出来组成一个记录来描述。
学生档案中的学生记录
(崔文华,男,1984,上海,计算机系,1990)
1.2 数据库(Database)
按照数据结构来组织、存储和管理数据的仓库。
1.3 数据库管理系统(DBMS)
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。
时下流行的DBMS:
Oracle
应用广泛、功能强大,分布式数据库系统、"关系-对象"型数据库
MySQL
快捷、可靠、开源、免费、与PHP组成经典的LAMP组合
SQL Server
微软公司数据库产品、针对不同用户群体的五个特殊的版本、易用性好
DB2
IBM数据库产品应用于大型应用系统,具有较好的可伸缩性,往往和websphere服务器一起使用。
SYBASE
中等规模数据库,收费。PowerDesigner数据库建模工具
1.4 关系型数据库管理系统(RDBMS)
关系型数据库管理系统称为RDBMS,R指Relation
数据库由一批数据构成的有序集合,这些数据被分门别类地存放在一些结构化的数据表(table)里,而数据表之间又往往存在交叉引用的关系,这种关系使数据库又被称为关系型数据库
1.4.1 数据库和表的关系
1.4.2 表与实体的关系
行(记录)对应着某个实体
列(字段)对应着某种属性
1.4.3 表与表之间的关系
关系型数据库表与普通excel表的不同:
普通excel表的存储:
关系型数据库表的存储:
优势:
1、有效减少冗余。
2、方便更新维护。
*************************************************************************************************
2. MySQL快速入门
2.1 MySQL安装和卸载
2.1.1 卸载MySQL
1、知道mysql的安装目录:
在mysql的安装目录。找到my.ini 文件。
找到datadir 并且记录路径。(mysql的数据文件的目录)
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
3、打开控制面板—卸载程序
4、卸载mysql
5、删除mysql的安装目录,删除mysql的数据文件目录datadir.第一步中记录的文件目录
mysql默认的数据文件目录,在ProgramDate这个目录,并且这个目录是隐藏目录。需要设置显示隐藏目录。
也可以:
使用QQ电脑管家(或者360)等管理软件进行卸载。
但是记得删除相关目录,卸载干净,不然一定会影响再次安装。
*************************************************************************************************
2.1.2 安装MySQL
修改编码(重要)
或者直接选择日本语,效果一样。(不建议)
注意:
运行windows开始-》所有程序中:
可以再次重新进行配置
*************************************************************************************************
2.2 MySQL结构
一个数据库管理系统软件可以有多个数据库,一个数据库中可以有多个表,一个表中可以有多条数据记录。
MySQL软件装好后会有三个默认数据库:
information_schema 存贮了其他所有数据库的信息。很重要,不能删。
mysql数据库是mysql的核心参数数据数据库,很重要,不能删。
test只是一个测试数据库,没实际用途。不重要,但最好也别删。
*************************************************************************************************
2.3 MySQL基本操作
2.3.1 进入MySQL
1、简单进入命令:
进入cmd控制台,输入mysql -u用户名 -p密码
出现mysql标识表示进入成功
输入exit退出mysql
或者按Ctrl+C 强行关闭
2、隐藏密码进入:
输入mysql -u用户名 -p密码
3、远程网络访问进入:
输入mysql -h域名或者ip地址 -u用户名 -p密码
127.0.0.1 与 localhost 代表本机ip地址和本机域名
注意:进入的mysql命令需要在dos默认环境下执行,不能在mysql>表示里面继续输入进入mysql命令
这样就错了,可以按 ; 和回车提前结束运行。
*************************************************************************************************
2.3.2 常用命令
1、查看字符编码:
show variables like '%char%';
2、查看所有数据库:
show databases;
3、使用(选择、进入)数据库:
use mysql;
4、查看某数据库内的所有表
show tables;
*************************************************************************************************
2.3.3 使用MyEclispe的DBBrowser工具连接MySQL数据库
1、选择MyEclispe中的window -》 show view - 》 other
2、展开MyEclipse Database,选择DB Browser
3、在DB Browser面板的空白处点击鼠标右键,选择New
4、填写驱动相关信息,导入驱动jar包。
jdbc:mysql://localhost:3306/test
5、点击Test Driver出现如下结果则表示连接成功。
6、点击Finish。
7、双击test进行连接后可以展开并看到很多东西。
8、新建java web项目。并在项目根目录下新建一个resource目录(个人习惯)
9、在resource目录里面新建一个 .sql 文件。
10、如果DB Browser中的连接已经打开,则可以在打开后的 .sql文件上部选择相应的连接。
11、小三角变绿后,在该 .sql 文本中我们就可以输入mysql命令以及sql命令。
选择哪条运行哪条,或者一起运行,都很随意。#表示注释。
另外:--单行注释,/* */ 多行注释。(注:在DB Browser中可能会有bug,建议使用#)
*************************************************************************************************
3. SQL语言简介
SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
特点:
非过程性语言。一条语句一个结果。多条语句之间没有影响。
sql:不能编写复杂的程序。
为加强SQL的语言能力,各厂商增强了过程性语言的特征
如Oracle的PL/SQL 过程性处理能力
SQL Server、Sybase的T-SQL
SQL是用来存取关系数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能
3.1 DDL (数据定义语言)
数据定义语言 - Data Definition Language
用来定义数据库的对象,如数据表、视图、索引等,数据库。
create drop alter
3.2 DML (数据操纵语言)
数据处理语言 - Data Manipulation Language
在数据库表中记录修改,更新,删除
如 update, insert, delete
3.3 DCL (数据控制语言)
数据控制语言 – Data Control Language
指用于设置用户权限和控制事务语句
如grant,revoke,if…else,while,begin transaction
3.4 DQL (数据查询语言)
数据查询语言– Data Query Language
数据表记录的查询。
如select
作为java程序员,我们需要重点掌握的
1、数据库--- crud
2、数据表--- crud
3、表中记录--- crud
*************************************************************************************************
4. 数据库操作
4.1 创建数据库
4.1.1 简单创建数据库
语法: create database 数据库名;
#创建数据库
create database mao;
4.1.2 创建指定字符编码的数据库
语法: create database 数据库名 character set '字符集'
#创建指定字符编码的数据库
create database mao2 character set = 'gbk';
如果指定字符集是 utf8 utf-8 是错误滴(mysql不认识UTF-8)。
*************************************************************************************************
4.2 查看数据库
4.2.1 查询所有数据库
语法: show databases; 查询所有数据库
#查询所有数据库
show databases;
4.2.2 查看数据库的创建语句
语法: show create database 数据库名:查看某一个数据库的创建语句。(也可以查看到字符集)
#查看某一个数据库的创建语句。(也可以查看到字符集)
show create database mao;
show create database mao2;
*************************************************************************************************
4.3 删除数据库
4.3.1 简单删除
语法:drop database 数据库名;
#删除数据库
drop database mao2;
注意:如果数据库不存在,运行的话会报错。
4.3.2 带判断删除
语法:drop database if exists 数据库名;
#如果存在这个数据库就删除,不存在就不删除,可以防止报错
drop database if exists mao;
*************************************************************************************************
4.4 修改数据库(了解)
修改数据库,主要就是修改数据库的字符集。
语法:alter database 数据库名 character set '字符集';
#修改数据库
alter database mao2 character set = 'utf8';
*************************************************************************************************
5. 表操作
注意:操作表的时候,一定要切换到某一个具体的数据库
切换数据库的方式:use 数据库名
个人习惯(方便一起运行):
#如果存在mao数据库,则删除它
drop database if exists mao;
#创建数据库
create database mao;
#使用数据库
use mao;
5.1 创建表
语法:
create table 表名(
列名1 数据类型, ---- 某一列,存放的数据是什么类型
列名2 数据类型,
。。。。。。。
列名3 数据类型 --- 最后一个列不需要逗号。
);
注意:多个列之间使用逗号隔开,最后一个列不需要输入逗号。
#创建表
create table student
(
id int,#学号,整型
stuName varchar(50),#学生姓名,可变长字符串,最大长度50
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2) #分数,总长度5位,小数2位
);
varchar和char的区别:
char始终是固定长度,不够填充空字符。浪费空间,访问快。
varchar是可变长度,有多少位字符就占多少位空间,节约空间,访问比char慢。
建议固定长度的信息用char,比如性别,ip地址,电话号码等。
*************************************************************************************************
5.2 查看表结构
desc 表名:查看表的列的信息(查看表结构)
#查看表结构
desc student;
show create table 表名:查看建表语句以及字符集
#查看表创建语句
show create table student;
*************************************************************************************************
5.3 删除表
drop table 表名: 删除指定的表
#删除表
drop table student;
*************************************************************************************************
5.4 修改表
5.4.1 修改表名
rename table 旧表名 to 新表名
#修改表名
rename table student to people;
5.4.2 修改表编码字符集
alter table 表名 character set 字符集
#修改表的字符编码
alter table people character set 'gbk';
5.4.3 添加列
alter table 表名 add 列名类型(长度)约束
#添加列,添加自我介绍(intro)
alter table people add intro varchar(500);
5.4.4 删除列
alter table 表名 drop 列名
#删除列
alter table people drop score;
5.4.5 修改列
alter table 表名 change 旧列名新列名类型(长度) 约束
#修改列,修改stuSex列名为stuGender,范围为2个char
alter table people change stuSex stuGender char(2)
5.4.6 修改列类型
alter table 表名 modify 列名类型(长度) 约束
#修改列类型
alter table people modify stuGender char(1)
*************************************************************************************************
6. 数据记录操作
6.1 向表中插入数据
insert into 表名(列名1,列名,列名......) values(值1,值,值,值......);
#插入数据
insert into student(id,stuName,stuSex,score)values(1,'大毛','m',98.5);
insert into student(id,stuName,stuSex,score)values(2,'二毛','f',93.5);
注意事项
1、值与列一一对应。并且有多少个列,需要写多个值。如果某一个列没有值。可以使用null。表示插入空。
2、值的数据类型,与列被定义的数据类型要相匹配。并且值得长度。不能够超多定义的列的长度。
3、字符串:插入字符类型的数据,必须写单引号。在mysql中,使用单引号表示字符串。
4、date 时间类型的数据也可以直接使用单引号表示: 'yyyyMMdd' ,'yyyy-MM-dd','yyyy/MM/dd' 。
*************************************************************************************************
6.2 查看数据
6.2.1 查询表中所有数据
select * from 表名
#查询表中所有数据
select * from student;
6.2.2 查询符合条件数据
select * from 表名 where 条件表达式
#查询表中符合条件数据(性别是女的)
select * from student where stuSex = 'f';
#查询表中符合条件数据(分数95以上)
select * from student where score > 95;
= 表示等于
> < >= <=
<> 表示不等
*************************************************************************************************
6.3 修改数据
update 表名 set 列名=值,列名=值...... where 条件表达式
#修改数据(修改二毛性别)
update student set stuSex = 'm' where id = 2;
#修改数据(修改三毛性别,并且修改名字)
update student set stuSex = 'm',stuName = '牛郎' where stuName = '三毛';
条件:满足条件的行对应的列采取修改内容。
多个列使用逗号隔开。
注意:如果没有where,会把表中的所有行的对应的列全部修改。
如果有条件。满足条件的数据才会被修改。
*************************************************************************************************
6.4 删除数据
6.4.1 标准删除
delete from 表名 where 条件表达式
#删除数据(删除女生)
delete from student where stuSex = 'f';
6.4.2 快速删除表中所有数据
truncate table 表名
#快速删除表中所有数据
truncate table student;
执行方式:
先删除表,在创建表。truncate table的性能更好
*************************************************************************************************
7. 数据类型和约束
7.1 数据类型
7.1.1 数值类型
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 字节 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
INT或INTEGER |
4 字节 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
BIGINT |
8 字节 |
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
FLOAT |
4 字节 |
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 |
DOUBLE |
8 字节 |
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
双精度 |
DECIMAL |
依赖于M和D的值 |
依赖于M和D的值 |
小数值 |
decimal(a,b) (了解)
a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。
无符号型示例:
#创建表
create table student
(
id int unsigned,#学号,整型无符号(禁止负数)
stuName varchar(50),#学生姓名,可变长字符串,最大长度50
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2) #分数,总长度5位,小数2位
);
注意:unsigned 属性只针对整型,小数型无法使用。
7.1.2 字符串类型
类型 |
大小 |
用途 |
CHAR |
0-255字节 |
定长字符串 |
VARCHAR |
0-65535 字节 |
变长字符串 |
TINYBLOB |
0-255字节 |
不超过 255 个字符的二进制字符串 |
TINYTEXT |
0-255字节 |
短文本字符串 |
BLOB |
0-65 535字节 |
二进制形式的长文本数据(各种文件) |
TEXT |
0-65 535字节 |
长文本数据 |
MEDIUMBLOB |
0-16 777 215字节 |
二进制形式的中等长度文本数据 |
MEDIUMTEXT |
0-16 777 215字节 |
中等长度文本数据 |
LONGBLOB |
0-4 294 967 295字节 |
二进制形式的极大文本数据 |
LONGTEXT |
0-4 294 967 295字节 |
极大文本数据 |
VARCHAR、CHAR
varchar :表示的长度可变的字符串。最大长度不能超过定义字段的时候长度。
char:长度固定。
7.1.3 日期时间类型
类型 |
大小 |
范围 |
格式 |
用途 |
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
'-838:59:59'/'838:59:59' |
HH:MM:SS |
时间值或持续时间 |
YEAR |
1 |
1901/2155 |
YYYY |
年份值 |
DATETIME |
8 |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
TIMESTAMP |
8 |
1970-01-01 00:00:00/2037 年某时 |
YYYYMMDD HHMMSS |
混合日期和时间值,时间戳 |
Timestamp:日期和时间都包含 -------当数据被修改的时候,里面的值会自动进修改,保存当前的时间。
Timestamp:当数据记录发生改变的时候,这个字段会自己修改。
日期时间类型举例:
#创建表
create table student
(
id int unsigned,#学号,整型无符号(禁止负数)
stuName varchar(50),#学生姓名,可变长字符串,最大长度50
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2),#分数,总长度5位,小数2位
birthday date #出生日期,日期型
);
#插入数据
insert into student(id,stuName,stuSex,score,birthday)values(1,'大毛','m',98.99,'1981/11/17');
insert into student(id,stuName,stuSex,score,birthday)values(2,'二毛','f',95.99,'1982/11/17');
insert into student(id,stuName,stuSex,score,birthday)values(3,'三毛','f',96.99,now());
now() 为mysql自带函数,表示当前日期,当前时间。
*************************************************************************************************
7.2 约束
约束:规定,限制。限制表中列的内容。需要满足一定的规则。
数据库中的约束:限制列的内容。
意义:保证数据的有效性和完整性。可以确保数据库满足业务规则。
7.2.1 主键约束
主键是值表中各列中最具有代表性,最重要的某列,该列不允许重复,简单明了,具有代表一样。方便根据该列的值快速找到该条记录。
一个表里只能有一个主键。并且唯一(不能重复),也不能为空。
主键约束:primary key
创建表的时候
create table 表名(
列名数据类型 primary key,
列名数据类型,
列名 ......
)
#创建表
create table student
(
id int primary key,#学号(主键)
stuName varchar(50),#学生姓名,可变长字符串,最大长度50
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2),#分数,总长度5位,小数2位
birthday date #出生日期
);
另一种写法(个人建议采用):
#创建表
create table student
(
id int,#学号
stuName varchar(50),#学生姓名,可变长字符串,最大长度50
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2),#分数,总长度5位,小数2位
birthday date,#出生日期
primary key(id) #设置id为主键
);
*************************************************************************************************
7.2.2 唯一约束
创建表的时候
create table 表名(
列名数据类型 unique,
列名数据类型,
列名 ......
)
#创建表
create table student
(
id int,#学号
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2),#分数,总长度5位,小数2位
birthday date,#出生日期
primary key(id)
);
*************************************************************************************************
7.2.3 非空约束
创建表的时候
create table 表名(
列名数据类型 not null,
列名数据类型,
列名 ......
)
#创建表
create table student
(
id int,#学号
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1),#学生性别,定长字符串,最大长度1
score float(5,2) not null,#分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
primary key(id)
);
*************************************************************************************************
7.3 默认值
可以为某列设置默认值,如果该列不进行数据插入,则该列等于默认值。
创建表的时候
create table 表名(
列名数据类型 default 值,
列名数据类型,
列名 ......
)
#创建表
create table student
(
id int,#学号
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1) default 'm',#学生性别,定长字符串,最大长度1,默认为'm'
score float(5,2) not null,#分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
primary key(id)
);
#插入数据,可以不标明和插入具有默认值的列
insert into student(id,stuName,score,birthday)values(5,'五毛',97.5,'1961-8-8');
*************************************************************************************************
7.4 自动增长
可以对整型的某列使用,每插入一条数据,会自己自动加1,无需用户专门指定。
创建表的时候
create table 表名(
列名数据类型 auto_increment,
列名数据类型,
列名 ......
)
#创建表
create table student
(
id int auto_increment,#学号,自动增长
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1) default 'm',#学生性别,定长字符串,最大长度1,默认为'm'
score float(5,2) not null,#分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
primary key(id)
);
#插入数据(id自动增长) 可以不标明和插入具有自动增长的列
insert into student(stuName,stuSex,score,birthday)values('大毛','m',98.5,'1981-11-17');
insert into student(stuName,stuSex,score,birthday)values('二毛','f',92.5,'1991/10/17');
insert into student(stuName,stuSex,score,birthday)values('三毛','f',95.5,'1971-1-17');
insert into student(stuName,stuSex,score,birthday)values('四毛','m',97.5,'1961-8-8');
注意:
指定了auto_increment的列必需被创建了索引,主键会自动创建索引。
*************************************************************************************************
8. 查询
8.1 列查询
8.1.1 查询指定列:
select 列名,列名,列名 from 表名
#查询表中所有数据(只看姓名和分数两列)
select stuName,score from student;
8.1.2 定义列别名:
select 列名 as 别名,列名 from 表名
#查询表中所有数据(只看姓名和分数两列)
select stuName as姓名,score as分数 from student;
as 可以省略不写
8.1.3 列运算:
运算 + - * /
在select语句中可使用表达式对查询的列进行运算
select 列名+-*/列名,列名+-*/ 列名 from 表名
如果是多个运算使用逗号隔开。
注意:数据库表中的原始数据不改变。
可以为列或者列进行运算后的结果进行起别名。
#创建表
create table student
(
id int auto_increment,#学号,自动增长
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1) default 'm',#学生性别,定长字符串,最大长度1,默认为'm'
chineseScore float(5,2) not null,#语文分数,总长度5位,小数2位,加上非空约束
englishScore float(5,2) not null,#英语分数,总长度5位,小数2位,加上非空约束
mathScore float(5,2) not null,#数学分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
primary key(id)
);
#插入数据(id自动增长)
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday)
values('大毛','m',98.5,70,50,'1981-11-17');
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday)
values('二毛','f',92.5,66,99,'1991/10/17');
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday)
values('三毛','f',95.5,22,33,'1971-1-17');
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday)
values('四毛','m',97.5,44,55,'1961-8-8');
#查询学生总分
select *, chineseScore + englishScore + mathScore from student;
select *, (chineseScore + englishScore + mathScore) as总分 from student;
8.1.4 去除列数据重复
distinct 去重复。去掉列中的重复数据。
#查询学生,去除英语成绩重复
select distinct englishScore from student;
如果出现 distinct 列名a,列名b
要求a重复的同时,b也重复。
#查询学生,去除英语成绩和数学成绩同时重复
select distinct englishScore,mathScore from student;
*************************************************************************************************
8.2 条件查询
select * from 表名 where 条件表达式。
注意:
1、等于只有一个等号
2、这里的不等于是 <>
3、between 值1 and 值2 ,相当于 >= 值1 and <= 值2
前面的值要比后面的小。值1<值2
4、in(值,值,值) 表示等于其中任意一个都可以。
a in(1,2,3,4) 等价于 a=1 or a=2 or a=3 or a=4;
#查询英语在60分以上的男生
select * from student where englishScore >= 60 and stuSex = 'm';
*************************************************************************************************
8.3 模糊查询
like 中 % 表示的任意的字符(没有长度限制), _ 表示的占位符(一个下划线表示一个字符)
name like '张%' --- 表示所有姓张的同学
name like '张_' --- 表示的是姓张的,并且名字是2个字。
#查询出名字含有'毛'的学生
select * from student where stuName like '%毛%';
*************************************************************************************************
8.4 排序查询
8.4.1 单列排序
select * from 表名 order by 列名 desc|asc
asc 表示升序
desc 表示降序
desc|asc都不写,默认是升序。
#按照英语成绩进行排序(升序)
select * from student order by englishScore;
select * from student order by englishScore asc;
#按照英语成绩进行排序(降序)
select * from student order by englishScore desc;
order by 子句一般写where子句的后面
8.4.1 多列排序
select * from 表名 order by 列名1 desc|asc,列名2(desc|asc),列名3(desc|asc)。。。。。
按照列名1,列名2,列名3 进行排序输出。如果列名1并且,则按照列名2的排序标准
#按照英语成绩进行排序(降序),如果英语成绩一样,则按照语文成绩高低来排
select * from student order by englishScore desc,chineseScore desc;
*************************************************************************************************
8.5 提取查询结果
select * from 表名 limit 提取条数
select * from 表名 limit 起点之后 , 提取条数
#语文成绩的前三名,limit表示提取几条
select * from student order by chineseScore desc limit 3;
#语文成绩的第二名到第四名 limit 1,3 1表示从第一条之后开始提取
select * from student order by chineseScore desc limit 1,3;
*************************************************************************************************
8.6 聚合查询
聚集:多个数据进行运算,运算出一个结果。例如,求和,平均值,最大值,最小值。
作用:统计。统计:统计班级的平均分。
一个聚集函数从多个输入行中计算出一个结果。
count(列名),统计行的数目。有多少行,或者有多少条数据。
sum(列名),求和。
avg(列名),平均值
max(列名),最大值
min(列名),最小值
目的:做统计使用的。
语法:select 聚合函数(列名) from 表名
#统计记录总数
select count(*) from student;
select count(id) from student;#节省效率,推荐使用
#统计英语60分以上的人数
select count(id) from student where englishScore >= 60;
#统计全部语文平均分
select avg(chineseScore) from student;
#统计全部总分的最高分和最低分
select
max(chineseScore+englishScore+mathScore) as总分最高分,
min(chineseScore+englishScore+mathScore) as总分最低分
from student;
*************************************************************************************************
8.7 分组聚合查询
分组:按照某一列或者某几列。把相同字段的数据,进行合并输出。
完整写法
select … from … group by 列名
按照某一列进行分组:
目的:仍然是统计使用。
group by . 如果在分组的时候,进行一些聚集函数的使用。会先进行分组。然后再去进行统计。
#统计语文平均分,按性别分组
select stuSex as性别,avg(chineseScore) as语文平均分 from student group by stuSex;
注意:建议聚合函数里面的参数列名,以及分组语句group by 后面的列名,作为最终显示列名。
分组的条件问题:
group by ...... having 条件
having 执行分组之后进行条件过滤
#统计语文平均分,按性别分组,不包括 r 性别
select stuSex as性别,avg(chineseScore) as语文平均分
from student group by stuSex
having stuSex <> 'r';
where 分组之前进行条件过滤
#统计语文平均分,按性别分组,不包括 r 性别,还有四毛
select stuSex as性别,avg(chineseScore) as语文平均分
from student where stuName <> '四毛' group by stuSex
having stuSex <> 'r';
*************************************************************************************************
9. 多表关系
一对多:班级与学生(一个班级对应着多个学生,一个学生对应着一个班级)
多对一:学生与班级
一对一:学生与学号(一个学生只能有一个学号,一个学号只对应一个学生)
多对多:学生和课程(一个学生可以修多门课程,一门课程可以被多个学生修)
注意:
在实际运用中,为了方便管理,一对一通常会设计成一张表。
而多对多在数据库中并不存在,通常会拆分成两个一对多的关系,比如学生和课程,会加一张,学生课程关联表。
9.1 一对多关系
民族与员工是一对多关系
部门与员工是一对多关系
1的一方先去创建表
多的一方后去创建表。
把1的一方叫做主表
把多的一方叫做从表
主表:
#创建表(班级表)
create table class
(
id int auto_increment,#班级编号,自动增长
className varchar(50),#班级名称
classDesc varchar(500),#班级描述
primary key(id)
);
#初始化班级数据
insert into class(className,classDesc)values('138期Java就业','和尚班');
insert into class(className,classDesc)values('139期Java就业','搭配班');
insert into class(className,classDesc)values('140期Java就业','女生班');
从表:
#创建表(学生表)
create table student
(
id int auto_increment,#学号,自动增长
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1) default 'm',#学生性别,定长字符串,最大长度1,默认为'm'
chineseScore float(5,2) not null,#语文分数,总长度5位,小数2位,加上非空约束
englishScore float(5,2) not null,#英语分数,总长度5位,小数2位,加上非空约束
mathScore float(5,2) not null,#数学分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
classId int,#班级id
primary key(id)
);
#初始化学生数据
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('大毛','m',98.5,70,50,'1981-11-17',1);
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('二毛','f',92.5,66,99,'1991/10/17',2);
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('三毛','f',95.5,22,33,'1971-1-17',3);
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('四毛','m',87.5,44,55,'1961-8-8',1);
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('大王','m',91.5,44,55,'1967-8-8',2);
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('小王','r',79.5,44,55,'1968-8-8',1);
*************************************************************************************************
9.2 外键约束
从表中引入主表的主键数据(外键)必需真实存在,否则违反外键约束
birthday date,#出生日期
classId int,#班级id
primary key(id)
classId int,#班级id(外键)必需真实存在
insert into student(stuName,stuSex,chineseScore,englishScore,mathScore,birthday,classId)
values('小王','r',79.5,44,55,'1968-8-8',9);
上述语句在没有建立外键约束的时候是可以顺利运行的,但是建立之后就不行了。
语法:
create table 表名(
列名类型(长度)约束
foreign key(列名) references 表名(列名)
)
#创建表(学生表)
create table student
(
id int auto_increment,#学号,自动增长
stuName varchar(50) unique,#学生姓名,可变长字符串,最大长度50,加上唯一约束
stuSex char(1) default 'm',#学生性别,定长字符串,最大长度1,默认为'm'
chineseScore float(5,2) not null,#语文分数,总长度5位,小数2位,加上非空约束
englishScore float(5,2) not null,#英语分数,总长度5位,小数2位,加上非空约束
mathScore float(5,2) not null,#数学分数,总长度5位,小数2位,加上非空约束
birthday date,#出生日期
classId int,#班级id
#为学生表加上外键引用,cascade表示级联,级联更新,级联删除
foreign key(classId) references class(id) on delete cascade on update cascade,
primary key(id)
);
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
*************************************************************************************************
10. 多表连接查询
10.1 笛卡尔积
a表中的每一条记录,都和b表中的每一条进行匹配连接。
所得到的最终结果是,a表中的条目数乘以b表中的数据的条目数。
select * from a,b
#笛卡尔积查询,没有实际意义
select * from student,class;
*************************************************************************************************
10.2 内连接
10.2.1 隐式内连接
隐式内连接查询:
select * from a,b where a.a_id = b.a_id;
#隐式内连接
select * from student,class where student.classId = class.id;
#表别名简写模式
select * from student as s,class as c where s.classId = c.id;
#表别名简写模式 as可以省略不写
select * from student s,class c where s.classId = c.id;
10.2.2 显示内连接
显式内连接查询:
select * from a inner join b on a.a_id = b.a_id
#显示内连接查询
select * from student inner join class on student.classId = class.id;
注意:内连接查询只会查询到两表中都一定有关联的数据。
*************************************************************************************************
10.3 左外连接
select * from a left join b on a.a_id = b.b_id
把left 关键字之前的表,是定义为左侧。 left关键字之后的表,定义右侧。
当两个表连接的时候,如果左侧表有数据,右测的表没有对应的数据。会把左侧的表中的数据显示出来。
#左外连接
select * from student left join class on student.classId = class.id;
select * from class left join student on student.classId = class.id;
*************************************************************************************************
10.4 右外连接
select * from a right join b on a.a_id = b.b_id
如果右侧有数据,左侧没匹配到,把右侧的数据显示出来。
right之前的是左侧,right之后的是右侧。
#右外连接
select * from student right join class on student.classId = class.id;
select * from class right join student on student.classId = class.id;
*************************************************************************************************
10.5 子查询
将一个查询作为另一个查询的条件
select * from student where 条件表达式(另一条查询语句)
#子查询,语文成绩最差的学生的信息
select * from student where chineseScore = (select min(chineseScore) from student);
#子查询,语文成绩高于平均分学生的信息
select * from student where chineseScore > (select avg(chineseScore) from student);
in 表示:一个内容,是不是在自查的结果中。
exists表示:表示子查询是否有内容。如果有内容,认为是true。如果没有内容,认为是false。
any 表示任何一个 a > any(1,2,3,4) 相当于 a>1 or a>2 or a>3 or a>4
all 表示所有。 a > all(1,2,3,4) 相当于 a>1 and a>2 and a>3 and a>4
#与英语成绩大于60分的学生在同一班级有
select * from student where classId in (select classId from student where englishScore >= 60);
注意:子查询条件中的那个子查询语句,一般最好返回单列信息。
*************************************************************************************************
10.6 联合查询
union 对两个结果集进行并集操作,重复数据只显示一次(去重复)
union all,对两个结果集进行并集操作,重复数据全部显示(不去重复)
要求:两个查询,查询出的字段相同。(也就是查询的结果(虚拟的表的结构)相同)
(SELECT A_ID FROM A) UNION (SELECT A_ID FROM B)
排除重复
#一班的学生,联合所有的男生,去重复
select * from student where classId = 1
union
select * from student where stuSex = 'm';
不排除重复结果
(SELECT A_ID FROM A) UNION ALL (SELECT A_ID FROM B)
#一班的学生,联合所有的男生,允许重复
select * from student where classId = 1
union all
select * from student where stuSex = 'm';
*************************************************************************************************
11. 视图
视图是基于 SQL 语句的结果集的可视化的表。
视图可以大大化解查询的文字复杂度。
11.1 创建视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
#创建学生班级信息表视图
create view stuClass
as
select s.id,s.stuName,s.stuSex,c.className from student s,class c where s.classId = c.id;
11.2 查询视图
视图的使用在查询时和表完全一样。视图不允许增、删、改操作。
#查询出女生,不使用视图的情况
select s.id,s.stuName,s.stuSex,c.className from student s,class c
where s.classId = c.id and s.stuSex = 'f';
#查询出女生,使用视图
select * from stuClass where stuSex = 'f';
*************************************************************************************************
12. 其它功能
12.1 MySQL第三方管理工具
Myeclispe 的 DB Browser 和 Navicat for MySQL,除此之外还有很多
基本上所有的sql语句的操作都可以通过Navicat for MySQL来完成。
但是为什么还要大家背sql语句呢???
*************************************************************************************************
12.2 备份和恢复
12.2.1 备份
把数据库里面的内容进行备份放到硬盘或者其他位置。如果数据库出现问题之后,可以进行数据的恢复。
备份数据库表中的数据
在命令行中 mysqldump -u 用户名 -p 数据库名 > 文件名.sql
把某一个具体的数据库备份到一个文件中。
12.2.2 恢复
把数据库的所有内容,备份到sql文件中
注意:备份的时候,没有备份创建数据库的语句。当需要恢复某个具体的数据库时候,需要手动的创建数据库。
source 文件名.sql
要求登录到某一个具体的数据库中。才可以使用source 命令。
也可以通过第三方工具(Navicat for MySQL),来完成备份还原操作。
*************************************************************************************************
12.3 用户管理(了解)
12.3.1 创建用户
create user 用户名@ip地址 identified by 密码
#创建一个用户
create user maoyun@192.168.0.102 identified by '123456';
12.3.2 删除用户
#删除用户
drop user maoyun@192.168.0.102;
12.3.3 修改用户的密码
#进入mysql核心数据库中
use mysql;
#查询所有mysql账户
select * from user;
#修改密码
update user set password = password('654321') where user = 'maoyun';
#刷新权限
flush privileges;
12.3.4 用户授权
grant权限1,权限2,..... on 数据库名.表名 to 用户名@ip地址
#给某用户授权mao数据库下所有表的查询权限
grant select on mao.* to maoyun@192.168.0.102;
12.3.5 撤销用户的权限
revoke 权限1,权限2,..... on 数据库名.表名 from 用户名@ip地址
#撤销用户权限
revoke select on mao.* from maoyun@192.168.0.102;
当然,我们也可以使用第三方管理工具来完成这些操作。
*************************************************************************************************
12.4 内置函数介绍
select user(); 显示当前登录用户
select md5('字符串'); 对字符串进行MD5加密
select now(); 显示出当前日期和时间
*************************************************************************************************
13. 其它种类数据库系列介绍(了解)
数据库高级性能术语介绍:
当数据访问量极大了以后......:
负载均衡:众多个相同数据的数据库(数据库复制多个相同副本)分别分摊一定数量的用户访问。将用户的访问分流了。
读写分离:有的副本只执行读操作,有的副本只执行写操作,随后进行同步。因为对一个普通网站来说,查询是远大于更新操作的。
当存储数据量极大了以后......:
分片技术:将一个数据库分成多个数据库,将一个表中的数据,分割成N张表,放入位于不同机器的数据库中。
当数据访问量和存储数据量极大极大、海量海量了以后......:
NoSql系列数据库介绍
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSql基本上都是基于分布式文件系统的,也就是说可以将数据存放与多台不同的机器上,从而无限扩展,而且并发,更新查询速度都超快。
常用的NoSql数据库:
MongoDB、HBase(Hadoop Database)、Redis(内存存储)、sequoiadb(巨衫数据库)... 等。
NoSql数据库是大数据技术的基础。
*************************************************************************************************
14. 总结