您的位置:首页 > 编程语言 > Java开发

深入分析JavaWeb Item26 -- MySQL 学习笔记

2015-12-18 16:46 791 查看

SQL基本部分:

1、数据库操作相关SQL —- database

创建数据库 create database 数据库名称; —— 在sql后通过 character set 指定数据库本身字符集,如果没有指定将服务器默认

* 服务器默认字符集 mysql安装目录/my.ini [mysqld] default-character-set

查看当前有哪些数据库 show databases;

修改数据库(修改数据库字符集) 数据库字符集存放mysql安装目录/data/数据库文件夹/db.opt

alter database 数据库名称 character set 字符集;

* collate 校对方式 —– 用于数据库排序; 每一种字符集都存在一种默认校对方式(可以不用修改)

删除数据库 drop database 数据库名称;

切换数据库(设置当前使用数据库) use 数据库名称;

* select database(); 查看当前使用数据库

2、数据表操作相关SQL —- table表结构

创建数据表 create table 表名(列名 类型(长度) 约束,列名 类型(长度) 约束… ) —– 在创建表之前必须指定数据库

* 查看当前有哪些数据表 show tables;

查看数据表表结构 desc table;

修改表结构:

修改列类型(长度) : alter table 表名 modify …

添加一个新列 : alter table 表名 add …

修改列名称 : alter table 表名 change …

删除列 : alter table 表名 drop 列名

修改表名 : rename table 旧表名 to 新表名

table 在创建时 character set 指定表字符集,如果没有指定采用数据库默认字符集

删除表 drop table 表名;

3、数据记录增删改查 insert update delete select

数据记录插入 insert into 表名(列,…) values(值,…);

* 值的顺序和列顺序一致,个数一致 , 在开发中经常省略列名,值按照表结构所有字段进行设值

数据查看 select * from 表名;

数据记录修改 update 表名 set 列名=值,列名= 值 where 条件语句

数据记录删除 delete from 表名 where 语句

* truncate 与 delete区别 ? truncate删除表,重新创建, delete from 逐行删除—– 性能truncate好于 delete,delete被事务控制,删除后回滚取消删除,truncate不可恢复

select 语句

S - F - W - G - H - O

select … from … where … group by … having … order by … ; 顺序固定的

1、from 指定查询数据表

2、where 前置过滤条件 — 将表数据过滤掉一部分

3、group by 对where 过滤后数据进行分组

4、having 对分组后结果添加条件过滤

5、select 指定检索哪些字段

6、order by 对检索结果排序

4、数据库备份和恢复

备份命令: mysqldump -u 用户名 -p 数据库名 > sql脚本位置 (回车输入密码)

恢复命令: mysql -u 用户名 -p 数据库名 < sql脚本位置 (回车输入密码 )

* 在mysql连接后,通过source 进行数据库恢复 source sql脚本位置

5、数据库完整性约束 —– 保证数据表中记录完整性

主键约束 primary key : 用来指定数据表数据记录的唯一标识

唯一约束 unique : 该字段取值唯一

非空约束 not null ; 该字段值不能为null

外键约束 foreign key : 当两个数据表存在关联时,添加外键约束,外键约束引用另一张表主键

条件约束 check : mysql不支持 Oracle支持 check age<100 ; 向数据表存入age值,必须小于100

* 完整性约束有5类

常见关系化数据库有哪些?

Microsoft SQL Server : 微软公司产品,中等规模数据库 收费产品,运行在windows平台上 — .net平台+SQLServer进行开发

Oracle :甲骨文公司产品,大型商业数据层,收费 运行在任何操作系统上 windows linux — Oracle收购sun(Java) —- Java + Oracle

MySQL :最初是一个开源免费数据库产品 ,中小型数据库 —- 互联网行业主流数据库 Mysql被Oracle收购后,Mysql6.0开始推出收费版本—- 企业主流5.X

SYBASE:收费,中型数据库,银行证券 —– PowerDesigner PD (数据库设计建模软件)

