1.MySQL 数据库和数据表的基本操作
MySQL数据库
数据库
—— 就是一个文件系统,访问数据的时候需要通过标准的SQL语言来完成。
关系型的数据库
—— 保存的实体与实体之间的关系。(用户、商品、订单)
—— 表格的结构
* 常见的关系型数据库
* Oracle 公司Oracle(甲骨文)数据产品,收费的大型的数据库。
* MySQL 开源的,被Oracle收购。5.x版本免费,6.x收费了。
* SQLServer 微软的,收费的中型的数据库。
* DB2 IBM公司收费的大型的数据库。
MySQL的简介
- 卸载
* 找到MySQL的安装路径,找到my.ini的配置文件。
* 安装的路径:basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/"
* MySQL存储数据的路径:datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
* 卸载MySQL
* 再找到上面的两个路径,删除就干净了。
- 安装
* 安装路径不要有中文(*****)
* MySQL默认端口是3306,不要修改。
* 设置MySQL的编码集(采用UTF-8的编码)
* 安装完成。
- 访问
1. cmd > 输入命令 mysql -u root -p 回车
* 输入密码 回车
* 如果是mysql 命令未找到,先配置环境变量
2. * 也可以用 navicat 等连接访问
- 密码重置
1.停止mysql服务
services.msc 进入到服务界面
2.在cmd>输入一个命令
mysqld --skip-grant-tables (开启一个mysql服务,不需要进行认证)
3.新打开一个cmd窗口
mysql -u root -p 不需要输入密码. enter 就可以进入.
4.查看数据库
show databases;
5.使用mysql数据库
use mysql(系统数据库名);
6.修改密码
update user set password=password('root') WHERE user='root';
7.将两个窗口都关闭.
8.任务管理器中结束(mysqld)进程.
9.重启mysql服务
- MySQL之间的关系
- 一个数据库的服务器中有多个数据库,一个数据库中有多个表。
- 每个表有多个字段。字段和Java中类的属性是对应的。
- 每一条记录对应是一个Java实例对象。
- SQL简介
- Structured Query Language, 结构化查询语言
- 非过程性的语言
- 过程性的语言:下一条语句需要依赖上一条或者上几条语句。
- 非过程性的语言:写一条语句,就会执行一个结果。
- SQL语言分类
- DDL(数据定义语言)
- 创建数据库、创建表
- DML(数据操纵语言)
- 插入数据(insert) 修改数据(update) 删除数据(delete)
- DCL(数据控制语言)
- if else 等(处理逻辑,现在很少使用)
- DQL(数据查询语言)
- 查询数据 (select)
- 数据库操作
- 创建数据库
语法:create database 数据库名称;
create database 数据库名称 [character set 编码] [collate 校对规则];
默认为 character set 'utf8' collate 'utf8_bin'
* 校对规则和编码是成对出现的。
- 查看数据库
show databases;
- 查询数据库的定义(可查看编码)
show create database 数据库名;
- 删除数据库
drop database 数据库名;
- 修改数据库
语法:alter database 数据库名 character set 编码 collate 校对规则;
- 其他的操作
-切换数据库 use db_name;
-查看当前使用的数据库 select database();
- 数据表操作
- 创建
语法:
create table 表名(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束,
字段4 类型(长度) 约束
);
注意:
* 表名小括号,后面要有分号。
* 每一行字段后面要有逗号,但是最后一行没有逗号。
* 数据的类型后面有长度,如果是字符串类型,长度必须加。
如果其他类型可以不加。int 默认长度11
根据用户表编写的 java 数据库用户模型类 (每一个成员变量对应数据表的一个字段名)
public class User{
int id;
String name;
String pass;
String eamil;
String nikename;
}
- 数据的类型
-字符串类型
* varchar和char区别:
* varchar(经常使用) 长度是可变的。 name varchar(8)
-存入数据hello,长度为5,但是如果存入helloworld就报错了。
* char 长度不可变的。 name char(8)
-存入的数据hello,如果不够用空格补,全长度为8。
* 效率高:char
-大数据类型(一般不用)
-BLOB:二进制文件
-TEXT:字符
-数值型
TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
-逻辑性 对应boolean
BIT
-日期型
DATE、TIME、DATETIME、TIMESTAMP
* date 只包含日期
* time 只包含时分秒
* datetime和timestamp包含日期和时分秒区别:
- datetime 需要手动录入时间。
- timestamp 不传入数据,默认选择当前系统时间。
- 约束
- 主键约束
* 标识标记该条记录。 通过pramary key声明主键。(默认唯一、非空)
* auto_increment 数据库维护主键。自动增长。
- 唯一约束
* 值是唯一的。使用unique声明
- 非空约束
* 值不能为空 not null
- 查看表的信息
desc 表名;
- 查看当前库内所有表名
show tables ;
- 查看建表语句和字符集
show create table 表名;
- 删除表
drop table 表名;
- 修改表
- 添加字段: alter table 表名 add 字段 类型(长度) 约束;
- 删除字段: alter table 表名 drop 字段;
- 修改类型或者约束: alter table 表名 modify 字段 类型(长度) 约束;
- 修改字段的名称: alter table 表名 change 旧字段 新字段 类型(长度) 约束;
- 修改表名: rename table 表名 to 新表名;
- 修改字符集: alter table 表名 character set utf8;
对数据操作
stu表:
create table stu( id int primary key auto_increment, name varchar(20) not null, math varchar(4), chinese varchar(4), pe varchar(4) );
插入几条数据以后:
查询总分大于220分的所有同学
select * from stu where (math+chinese+pe) > 220;

