北京行------数据库理论知识
day1 -- day3 XML Java基础加强
day4 -- day7 Servlet编程
day8 -- day10 JSP 综合案例
day11 -- day16 MySQL 数据库 练习SQL语句 JDBC编程
关系化数据模型?
常见关系化数据库有哪些?
收费产品
免费产品
Microsoft SQL Server : 微软公司产品,中等规模数据库 收费产品,运行在windows平台上 --- .net平台
+SQLServer进行开发
Oracle :甲骨文公司产品,大型商业数据层,收费 运行在任何操作系统上 windows linux --- Oracle收购
sun(Java) ---- Java + Oracle
MySQL :最初是一个开源免费数据库产品 ,中小型数据库 ---- 互联网行业主流数据库 Mysql被Oracle收
购后,Mysql6.0开始推出收费版本---- 企业主流5.X
SYBASE:收费,中型数据库,银行证券 ----- PowerDesigner PD (数据库设计建模软件)
HSQL : 迷你数据库 开源免费,纯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) 启动cmd窗口
2) mysql -u root -p 回车 输入密码
3) 创建数据库 day11 ------ create database day11 ;
* show databases ; 查看当前所有数据库
* show create database day11 ;
4) 创建数据表 ,先切换数据库 use day11;
* select database();
5) 创建数据表
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
);
* desc employee; 查看表结构
6) 插入数据
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] ---- 客户端配置
[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; 数据永远删除,不会恢复
%是通配符
_ 代表任意单个字符
is null 判断一列是否为空
select * from scores where 1[true];
and 先执行 优先级高于or
按照多列排序
select * frome 表明 order by
有null的无论什么运算都是null;
聚集函数 结合查询分组
count 返回查询结果的
where 中不能使用分组函数
group by product having sum(price)100;
where 是在分组之前执行,having是在分组之后执行,where不能使用分组函数
having 可以替换where
先后关系一定 要搞清楚