**HSQ**L : 迷你数据库 开源免费,纯java开发 —– 被java开源框架内置使用

SQLITE : 嵌入式开发,Android 内部主要数据库 —- 开源免费

DB2 : IBM产品 大型数据库 —- BEA 被Oracle weblogic+ Oracle —– websphere + DB2

下载Mysql —– Oracle网站、开源社区下载

版本:5.X版本(5.0 、5.5 )

安装MySQL

卸载

1、在控制面板 卸载mysql程序

2、手动删除mysql目录

安装

1、安装mysql —- 修改安装路径

2、安装结束后,一定要对mysql进行配置

修改mysql默认字符集 Latin1(就是ISO-8859-1) —- 设置utf-8

将mysql安装window服务 —- 通过服务启动mysql数据库

将mysql/bin 放入环境变量path —– 勾选

设置mysql超级管理员 root 用户密码

3、安装mysql后,通过运行 services.msc

MySQL服务启动,mysql数据库启动了

* 在每次使用mysql之前必须启动mysql

4、在cmd创建 mysql -? 如果命令识别,证明mysql/bin 放入环境变量path

5、连接mysql数据 :

C:\Documents and Settings\seawind>mysql -u root -p

Enter password:
***


将root密码修改 abc

1、停止mysql服务

2、新建cmd窗口 输入 mysqld-nt –skip-grant-tables —– 窗口阻塞,不要关闭

3、新建窗口登陆mysql 不需要输入密码

use mysql

update user set password = password(‘abc’) where user=’root’ ;

4、关闭mysql服务窗口 —- 打开任务管理器关闭mysqld-nt.exe

5、重启mysql服务

安装mysql后,自带两个数据库 mysql、test

mysql 存放数据核心数据 —– 用户、权限 …

test 练习数据库, 默认该数据库空的

mysql数据库组成

1、在mysql数据库软件内部创建使用多个数据库 database

2、在每一个数据库database中创建使用多个数据表 table

3、table存放数据记录,一条数据记录,对应java程序中一个对象

4、在数据库中存在很多用户,用户根据相应权限操作数据库或者数据表

SQL 结构化查询语言

1、非过程性语言 —– 每一条SQL语句都是独立执行的,没有先后依赖关系

int a = 10;
int b = 20;
int c = a+b;
print(c) ;


上面程序典型过程性语言

2、官方提供数据库标准语言 —- 任何数据库都必须支持SQL语法

* 每个数据都应该提供sql扩展,增强sql过程化编程

SQL分类:数据定义语言 DDL 、数据操纵语言 DML 、数据控制语言 DCL

有人将select查询语句自成一类 数据查询语言 DQL

DDL:数据定义语言,定义、修改、删除 数据库内部结构 —- 例如 : 对数据库、数据表 以上操作

DML:数据操纵语言 ,对数据表记录 增加、删除、修改

DCL:数据控制语言 用户授权、if 、while、事务管理

DQL:数据查询语言 select查询语句

SQL语句使用:数据库操作SQL 、数据表操作SQL 、数据记录操作SQL

第一部分:数据库 SQL

1、数据库创建 create database 数据库名称;

创建一个名称为mydb1的数据库 —– create database mydb1;

* 通过show databases; 查看所有数据库

在创建数据库时,为数据库指定字符集及字符集比较方式 —- 语法: create database 数据库名称 character set 编码集 collate 比较方式;

* 如果不指定字符集和比较方式,使用默认 — 修改utf-8

mysql安装目录

bin —- mysql执行程序

docs —- 文档

share — 各国编码信息

data —- 存放mysql 数据文件

* 每个数据库 创建一个同名文件夹,.frm 存放table表结构、ibdata1存放mysql中所有数据表数据记录

* 在数据库每个文件夹中存在db.opt —- 保存数据默认编码集

* win7 数据库文件夹默认 C:\ProgramData\MySQL\MySQL Server 5.5\data

