(1)MYSQL
一. 数据库概述
- 常见关系型的数据库:
- mysql:开源免费的适用于中小型企业的免费数据库,sun公司收购mysql,sun公司被oracle收购之后开始收费
- mariadb:由mysql创始人搞出来的,直接是mysql开源版本的一个分支,基本上所有命令都是一样
- oracle:甲骨文公司,商业收费软件,适用于大型电商网站,收购sun公司
- db2:IBM公司,thinkpad 负责解决方案:软件和硬件,服务器架构.银行系统大多采用是db2
- sqlserver: windows里面,政府网站asp.net,并且大学教学通常都是采用SQLserver,图形化工具做的不错
- sybase:被淘汰的数据库
- NOSQL非关系型数据库:key:value
- mongodb
- redis set get
- 关系型数据库:
主要是用来描述实体与实体之间的关系
E-R图 实体:方框 属性:椭圆 关系:菱形
二.MYSQL数据库服务器
- MYSQL数据库:数据库管理软件
- 服务器:就是一台电脑,这台安装相关的服务器软件,这些软件监听不同的端口号,根据用户访问的端口号,提供不同的服务
三.MYSQL的安装与卸载
- 卸载:
- 打开控制面板,删除软件
- 删除mysql安装目录的所有文件
- 删除mysql数据存放文件,在C:\ProgramData\MySQL
- 安装
- 运行安装程序:在启动配置教程之前,一直下一步,finish
- 第一次finish之后启动服务器配置教程
- 第一个 include mysql bin directory to windows path
- 第二个:端口号不要修改,字符集选择UTF-8,密码不要忘记
四.MYSQL的SQL语句
- SQL:Structuer Query Language
- DDL:数据定义语言:定义数据库,数据表的结构 create(创建) drop(删除) alter(修改)
- DML:数据操纵语言:主要是用来操作数据 insert(插入) update(修改) delete(删除)
- DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant
- DQL:数据查询语言:select(查询) from(子句) where(子句)
五.数据库的CRUD的操作
- 首先要登录数据库服务器: mysql -uroot -proot
- 创建数据库:
create database 数据库的名字
例如: create database user;
create database 数据库的名字 character set 字符集;
例如: create database user_1 character set utf8;
create database 数据库的名字 character set 字符集 collate 校对规则;
例如: create database user_2 character set utf8 collate utf8_bin; - 查看数据库
- 查看数据库定义的语句
show create database 数据库的名字
show create database user;
show create database user_2; - 查看所有的数据库
show databases;
//下面三个数据库不能动
information_schema
performance_schema
mysql
- 查看数据库定义的语句
- 修改数据库的操作
- 修改数据的字符集
alter database 数据库的名字 character set 字符集
alter database user_1 character set gbk;
- 修改数据的字符集
- 删除数据库
- drop database 数据库名字;
drop database user_2;
drop database test;
- drop database 数据库名字;
- 其他数据库操作命令
- 切换数据库(选中数据库)
use 数据库名字
use user; - 查看当前正在使用的数据库
select database();
- 切换数据库(选中数据库)
六.表的CRUD操作
- 创建表
- create table 表名(
列名 列的类型 约束,
列名2 列的类型 约束,
); - 列的类型:
java int char/string double float boolean date
sql int char/varchar double float boolean date text blob time datetime timestamp - 列的约束:
主键约束:primary key
唯一约束:unique
非空约束:not null - 创建表:
分析实体:学生
学生ID,姓名,性别,年龄
create table student(
sid int primary key,
sname varchar(31),
sex int ,
age int
);
- create table 表名(
- 查看表
- 查看所有的表
show tables; - 查看表的创建过程
show create table student; - 查看表结构
desc student;
- 查看所有的表
- 修改表
添加列(add),修改列(modify),修改列名(drop),修改表名(rename),修改表的字符集- 添加列(add)
alter table 表名 add 列名 列的类型 列的约束
alter table student add chengji int not null; - 修改列(modify)
alter table student modify sex varchar(2); - 修改列名(change)
alter table student change sex gender varchar(2); - 删除列(drop)
alter table student drop chengji; - 修改表名(rename)
rename table student to person; - 修改表的字符集
alter table person character set gbk;
- 添加列(add)
- 删除表
drop table person;
七.SQL完成对表中数据的CRUD的操作
- 插入数据
insert into 表名(列名1,列名2,列名3) values (值1,值2,值3)
insert into student(sid,sname,sex,age)values(1,'zhangsan',1,23);- 简单写法:若果插入的是全列名的数据,表明后面的列名可以省略
insert into 表名 values (值1,值2,值3)
insert into student values(2,'zhangsan',1,23); - 注意:如果是插入部分列的话,列名不能省略
insert into student(sid,sname)values(3,'lisi');
insert into student values(3,'lisi'); //这种写法是错误的 - 批量插入
insert into student values
(4,'zhangsan',1,23),
(5,'zhangsan',1,23),
(6,'zhangsan',1,23),
(7,'zhangsan',1,23),
(8,'zhangsan',1,23); - 单条插入和批量插入的效率
- 查看表中数据
select * from student; - 命令行下插入中文问题:insert into student values (11,'李四',1,24);
临时解决乱码问题,set names gbk;当前命令行输入的是GBK编码,命令行关闭后,再输入中文就会存在问题
永久解决乱码问题,先任务管理器暂停mysql的服务,修改my.ini配置(在mysql软件安装路径里),57行编码改成GBK
- 简单写法:若果插入的是全列名的数据,表明后面的列名可以省略
- 删除记录
delete from 表名 [where 条件]
delete from student where sid = 11;
delete from student; //如果没有指定条件,会将表中数据一条一条全部删除掉- 面试问题: delete删除数据 和truncate 删除数据有什么区别
delete:DML一条一条删除表中的数据
truncate:DDL先删除表再重建表
关于哪条执行效率高:具体看表中的数据量
如果数据比较少,delete比较高效
如果数据比较多,truncate比较高效
- 面试问题: delete删除数据 和truncate 删除数据有什么区别
- 更新表记录
update 表名 set 列名=列的值,列名2=列的值2 [where 条件]
将sid为5的名字改成李四
如果参数是字符串,日期要加上单引号
update student set sname='李四' where sid = 5; - 查询记录
select [distinct] [*] [列名,列名2] from 表名 [where 条件]
distinct:去除重复的数据- 简单查询:
select * from product;
select pname,price from product; - 别名查询,as的关键字,as关键字是可以省略
--表别名:select p.name,p.price from product as p; //as可以省略
--列别名:select pname as 商品名称,price as 商品价格 from product; //as可以省略 - 去掉重复的值
select price from product;
select distinct price from product;
- 简单查询:
- select运算查询:
select *, price*1.5, from product;
select *, price*0.9 as 折后价, from product;
--like :模糊查询
_:代表的是一个字符
%:代表的是多个字符
--查询出名字中带饼的所有商品 ' %饼% '
select * from product where pname like ' %饼% ';
--查询第二名字是菜的所有商品 ' _菜% '
select * from product where pname like ' _菜% ';
--in 在某个范围中获得值
--查询出商品分类id在 1,2,3里面的所有商品
select * from product where cno in (1,2,3); - 排序查询 order by 关键字
asc: ascend 升序 (默认的排序方式)
desc: descend 降序
select * from product order by price desc; - 聚合函数:
sum():求和 avg():求平均值 count():统计数量
max():最大值 min():最小值 - 分组 group by
根据cno分组,分组统计商品个数
select cno,count(*) from product group by cno;
根据cno分组,分组统计商品的平均价格,并且平均价格>60
select cno,avg(price)
from product group by cno
having avg(price) >60;
--having 关键字 可以接聚合函数的,出现在分组之后
--where 关键字 不可以接聚合函数的,出现在分组之前 - 编写顺序
--S..F..W..G..H..O
select .. from .. where .. group by .. having .. order by .. - 执行顺序
--F..W..G..H..S..O
from .. where .. group by .. having .. select .. order by