Javaweb 第5天 mysql 数据库课程
MySQL数据库课程
两日大纲
● 数据库的概念、MySQL快速入门、SQL语言简介
● 数据库操作、表操作、数据记录操作、数据类型和约束
● 查询
● 多表关系、多表连接查询
● 视图
● 数据备份和还原、用户管理
*************************************************************************************************
1. 数据库的概念
1.1 数据(Data)
对客观事物的符号表示,如图形符号、数字、字母等,数据是数据库中存储的基本对象。
在日常生活中,人们直接用语言来描述事物;在计算机中,为了存储和处理这些事物,就要将事物的特征抽象出来组成一个记录来描述。
学生档案中的学生记录
,上海,计算机系,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表的存储:
关系型数据库表的存储:
优势:
、有效减少冗余。
、方便更新维护。
*************************************************************************************************
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,#学号,整型
位,小数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 旧列名新列名类型(长度) 约束
个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 向表中插入数据
,列名,列名......) 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';
以上)
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 字节 |
,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 |
DOUBLE |
8 字节 |
,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
,(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,#学号,整型无符号(禁止负数)
位,小数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 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
|
TIME |
'-838:59:59'/'838:59:59' |
HH:MM:SS |
时间值或持续时间 |
|
YEAR |
1901/2155 |
YYYY |
年份值 |
|
DATETIME |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
|
TIMESTAMP |
1970-01-01 00:00:00/2037 年某时 |
YYYYMMDD HHMMSS |
混合日期和时间值,时间戳 |
Timestamp:日期和时间都包含 -------当数据被修改的时候,里面的值会自动进修改,保存当前的时间。
Timestamp:当数据记录发生改变的时候,这个字段会自己修改。
日期时间类型举例:
#创建表
create
table student
(
id int unsigned,#学号,整型无符号(禁止负数)
位,小数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 v
位,小数2位
birthday date #出生日期
);
另一种写法(个人建议采用):
#创建表
create
table student
(
id int,#学号
stuName v
位,小数2位
birthday date,#出生日期
primary key(id) #设置id为主键
);
*************************************************************************************************
7.2.2 唯一约束
创建表的时候
create table 表名(
列名数据类型
unique,
列名数据类型,
列名 ......
)
#创建表
create
table student
(
id int,#学号
,加上唯一约束
位,小数2位
birthday date,#出生日期
primary
key(id)
);
*************************************************************************************************
7.2.3 非空约束
创建表的时候
create table 表名(
列名数据类型
not null,
列名数据类型,
列名 ......
)
#创建表
create
table student
(
id int,#学号
,加上唯一约束
位,小数2位,加上非空约束
birthday date,#出生日期
primary
key(id)
);
*************************************************************************************************
7.3 默认值
可以为某列设置默认值,如果该列不进行数据插入,则该列等于默认值。
创建表的时候
create table 表名(
列名数据类型
default 值,
列名数据类型,
列名 ......
)
#创建表
create
table student
(
id int,#学号
,加上唯一约束
,默认为'm'
score float(5,2) not
位,小数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,#学号,自动增长
,加上唯一约束
stuSex char(1) default
,默认为'm'
score float(5,2) not
位,小数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,#学号,自动增长
,加上唯一约束
stuSex char(1) default
,默认为'm'
chineseScore float(5,2) not
位,小数2位,加上非空约束
englishScore float(5,2) not
位,小数2位,加上非空约束
mathScore float(5,2) not
位,小数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;
分以上的男生
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;
#语文成绩的第二名到第四名
,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;#节省效率,推荐使用
分以上的人数
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,#学号,自动增长
,加上唯一约束
stuSex char(1) default
,默认为'm'
chineseScore float(5,2) not
位,小数2位,加上非空约束
englishScore float(5,2) not
位,小数2位,加上非空约束
mathScore float(5,2) not
位,小数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,#学号,自动增长
,加上唯一约束
stuSex char(1) default
,默认为'm'
chineseScore float(5,2) not
位,小数2位,加上非空约束
englishScore float(5,2) not
位,小数2位,加上非空约束
mathScore float(5,2) not
位,小数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
分的学生在同一班级有
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. 总结
Javaweb 第5天 mysql 数据库课程的更多相关文章
- JavaWeb用Jdbc操作MySql数据库(一)
一.添加开发包.在JavaWeb中用jdbc操作数据库,使用方法与java一样,但是在处理开发包的问题上有点差别.JavaWeb不能将mysql-connector-java-5.1.7-bin.ja ...
- 【JavaWeb】JDBC连接MySQL数据库
正文之前 在之前写的JavaWeb项目中使用了JDBC,在此来回顾一下,并做个demo看看,先来看看JDBC的概念 Java数据库连接,(Java Database Connectivity,简称JD ...
- JavaWeb用Jdbc操作MySql数据库(二)
一.仍然使用前面的环境和示例数据库. 二.建立发出注册请求的页面index3.jsp. <%@ page language="java" import="java. ...
- javaweb 乱码---汉字存入mysql数据库中变成乱码
今天郁闷了一天,java程序在向mysql插入数据前不是乱码,数据库安装时也选了编码为utf8(和我程序的编码格式一致).可是插入数据就变成乱码,相当郁闷. 原因:mysql的配置文件中的编码并没有改 ...
- javaweb(三十七)——获得MySQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
- C语言连接MySQL数据库(课程设计总结)
刚结束课程设计,也预示着假期立即就要到来了.本次课程设计并不算难,无非就是让做一个XXX系统,实现用户的注冊.登录.菜单管理.超级用户等等一些功能,到如今为止已经做过好几个了,所以基本流程都熟悉了! ...
- MySQL数据库运维课程
MySQL数据库运维课程 http://www.dataguru.cn/article-4834-1.html?union_site=comm100 课程大纲 第一课:机器选型.系统规划 第二课:安装 ...
- mysql数据库优化课程---18、mysql服务器优化
mysql数据库优化课程---18.mysql服务器优化 一.总结 一句话总结: 1.四种字符集问题:字符集都设置为utf-82.slow log慢查询日志问题3.root密码丢失 1.mysql存在 ...
- mysql数据库优化课程---17、mysql索引优化
mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...
随机推荐
- [Angular Directive] Assign a Structual Directive a Dynamic Context in Angular 2
Just like passing in an array to *ngFor, you can pass in any value into your structural directive s ...
- ASP文件上传代码
在网上看到的代码,稍微有点问题,改了一下就可以了.Chrome下是可以用的,别的浏览器还没有确认. <% Response.Buffer = True Server.ScriptTimeOut= ...
- soa服务治理-dubbo
dubbo官网:http://dubbo.io/Home-zh.htm 学习点: 1. 日志的配置
- DuiLib 中滚动条不显示的问题
DuiLib 很好用,同时在没有完全理解源码的前提下,坑也不少,比如今天遇到的添加滚动条不显示... 情况是这样的,将一个页面作为Tab控件的其中一页,为了代码不窝在一起,就没有在CreateCont ...
- 面试题-Java基础-面向对象
1.面向对象软件开发的优点有哪些? 代码开发模块化,更易维护和修改.代码复用.增强代码的可靠性和灵活性.增加代码的可理解性.面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会 ...
- vedio_note2
例化 for example ex_cnt ex_cnt_inst( //模块名 例化的名字 .clk(ckl_o), // . 后面是原模块的名字 括号里面是top里的名字 .rst_n(rst_n ...
- usaco月赛,2017.1总结
T1:跳舞的奶牛 大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束.现 ...
- hibernate事务控制
在使用ssh中将事务委托给spring时老是出现事务不可用 经过检查,原因如下: 是因为在hibernate.cfg.xml文件中忘记进行了如下设置: hibernate.current_sessio ...
- Java 彩色图转灰度图
1. 方法1 BufferedImage grayImage = new BufferedImage(width, height, colorImage.TYPE_BYTE_GRAY); Graphi ...
- Java代理模式汇总
简介 代理模式即Proxy Pattern,23种java常用设计模式之一.其定义为:对其他对象提供一种代理以控制对这个对象的访问. UML类图 静态代理 目标接口 public interface ...