创建一个使用utf8字符集的mydb2数据库 —– create database mydb2 character set utf8;()

创建一个使用utf8字符集,并带校对规则的mydb3数据库 —– create database mydb3 character set utf8 collate utf8_unicode_ci;

* 什么是校对规则? 用于排序 对张三和李四排序,按照拼音排序、按照笔画排序,按照名字数量

* 一个字符集对应很多校对规则

2、查看和删除数据库

查看当前数据编码集 show create database 数据库名;

查看前面创建的mydb2数据库的定义信息 —– show create database mydb2;

删除数据库:drop database 数据库名称;

删除前面创建的mydb1数据库 —– drop database mydb1;

3、修改数据库编码

语法: alter database 数据库名称 character set 编码集;

将mydb2 数据库编码集设置gbk ————- alter database mydb2 character set gbk;

4、切换数据库

如果想对数据库中数据表和数据记录进行操作,必须先切换到指定数据库 —- use 数据库名称;

查看当前正在使用数据库 select database();

第二部分:数据表table —- 表结构SQL

1、创建数据表

create table 表名(列名 类型(长度),列名 类型(长度) …) character set 编码集;

* 如果不设置编码集,数据表将采用数据库默认字符集

create table users(
id int,
name varchar(40),
password varchar(40),
birthday date
);


所有数据类型中,除了char 、varchar 必须指定长度,其它类型默认长度

数据库类型

1) 整数类型
tinyint (byte)  smallint(short) int(int) bigint(long) float double


2) 字符串类型 varchar char 长度取值0-255 —- String

varchar变长 varchar(20) 向数据库存入hello ,因为变长,列长度会根据保存内容自动调整

char定长 char(8) —- 向数据库存入hello 因为定长 保存hello + 3个空格

* varchar经常使用,char性能更好

3) 逻辑性 bit 一位 — boolean *bit(8)表示8位 等于tinyint ,bit(32) 等于int

4) 日期型
date time datetime timestamp


date 只能保存日期

time 只能保存时间

datetime 日期和时间都有

timestamp 日期和时间都有,自动更新 —- 操作数据表,timestamp字段自动更新当前时间

5) 大数据类型 text、blob

text 文本类型数据,主要存储字符文件 — 文本文件

blob 二进制文件 ,存储任何类型文件(音乐、电影)

* blob和text最大类型 longtext longblob 最大可以保存4GB文件

GB = 1024MB MB=1024KB KB=1024Byte

创建一个员工表employee

id 整形

name 字符型

gender 字符型

birthday 日期型

entry_date 日期型

job 字符型

salary 小数型

resume 大文本型

create table employee (
id int,
name varchar(40),
gender varchar(10),
birthday date,
entry_date date,
job varchar(20),
salary double,
resume longtext
);


2、通过desc语句 查看表结构

语法:desc 表名;

单表约束:主键约束(唯一标识一条记录) 唯一约束(该字段内容不允许重复) 非空约束(值不能为空)

主键约束—– primary key 不能为空、不能重复

* 主键数字类型,一般设置主键自动增长 mysql设置自动增长 auto_increment

唯一约束 —– unique 一张表只有最重要那个字段才能作为主键

非空 —– not null

create table employee (
id int primary key not null auto_increment ,
name varchar(40) unique not null,
gender varchar(10) not null,
birthday date not null,
entry_date date not null,
job varchar(20) not null,
salary double not null,
resume longtext not null
);


3、数据表结构修改

向已有数据表添加一列 :
alter table 表名
add
列名 类型(长度) 约束;


改变已有数据表一列类型、长度:
alter table 表名
modify
列名 类型(长度) 约束;


改变已有数据表一列的名称 :
alter table 表名
change
旧列名 新列名 类型(长度) 约束;


删除已有一列 :
alter table 表名
drop
列名
;

修改表名: rename
table 旧表名 to 新表名;


修改表的字符集:alter table student character set utf8;

