数据库的概述:
什么是数据库
管理数据的一个文件系统,用sql语句操作
数据库的作用
存储数据,数据仓库,带有访问的权限,不通的人可以有不同的操作
为什么要学习数据库
生活所迫
常见的数据库:
关系型数据库:
MySQL数据库:开源的免费的适合中小公司免费的数据库,被sun公司受够了,后台sun公司又被oracle公司收购了
mariadb:由mysql数据库创始人搞出来的,基本的命令和mysql一样
oracle数据库:甲骨文公司,收费,适合大型的电商企业
db2数据库:IBM公司thinkpad使用的,银行大多数采用db2
sqlServer数据库:windows里面,政府里面常用,大学教学,图像化页面比较好
非关系型数据库: mongodb redis:一般当做缓存用
关系型数据库:
主要用来描述实体与实体之间的关系,
实体:就是表示实实在在的存在现实世界的事物,比如学校与学院,学生与班级,员工与部门
E-R图:矩形表示实体,椭圆表示属性,菱形表示关系
Mysql数据库服务器:
数据库服务器其实就是一台电脑,提供外界访问的端口号,根据不同的端口号来提供不同的服务
我们通常所说的mysql数据库其实是管理数据库的软件。
mysql数据库的安装和卸载:
卸载:
打开控制面板,进行卸载
卸载完之后去 C:\Program Files\MySQL\MySQL Server 5.5/my.ini 删除 文件,否则再安装的时候会出现错误
然后再去C:\ProgramData\MySQL 删除这个目录下的MySQL文件,否则安装时候会出现错误
如果都删除干净,重新安装的时候出现
A windows service with the name Mysql already exists, please uninstall this service correctly or choose a diffreent name for the new service
这个错误,解决办法: 点击这个链接看看
https://blog.csdn.net/k_122/article/details/76620494
安装:
启动安装程序,直接点击下一步,知道没有下一步点击finish
第一次finish之后启动配置服务
然后配置,都选第一个,知道修改字符集选第二个,utf-8,之前的一步表示几个用户并发,选自定义改为20个,之后设置 root用户的密码,下面的勾选不要勾上,勾上之后其他电脑也能访问你的数据库,然后下一步,最后成功。
mysql的sql语句:
SQL:Structure Query Language 结构化查询语言
DDL:数据库定义语言,定义数据库、数据表的结构:create(创建)、drop(删除)、alter(修改)
DML:数据操纵语言,主要操控数据:insert(插入)delete(删)、update(改)
DCL:数据控制语言,主要来定义访问权限、取消访问权限,安全设置:grant
DQL:数据查询语言:select(查询)子句where from等
数据库的CRUD操作:
登录数据库服务器:mysql -uroot -p123456
创建数据库:
create database 数据库的名字;
create database hou;
创建数据库的时候指定字符集:
create database 数据库的名字 character set 字符集;
create database hou character set utf8;
create database hou character set utf8 collate 校队规则;
校队规则:xiao
x=23232 i=3333 a=8989 o=2345
xiao=23232333389892345
查看数据库
查看数据库定义的语句:
show create database 数据库的名字;
show create database hou;
查看所有的数据库:
show databases;
information_schema performation_schema mysql : 约束规则的意思,存放了mysql的基础配置,不能动他
修改数据库
修改数据库的字符集:
alert database 数据库的名字 character set 字符集;
alter database hou character set gbk;
删除数据库
drop database 数据库的名字;
drop database hou;
其他数据库的操作命令
切换数据库:use 数据库的名字;
查看当前的数据库:select database();
表结构的CRUD操作:
创建表
create table 表名(
列名 列类型 约束,
列名 列类型(长度) 约束
);
列的类型:
Java sql
int int
char/String char/varchar(长度)
char:固定长度 例如char(3),就直接给三个字符的空间
varchar:可变长度 例如varchar(3),根据你写的字符给定空间,但是最多为3个字符
float float
double double
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 默认当前的时间
列的约束:
主键约束:primary key
唯一约束:unique
非空约束:not null
创建表:
分析实体:学生
属性:学生ID、姓名、性别、年龄
create table student(
sid int primary key,
name varchar(10),
sex varchar(10),
age int
);
查看表
查看多有的表
show tables;
查看表的结构: //最重要,有关数据库结构的优化
desc 表名;
查看表的创建过程:
show create table 表名;
修改表
修改表的列:添加列(add)、修改列类型(modify)、修改列名(change)、删除列(drop),修改表名(rename)、修改表的字符集()
添加列:alter table 表名 add 新列名 新列的类型 列的约束;
alter table student add tel varchar(20) not null;
修改列的类型:alter table 表名 modify 原列名 新的列类型 列约束;
alter table student modify sex int;
修改列名:alter table 表名 change 原列名 新列名;
alter table student change sex sexx;
删除列:alter table 表名 drop 列名;
alter table student drop tel;
修改表名:rename table 表名 to 新表名
rename table student to students;
修改表的字符集:alter table 表名 character set 字符集;
alter table student character set utf8;
删除表
drop table 表名;
sql完成对表中数据的CRUD操作
插入数据
insert into 表名(列名1,列名2,列名3,列名4) values(值1,值2,值3,值4);
insert into student(sid,name,sex,age) values(3,'zhangsan','男',18);
如果插入的是全列名的数据,表名后面的列名可以省略不写
insert into student values(3,'zhangsan','男',18);
如插入的是其中个别列的数据,表名后面的列名必须写
insert into student(sid,name) values(1,'lisi');
批量插入数据
insert into student(sid,name,sex,age) values
(4,'kk','女', 20),
(4,'kk','女', 20),
(4,'kk','女', 20),
(4,'kk','女', 20);
单条插入数据和批量插入数据的效率
批量插入识别的关键字少,效率高,但是如果一条出现问题,整个插入就不能进行
单条插入数据识别的关键字多,效率低,一条出现问题,但之前的数据也能插入
解决插入数据中文的乱码问题
https://www.cnblogs.com/linst/p/5865434.html
在创建表(相当于在数据库中建立表结构为数据库使用的字符集编码)的过程中,设置表的字符编码相当于在数据库服务 器中的设置了编码。
在cmd键入的字符相当于是gbk编码,相当于客户端client。
connection相当于连接数据库的字符集类型,相当于my.ini文件中的设置的类型。
临时解决方案:
使用set names gbk 命令,相当于是高速服务器软件,我们在当前输入的是gbk编码,当关闭当前的窗口,再输入中 文就会出现问题
使用 show variables like 'character%' 来查询当前数库的所有的编码集。
永久解决方案:
1、暂停mysql服务
2、在mysql安装路径中找到C:\Program Files\MySQL\MySQL Server 5.5\my.ini 文件
3、 [mysql] //表示与客户端相关的字符集
default-character-set=utf8 改成 gbk编码
4、保存文件退出,重启mysql服务
删除数据
delete from 表名 [where 条件];
删除表中所有的数据
delete from student;
根据条件删除数据
delete from student where sid=5;
面试的时候问:delete删除数据 和 truncate删除数据有什么区别
delete: DML语言,是一条一条的删除数据
truncate: DDL语言,是先删除表的结构,然后再重建表
关于执行的时候,哪个效率高
具体得看数据量的大小,如果数据量非常小的话,delete删除的效率高,
如果数据量非常的大,truncate删除的效率高
更新数据
update 表名 set 列名=列的值,列名2=列的值 [where 条件];
update student set sname = 'jkjk' where sid=2;
如果参数是zai字符串,日期要加上单引号
如果没加where条件,将改变这一列全部的数据
update student set sname = 'jkjk';
查询数据
select [distinct] [*] [列名1,列名2] from 表名 [where 条件];
distinct:去除重复的数据
商品的分类:手机数码、鞋靴箱包
1、分类的id
2、分类的商品
3、分类的描述
创建表
create table categroy(
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(31)
);
插入数据
insert into categroy values(1,'手机数码','电子产品质量保证');
insert into categroy values(2,'鞋靴箱包','京南皮革厂倒闭了');
insert into categroy values(3,'香烟酒水','二锅头,小郎酒');
insert into categroy values(4,'酸奶饼干','娃哈哈,纯真');
insert into categroy values(5,'馋嘴零食','花生瓜子、八宝粥');
查询语句
select * from categroy;
select cname,cid from categroy;
所有商品
商品的id,商品的名称,商品的价格,生产日期,商品的分类
create table product(
pid int primary key auto_increment,
pname varchar(10),
price double,
pdate timestamp,
con int
);
insert into product values(null,'小米',998,null,1);
insert into product values(null,'苹果',998,null,1);
insert into product values(null,'老村长',998,null,3);
insert into product values(null,'耐克',998,null,2);
insert into product values(null,'小熊饼',998,null,5);
insert into product values(null,'蒙牛',88,null,4);
简单查询
查询所有商品
select * from product;
查询商品的名称和价格
select pname,price from product;
别名查询,as关键字,as关键字可以省略,可用于多表查询
select p.pname,p.price from product as p; //as可以省略
去掉重复的值
select distinct price from product;
select的运算查询,仅仅是在结果上进行了运算
select *,price*0.8 as 折后价列名 from product; //as 折后价列名可以不写
条件查询 where 关键字
关系运算符:> >= < <= = != <>(不等于)
逻辑运算符: and or not
like:mohu模糊查询,匹配查询
_:代表一个字符
%:代表多个字符
select * from pname like '%饼%';
in:表示在某个范围内取值
查询分类商品con 在 1 4 5 里面的商品
select * from cno in(1,4,5); //相当于or
排序查询 order by
desc:倒序
asc:升序,默认升序排列
聚合函数
sum() 求和
avg() 求平均数
count() 统计数量,统计所有的行数
max() 最大值
min() 最小值
分组-- group by
将子句查询结果按一列或者多列进行分组
先分组然后使用聚合函数,聚合函数经作用于每一组
having 关键字作用于每一组,将满足条件的组进行筛选出来
where 是作用于基本表或视图,用来筛选元祖
连接查询
等值连接:where 表1.列名=表2.列名; //列名必须是相同的
嵌套查询
查询条件中再嵌套