查询语文分数为40,45,46的同学。(用in方式)
select * from stu where chinese in(40,45,46);

查询数学分数在 79-90之间的同学,并且语文成绩大于80。
select * from stu where math > 79 and math < 90 and chinese > 80;
或 select * from stu where math between 79 and 90 and chinese > 80


like
模糊查询 写法:like '张_' 或者 '张%';
_和%区别:占位符。_只表示一个字符,%可以表示多个
例如,有名字叫张三,张三丰的2人
like '张_' 只能匹配到 张三
而 like '张%' 能匹配到两个人
匹配姓张的人
select * from stu where name like '张%'; 或 select * from stu where name like '张_';

对学生成绩按照数学进行降序排序,数学相同学员按照语文降序
select * from stu order by math desc,chinese desc;

结果张三竟然排在了lisi前面,寻找出错原因,发现chinese 列的类型为字符型的varchar,
不是数字类型,改为int 类型:
alter table stu modify chinese int(4);
重新排序
select * from stu order by math desc,chinese desc;

结果正常。(字符型 100 和 95 比大小这儿就不多做探讨了)
先更改一个数据
update stu set math = NULL where id = 2;

统计一个班级语文、体育、数学的成绩总和
select sum(math+pe+chinese) from stu
select sum(ifnull(math,0)+pe+chinese) from stu;
select sum(math)+sum(pe)+sum(chinese) from stu;

分析原因:sum(NULL+45+84) , NULL+45+84 = NULL
所以,并没有将张三的另两门成绩算入。
解决方法: ifnull(math,0) 空的话就设为 0
统计一个班级语文成绩平均分
select chinese,sum(chinese) / count(*) as avg from stu;
或
select avg(chinese) from stu;

取出数学成绩最高的学生成绩
select*from stu where math=(select max(math) from stu);
或
select * from stu order by math desc limit 0,1;

前一句涉及多条查询,显然,后者效率更高。
再来一张表:
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); insert into orders(id,product,price) values(6,'电视',900);

group by 分组(一起使用) 条件过滤用 having,不能使用 where
对订单表中商品归类后,显示每一类商品的总价:
select product,count(*),sum(price) from orders group by product;

查询购买了几类商品,并且每类总价大于100的商品:
select product,sum(price) from orders group by product having sum(price) > 100;

注意
select 语句 : S-F-W-G-H-O 组合
select ... from ... where ... group by... having... order by ... ;
顺序不能改变

浙公网安备 33010602011771号