练习

在上面员工表的基本上增加一个image列 —– alter table employee add image varchar(255);

修改job列,使其长度为60 —— alter table employee modify job varchar(60) not null;

删除gender列。—— alter table employee drop gender;

表名改为user。 —– rename table employee to user;

修改表的字符集为utf8 —- alter table user character set utf8;

* show create table user;

列名name修改为username —- alter table user change name username varchar(40) unique not null;

4、数据表删除

语法: drop table 表名;

* show tables; 查看当前数据 中所有表

第三部分:对数据表中数据记录 进行 增删改查

1、表记录的插入

语法:
insert into 表名(列名,列名,  .... ) values(值, 值, ....)
【官方写法】

* 值个数应该列个数相同,值顺序和列顺序相同,值类型和列字段类型匹配

步骤

1) 插入数据

insert into employee(id,name,gender,birthday, entry_date,job,salary,resume) values(null,'zs','male','1990-01-10','2012-10-10','hr',3000,'He is a good man!');


插入数据时,字符串添加 单引号 ” —- 字符和日期型数据应包含在单引号中

insert into employee(id,name,gender,birthday, entry_date,job,salary,resume) values(null,'lisi','male','1980-01-10','2000-10-10','manager',8000,'He is a very good man!');


insert into employee values(null,'wangwu','female','1977-10-08','1999-11-12','BOSS',100000,'He is BOSS');


在插入数据时,如果有些列存在默认值或者可以为null ,插入省略部分列 。

create table person(
id int primary key not null auto_increment,
name varchar(40) not null,
introduce varchar(255)
);


insert into person(name) values('zs');
— 这里只要写不能为空列 就可以了【经常用】

再插入语句时,省略所有列名

insert into person values(null,'lisi',null)
; —- 省略所有列名,必须为所有列提供value值,按照数据表中列顺序【推荐写法】

插入数据后,通过select * from 表名; ——- 查询插入的数据

插入数据时,中文乱码问题

insert into employee values(null,'小丽','female','1995-10-08','2015-11-12','Sales',2000,'是一个有潜质的女孩子!');


查看数据库相关编码集
show variables like 'character%';


使用mysql客户端 — 黑色窗口界面使用gbk输入方式

mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。

服务器端相关:database server system(永远无法修改 就是utf-8)

客户端相关 connection client results

解决插入乱码问题:将客户端相关三个编码集设置 gbk

set names gbk;
—– 快速设置客户端相关三个编码集 (临时设置当前窗口编码集)

修改mysql 配置文件,永久改变客户端编码集 —–
mysql/my.ini


[mysql] —- 客户端配置 ===》将客户端的编码方式改为gbk;

[mysqld] —- 服务器端配置

2、数据表记录修改操作 update 语句

语法:
update 表名 set 列名=值,列名=值 where条件语句


没有where语句,对所有数据行进行更新

update employee set salary = 5000 ; ---- 修改所有员工工资5000


练习

将所有员工薪水修改为5000元。 ——
update employee set salary = 5000 ;


将姓名为’zs’的员工薪水修改为3000元。
update employee set salary = 3000 where name = 'zs';


*
update employee set salary = 3000 where binary name = 'ZS';
—- 条件比较前添加 binary 使比较更加精确严格

将姓名为’lisi’的员工薪水修改为4000元,job改为ccc。 ———
update employee set salary = 4000, job='ccc' where binary name = 'lisi';


将wangwu的薪水在原有基础上增加1000元。——-
update employee set salary = salary+1000 where name = 'wangwu';


3、数据表记录通过delete语句进行删除

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


删除一个表所有记录 truncate 表名; 效果与 delete from 表名;

truncate与delete 使用上区别 ?

truncate 删除记录后不可恢复的,不受事务管理,原理:先删除整个表,重新创建

delete 可以被事务管理 ,在事务中删除数据可以回滚恢复,原理: 一行一行删除数据记录

