MySql入门
学习目标
- 了解什么是数据库和SQL
- 掌握对数据库的CRUD
- 掌握对表的CRUD
- 掌握对数据的CRUD
1.数据库概念
- 文件系统。
2.常见数据库
- MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费.
- Oracle :收费的大型数据库.Oracle公司的产品.Oracle收购SUN公司,收购MYSQL.
- DB2:IBM公司的数据库产品,收费的.银行系统中.
- SQLServer:MS公司.收费的中型的数据库.
- SyBase :已经淡出历史舞台.提供了一个非常专业数据建模的工具PowerDesigner.
- SQLite : 嵌入式的小型数据库,应用在手机端.
3.关系型数据库
- 实体(表)和实体之间存在一种关系
4.mysql的安装和卸载
1)卸载
- 去360或者控制面板卸载
- 一定要删除两个文件夹(数据库安装路径,数据存放路径,这两个文件夹在配置文件里面my.ini)
5.数据库服务器内部结构
6.sql概念
- 结构化查询语言
非过程化语言,一条语句对应一个结果
eg: int i = 5; int j = 4; int sum = i+j;
7.sql分类
DDL:数据定义语言.
create,alter,drop...
DML:数据操纵语言
insert,delete,update
DCL:数据控制语言
grant
DQL:数据查询语言(****重点).
select
公司一般数据库有两套,一套是测试库,一套是正式库
8.命令行连接数据库
- mysql -u root -p
9.学习数据库列表
- 对数据库的CRUD
- 对表的CRUD
- 对表里面的数据的CRUD(*重点)
二,对数据库的CRUD
1.创建数据库
create database 数据库名 [character set 字符集]
创建一个web06_1的数据库(默认字符集)
create database web06_1;
创建一个web06_2的数据库(字符集指定为gbk)
create database web06_2 character set gbk;
2.查看数据库
1)查看所有的数据库
show databases;
2)查看数据库的定义
show create database 数据库名;
3.删除数据库(很少用)
drop database 数据库名;
4.修改数据库(不是修改数据库名,是修改字符集)
alter database 数据库名 character set 字符集;
注意:
- 是utf8,不是utf-8
5.其它操作
- use 数据库名; 选择数据库
- select database(); 查看正在使用的数据库
注意:
- use后面直接根数据库名
- 在操作表和操作数据之前,一定要指定数据库
三,对表的CRUD
1.创建表
create table 表名(
字段 类型 约束,
字段 类型 约束,
字段 类型 约束
);
1)类型
Java MYSQL
int int
float float
double double
String char/varchar
Date date,time,datetime,timestamp
文件类型 BLOB、TEXT TEXT指的是文本文件 BLOB二进制文件
不同:
字符串
char(18); aa ;--->身份证 18位 varchar(18); aa
时间
date:只有日期 time:只有时间 datetime:即有日期又有时间 timestamp:时间戳 -- > 下订单
文件类型
注意:
- 一般不把大文件(歌曲,电影)通过二进制存入数据库。把文件存放在服务器的硬盘上,保存文件的路径。
2)约束
- 规则,约定
- not null; 非空
- unique;唯一约束
- primary key;主键约束(非空+唯一)
注意:
- 一般,把id设置为int类型,设置为主键约束,并且自动增长
- 或者把id设置为字符串类型,UUID
1)创建一张学生表(id int类型,主键约束,设置自动增长; 学生姓名,字符串类型; 学生性别,整型)
create table student(
id int primary key auto_increment,
sname varchar(20),
sex int
);
2.查看表
1)查看所有的表
show tables;
2)查看表的定义结构
desc 表名;
3.修改表
- 增加一个字段;alter table 表 add 字段 类型 约束;
- 修改列的类型约束; alter table 表 modify 字段 类型 约束 ;
- 修改列的名称,类型,约束;alter table 表 change 旧列 新列 类型 约束;
- 删除一列; alter table 表名 drop 列名;
- 修改表名; rename table 旧表名 to 新表名;
1)给学生表增加一个grade字段
alter table student add grade varchar(20);
2)给学生表的sex字段改成字符串类型
alter table student modify sex varchar(10);
3)给学生表的grade字段修改成class字段
alter table studnet change grade class varchar(20);
4)把class字段删除
alter table student drop class;
5)把学生表修改成老师表(很少用)
rename table student to teacher;
4.删除表(很少用)
drop table 表名;
三,对表的数据CRUD(**重点)
1.插入数据
1种. insert into 表 values(值,值....)
2种.insert into 表(字段,字段) values(值,值);
注意:
- 第1种,字段有几个,值就应该插入几个
- 第2种,插入哪些值,字段就列举出来几个。但是如果没有插入的字段有非空约束,不行的
- 值和字段类型要匹配
- 值和字段的个数要匹配
- 值是字符或者时间类型,需要用”括起来
2.更新记录
update 表 set 字段 = 值 [where 条件]
把分类表的cname字段更新成服装
update category set cname = '服装';
注意:
- 如果没有加条件,修改字段的所有记录都会被修改
3.删除记录(表还在)
1)delete from 表 [where条件]
2)truncate table 表
区别:
- delete是受事物控制的,一条一条的删除
- truncate不受事物控制,把整张表删除,再创建一模一样的空表
4.查询记录(**重点)
select [*][字段,字段...][distinct 字段][聚合函数] from 表名 [where 条件]
1)查询所有的字段记录
查询商品表的所有字段记录
select *from product;
2)查询某张表特定字段的记录
查询商品表的商品名和价格
select pname,price from product;
3)去重查询
把价格重复的给筛选
select distinct price from product;
注意:
- 一定要一模一样才能去重
4)别名查询 as
- 字段别名; 字段 as 别名
表的别名; 表名 as 别名
查询商品名称和商品价格,商品价格通过别名‘价格’来查询
select pname, price as '价格' from product;
5)运算查询(+,-,*,/等)
把商品名,和商品价格+10查询出来
select pname,price+10 from product;
注意:
- 运算查询字段字段之间是可以的
- 字符串时间这些做运算查询,结果是没有意义的
6)where条件查询
查询商品价格>3000的商品
select *from product where price>3000;
查询价格在3000到6000之间的商品(3000<= price <=6000)
select *from product where price between 3000 and 6000;
注意:
between and是包括临界值的
查询id在1,5,10,15范围内的商品
select *from product where pid in(1,5,10,15);
查询商品名以Ip开头的商品
select *from product where pname like "Ip%";
like:注意空格
- 一般和占位符一起使用
- %;多位(0~n)
_;一位
查询商品价格大于3000并且数量大于20的商品
select *from product where price>3000 and num>20;
7)排序查询
- order by 字段
- asc;升序
- desc;降序
eg:根据商品价格查询出商品
select *from product order by price;
8)聚合函数
- count(*|字段); 统计个数,过滤null
- sum();总和
- max();最大值
- min();最小值
avg();平均值
查询商品的总个数
select count(pid) from product;
求商品的价格总和
select sum(price) from product;
查询商品的最大价格
select max(price) from product;
查询商品的平均价格
select avg(price) from product;
9)分组查询
group by 字段
eg:根据cno分组,统计不同组的商品个数
select con,count(*) from product group by cno;
注意:
- 一般情况下,通过分组只包含分组字段和聚合函数结果才有意义
10)分组后筛选
having
eg:根据cno分组,统计不同组的商品个数,并且个数>5的
select con,count() from product group by cno having count() >5;
注意:
- having是分组后筛选,不能离开group by 单独存在
- 有having一定有group by,有group by 不一定有having
11)查询语句出现的顺序
- select from where group 【having】 order
注意:
- 聚合函数不能作为where的条件,where后面不能直接跟聚合函数
- having一般和聚合函数配合起来使用
12)分页查询
- limit a,b;
- a:从哪里开始(从0开始计数的)
b:一页显示的数量
a = (curPage-1)*b;
应用场景:
- 百度下面翻页的效果,手机里面上拉加载更多
做翻页效果:
- 请求一次服务器,查询数据库(适合每一条数据量比较大)
- 把数据一次查完返回给前端(适合数据量不太大)
- 分页扩展
查询最大价格的商品名
select pname,max(price) from product;不行的 select pname,price from product order by price desc limit 0 ,1;
翻页查询封装PageBean
class PageBean{ List<Item> list; int curPage;//当前页 int curCount;//一页显示的个数 int total;//总个数 int totalPage;//总页数 } totalPage: total%curCount == 0---> total/curCount; total%curCount != 0---> total/curCount+1;
四,数据库常见问题解决
1安装路径
安装文件存放路径:不能有中文和空格!
2.如果在安装的过程中, 出现 了 the error code is 2503 或者2502, 记得要获得管理员权限,然后再安装.
3.解决命令行插入中文乱码或者插入数据不进去的问题
如果在命令行里出现中文乱码,到my.ini配置文件里面修改和命令行一致的编码。
4.3306端口号被占用导致服务开启不了
已经安装服务,端口号被占用:
命令行输入:netstat -ano
找到对应端口的pid,去任务管理器去查找pid对应的软件。kill掉软件。
5.密码忘记或者出现ERROR 1045 (28000): Access denied for user ‘ODBC’@’localhost’ (using password: YES)
1)第一种
1.在my.ini的[mysqld]字段加入:
skip-grant-tables
2.重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql(不要密码)
3.mysql>use mysql;
mysql>update user set password=password('新密码') WHERE User='root';
4.mysql>flush privileges;
运行之后最后去掉my.ini中的skip-grant-tables,重启mysqld即可。
2)第二种
不使用修改my.ini重启服务的方法,通过非服务方式加skip-grant-tables运行mysql来修改mysql密码
1. 停止mysql服务
2.打开命令行窗口,在bin目录下使用mysqld-nt.exe启动,即在命令行窗口执行: mysqld-nt --skip-grant-tables
3.然后另外打开一个命令行窗口,登录mysql,此时无需输入mysql密码即可进入。
4.按以上方法修改好密码后,关闭命令行运行mysql的那个窗口,此时即关闭了mysql,如果发现mysql仍在运行的话可以结束掉对应进程来关闭。
5.启动mysql服务
6.没有安装服务
(没有安装服务)安装服务:
管理员权限进入mysql的bin目录下:
mysqld.exe -install 安装服务:
如果有服务已经存在可以先移除
mysqld.exe -remove 移除服务
五,多表间关系
1.外键约束
- alter table 表 add foreign key(字段) references 表(字段);
2.多表的关系