MySql数据库
常见数据库
-
mysql:开源免费的适用于中小型企业的,免费数据库,sun公司收购mysql,后来sun公司被oracle收购,后来开始收费
-
mariadb:由mysql创始人做出,直接是mysql开源版本的一个分支,基本上所有的命令都是一样的
-
oracle:收费商业软件,适用于大型电商网站
-
db2:IBM公司,解决方案:软件和硬件,服务器架构,银行系统大多采用db2
-
sqlserver:通常用在windows里面,政府网站asp.net,大学教学通常sqlserver,图形化工具做的不错
-
NOSQL:非关系型数据: key:value
- mongodb
- redis
关系型数据库
主要是用来描述实体与实体之间的关系
实体:实实在在存在的事物:学生和班级,员工和部门
ER关系图(重要)
实体:方框
属性:椭圆
关系:菱形
Mysql数据库服务器
Mysql数据库:数据库管理软件
服务器:就是一台电脑,安装了相关的服务器软件,会监听不同的端口号,根据用户访问的端口号,提供不同的服务
Mysql的安装和卸载
- 卸载:
- 打开程序控制面板,删除软件
- 删除mysql安装目录下的所有文件 C:\Program Files\MySQL
- 删除mysql的数据存放文件 C:\ProgramData\MySQL(隐藏文件)
- 安装
- 运行安装程序:在启动配置教程之前一直下一步,没有下一步的话就直接finash
- 第一次之后启动服务器配置教程
- 第一个include mysql bin directory to windows path
- 第二个:端口号不要去修改,字符集选择UTF-8,密码不要忘记
Mysql的SQL语句
SQL:Structure Query Language 结构化查询语言
DDL:数据定义语言:定义数据库,数据表它们的结构:create(创建) drop(删除) alter(修改)
DML:数据操纵语言:主要是用来操纵数据库 insert(插入) update(修改) delete(删除)
DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant
DQL:数据查询语言:select(查询) from子句 where子句
数据库CRUD的操作
- 首先要登录数据库服务器 mysql -uroot -proot (默认密码是root)
创建数据库
create datebase 数据库的名字
create datebase day06;
--创建数据库的时候,指定字符集
create datebase 数据库的名字 character set 字符集;
create datebase day06_1 character set utf8;
create datebase 数据库的名字 character set 字符集 collate 校对规则;
create datebase day06_2 character set utf8 collate utf8_bin;
查看数据库
--查看数据库定义的语句
show create databases 数据库的名字
show create databases day06;
--查看所有数据库
show databases;
information_schema
performance_schema
mysql
这三个数据库不要动它
修改数据库的操作
--修改数据库的字符集
alter databases 数据库的名字 character set 字符集
alter databases day06_1 character set gbk;
删除数据库
drop databases 数据库名字;
drop databases day06_2;
其他数据库操作命令
--切换数据库(选中数据库)
use 数据库名字
use day06;
--查看一下当前正在使用的数据库
select databases();
表的CRUD操作
创建表
create databases 数据库的名字
create table 表名(
列名 列的类型 约束,
列名2 列的类型 约束
);
列的类型:
java sql
int int
char/String char/varchar
char:固定长度
varchar:可变长度
char(3): 一 一空格空格
varchar(3): 一 一
长度代表的是字符的个数
double double
float float
boolean boolean
date date : YYYY-MM-DD
time : hh:mm:ss
datetime: YYYY-MM-DD hh:mm:ss 默认值是null
timestamp: YYYY-MM-DD hh:mm:ss 默认使用当前时间
text: 主要用来存放文本
blob: 存放的是二进制
列的约束:
主键约束: primary key
唯一约束: unique
非空约束: not null
创建表:
1.分析实体:学生
2.学生ID
3.姓名
4.性别
5.年龄
create table student(
sid int primary key,
sname varchar(30),
sex int,
age int,
);
查看表
--查看所有的表
show tables;
--查看表的定义
show create table student;
--查看表的结构
desc student;
修改表
--添加列(add)
alter table 表名 add 列名 列的类型 列的约束
alter table student add chengji int not null;
--修改列(modify)
alter table student modify sex varchar(2);
--修改列名(change)
alter table change sex gender varchar(2);
--删除列(drop)
alter table student drop chengji;
--修改表名(rename)
rename table student to user;
--修改表的字符集
alter table user character set gbk;
删除表
drop table user;
Sql完成对表中数据的CRUD的操作
插入数据
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
如果插入全列数据,列名可以省略,如果插入部分列则不能省略,批量插入逗号隔开
查看表中数据
select * from student;
命令行下插入中文问题:insert into student values(11,‘李四’,1,24);
- 临时解决方案:set names gbk;相当于是告诉mysql服务器软件,我们当前在命令行下输入的内容是GBK编码,当命令窗口关闭之后,它再输入中文就会存在问题
- 永久解决办法:修改my.ini配置文件C:\Program Files\MySQL\MySQL Server 5.5\my.ini
- 暂停mysql服务
- 在mysql安装路径中找到myu.ini
- 将57行的编码改成gbk
- 保存文件退出
- 启动mysql服务
删除记录
delete from 表名 [where条件]
delete from student where sid=10;
delete from student; 如果没有指定条件会将表中数据一条一条全部删除
面试问题:请说一下delete删除数据和truncate删除数据的区别
delete:DML 一条一条删除表中数据
truncate:DDL 先删除表再重建表
那条执行效率高具体要看表中数据量,如果数据比较少delete比较高效,如果数据比较多truncat比较高效
更新表记录
update 表名 set 列名=列的值,列名2=列的值2 [where 条件]
--将sid为5的名字改成李四
如果参数是字符串、日期,要加单引号
update student set sname='李四' where sid=5;
查看记录
select [distinct] [ * ] [列名,列名2] from 表名 [where 条件]
distinct:去除重复数据
--like: 模糊查询
- : 代表的是一个字符
% : 代表的是多个字符
--查询名字中带有饼的所有商品 %饼%
select * from product where pname like %饼%
--in 在某个范围内获得值
查询出商品分类ID在1,4,5里面的所有商品
select * from product where cno in (1,4,5);
--排序查询:order by 关键字
asc : ascend 升序 (默认的排序方式)
desc : descend 降序
select * from product order by price asc;
select * from product order by price desc;
--聚合函数
sum : 求和
avg : 平均值
count : 统计数量
max : 最大值
min : 最小值
商品价格总和:select sum(price) from product;
商品价格平均值:select avg(price) from product;
商品总数:select count(price) from product;
商品价格最大值:select max(price) from product;
商品价格最小值:select min(price) from product;
注意:where条件后面不能用聚合函数
--子查询
查询大于平均价格的所有商品
select * from product where price > (select avg(price) from product;
--分组:group by
1.根据cno字段分组,分组后统计商品的个数
select cno,count(*) from product group by cno;
count : 统计数量
max : 最大值
2.根据cno字段分组,分组后统计每组商品的平均价格,并且商品平均价格>60
select cno,avg(price) from product group by cno
having avg(price) > 60;
having 关键字,可以接聚合函数,出现在分组之后
where 关键字,不可以接聚合函数,出现在分组之前
--sql编写顺序
select from where group by having order by
--sql执行顺序
from where group by having select order by