truncate 删除所有记录性能上 好于 delete

练习:

删除表中名称为’zs’的记录 。 —-
delete from employee where name='zs';


删除表中所有记录。 —-
delete from employee;


* 演示 事务的回滚 ,通过delete在事务中删除可以恢复的

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from employee;
Query OK, 3 rows affected (0.00 sec)

mysql> select * from employee;
Empty set (0.00 sec)

mysql> rollback;


使用truncate删除表中记录。—–truncate employee; 数据永远删除,不会恢复

4、数据记录的查询

语法:
select * | 指定列名,列名 from 表名;


1) 基本查询

select * from employee; ---- 查看当前数据表所有记录
select gender from employee; ----- 查看employee的 gender列数据
select distinct gender from employee;  ---- 查看employee表所有性别 ,排重


创建scores

create table scores(id int primary key not null auto_increment,name varchar(40),math double,chinese double,english double);

insert into scores values(null,'老黎',85,90,76);
insert into scores values(null,'老刘',70,65,80);
insert into scores values(null,'老冯',60,70,65);


练习:

查询表中所有学生的信息。——
select * from scores;


查询表中所有学生的姓名和对应的英语成绩。——-
select name,english from scores;


过滤表中重复数据。—–
select distinct * from scores;


2) 查询时进行运算

select 列名运算表达式 from 表名;
select 列名 【as】 列别名 from 表名;


练习

在所有学生英语分数上加10分特长分。
select name,english+10 from scores;


统计每个学生的总分。
select name,math+chinese+english from scores;


使用别名表示学生分数。
select name,math+chinese+english as 总分 from scores;


* 起别名时 as 可以省略 select name 姓名 from scores;

* select name math from scores; select name,math from scores;注意区别这两个

3) 查询数据时通过比较运算添加where条件 过滤查询内容

使用where子句,进行过滤查询。练习:

查询姓名为老黎的学生总成绩 —-
select math+chinese+english from scores where name='老黎';


查询英语成绩大于80分的同学 —-
select * from scores where english > 80;


查询总分大于200分的所有同学 —-
select * from scores where math+chinese+english > 200;


4) select 其它比较运算

查询语文成绩不为90 分学生
select * from scores where chinese <> 90;


between …and… 查询语文在70-80之间同学

select * from scores where chinese<=80 and chinese>=70;
select * from scores where chinese between 70 and 80 ; ---- 先写小的后写大的


in(set) 在几个固定值中取值
select * from scores where chinese in (70,80,90);
—- 查询语文成绩为70分或者80分或者90分同学

like 模糊查询
select * from scores where name like '老%';


查询学生中姓 老所有人 —– % 代表任意select * from scores where name like ‘老‘;生中 姓 老 名字为两个字 学生 —— 代表任意单个字符

is null 判断一列是否为空

insert into scores values(null,'小丽',null,80,90);


查询无数学成绩所有人
select * from scores where math is null;


查询有数学成绩人
select * from scores where math is not null;


* select * from scores where 1; --- 在编程语言中 1 ---- true
select * from scores where 0 ; ---- 0  --- false


null 代表1/2 —- 任何表达式和null 进行逻辑运算 结果都是false

逻辑运算中 and 、or —- and 和 or谁优先级高 ?

select * from scores where 2>1 or 2>3 and 3>4 ; ---- and先执行   SQL攻击


练习:

查询英语分数在 80-90之间的同学。
select * from scores where english between 80 and 90;


查询数学分数为89,90,91的同学。
select * from scores where math in (89,90,91);


查询所有姓李的学生成绩。
select * from scores where name like '李%';


查询数学分>80,语文分>80的同学。
select * from scores where math>80 and chinese >80;


5) 对select查询结果通过 order by 语句进行排序

语法 :
select * from 表名 where条件语句 order by 列名 asc|desc , 列名 asc|desc ... ;


练习:

对数学成绩排序后输出。
select * from scores order by math; 默认是升序


对总分排序按从高到低的顺序输出
select name,chinese+math+english from scores order by chinese+math+english desc;


对姓老的学生数学成绩排序输出
select * from scores where name like '老%' order by math desc;


6) 聚集函数(分组函数) —- 结合查询分组进行数据统计

count返回查询结果记录条数 ===>统计个数的函数

练习:

统计一个班级共有多少学生?
select count(*) from scores;


统计数学成绩小于80的学生有多少个?
select count(*) from scores where math<80;


统计总分大于250的人数有多少?
select count(*) from scores where math+chinese+english>250;


sum 对一列的数据求和

统计一个班级数学总成绩?
select sum(math) from scores;


统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(chinese),sum(english) from scores;


统计一个班级语文、英语、数学的成绩总和
select sum(math+ chinese + english) from scores;


统计一个班级语文成绩平均分
select sum(chinese)/count(chinese) from scores;


* sum求和时 null不运算

avg对一列数据求平均值

求一个班级数学平均分? select avg(math) from scores; * null数据不参与运算

求一个班级总分平均分 select avg(math+chinese+english) from scores;

maxmin 对一列数据 计算最大值和最小值

求班级总分最高分和总分最低分(数值范围在统计中特别有用)
select max(math+chinese+english),min(math+chinese+english) from scores;


思考题:语文最高分是谁?

select max(chinese) from scores;
select name from scores where chinese = (select max(chinese) from scores);


分组目的:统计 分组前提:重复数据

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);


练习:对订单表中商品归类后,显示每一类商品的总价

select product,sum(price) from orders group by product;
select product,sum(price) from orders;  不加分组则如何?


在分组查询中通过 having关键字,添加分组查询条件

练习:查询购买了几类商品,并且每类总价大于100的商品

select product,sum(price) from orders where sum(price)>100 group by product;  ** where中不能使用分组函数
select product,sum(price) from orders group by product having sum(price)> 100;


where 和 having 添加条件使用上区别 ?

where 是在分组之前执行,having是在分组之后执行,where 不能使用分组函数,having使用分组函数

* having几乎可以替换where

数据库数据需要定期备份 —— 数据库和备份和恢复

备份:
cmd> mysqldump -u 用户名 -p 数据库名 > 文件名.sql


* 退出mysql,quit,在命令行下执行

删除数据库 :drop database day11;

恢复

1、创建空数据库 create database day11_bak;

2、恢复数据库

Source 文件名.sql // 在mysql内部使用

例如:

mysql> use day11_bak;
Database changed
mysql> source c:\day11.sql

mysql –u 用户名 p 数据库名 < 文件名.sql  // 在cmd下使用

例如:mysql -u root -p day11_bak < c:\day11.sql


多表设计 — 任何一个软件系统都是由多个数据表 组成

系统中已经存在employee表

向系统添加dept 表 (部门表)

create table dept (
id int primary key not null auto_increment,
name varchar(40) unique not null
);

insert into dept values(null,'人力资源部');
insert into dept values(null,'产品研发部');
insert into dept values(null,'财务部');
insert into dept values(null,'行政部');


建立employee 表和dept表关系 ,在employee表添加 dept_id

alter table employee add dept_id int ;
update employee set dept_id = 1 where id =1;
update employee set dept_id = 2 where id =2;
update employee set dept_id = 3 where id =3;
update employee set dept_id = 4 where id =4;


产品研发部解散了 删除dept表 相应数据
delete from dept where id = 2;


* 问题:李四属于产品研发部,部门记录删除前,先将李四转到别的部门 ——— 外键约束

外键约束:在employee表添加外键约束,使得dept_id的值 引用 dept的id字段 ,值不可以乱写

* 外键通常引用另一个表主键

foreign key(外键) references 表名(主键)


为employee表添加一个外键约束

alter table employee add foreign key (dept_id) references dept(id );


添加了外键约束,就不能随便取值,取值是引用表存在主键值,不能随便删除数据 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息