概念
数据库DB
概念:
在计算机中,以一定组织和结构,存储和管理数据的软件服务。
特点:
持久化:长久保存数据
分类:
关系型数据库:以关系表形式保存数据【MySQL】
非关系型数据库:通常以键值对形式存储【Resid】
DBA
DBS
DBMS
常见的数据库
关系性数据库:
MySQL:轻量关系数据库,开源免费的
Oracle:大型面向对象的关系型数据库,功能十分强大,商业软件。
SQL Server:C++、C#, .net,商业
SQLite:
非关系型数据库:
Redis:基于键值对的,内存型数据库。快
MongoDb:基于键值对的。
数据库安装
MySQL:
安装MySQL程序
配置MySQL服务:系统服务中可以看到
命令行工具
可视化的客户端工具:
Navivat
命令行
SQL语句不区分大小写
连接数据库
mysql -u用户名 -p密码
显示当前服务下的所有数据库
show databases;
切换数据库
use 数据库名;
展示当前数据库下的所有表
show tables;
启动和停止服务:使用的是windows的命令net
启动服务
net start 服务名
停止服务
net stop 服务名
MySQL的数据类型
1)数值
tinyint
smallint
int
bigint
- 与java中的byte、short、int、long一致
float
double
decimal #表示的是精确值——BigDecimal
2)字符串
char 设置长度,有自动补充的功能
varchar
tinytext //不需要指定长度
text
longtext//不需要指定长度
3)时间日期
Date 年月日
Time 时分秒
Datetime 年月日时分秒
Timestamp 时间戳
4)二进制
binary
blob
tinyblob
longblob
SQL语句
DDL
数据定义语言
数据库
-
创建数据库
create database 数据库名;
-
删除数据库
drop database 数据库名;
-
查看数据库
show databases;
-
切换数据库
use 数据库名;
数据表
数据表的曾删改查
-
创建
create table 表名( ## 列、属性 定义类似于Kava定义一个变量 列的名字 数据类型(长度,精度) 约束条件, ···, 列名 数据类型(长度,精度) 约束条件 };
-
查看
查看当前库中所有表show tables;
查看表结构
desc 表名;
-
修改
alter 表明 修改操作; 1)添加字段 alter table 表名 add 字段名 数据类型(长度,精度) 约束; 2)删除字段 alter table 表名 drop 字段名; 3)修改字段 alter table 表名 change 旧字段名 新字段名; alter table 表名 modify 字段名;
-
删除
drop table 表名;
DML
数据管理语言,负责对数据表的增、删、改
数据表:分为列和行
列:字段Filed
行:记录row
增
insert into 表名(字段列表) value/values(值列表);
例如:insert into score(id,name,sex,age,score) value(1,'tom','男',18,90.5);
1)字段列表可以不用写,相当于把每一个都添加
2)字段列表中有些字段可以不写——自增主键、允许空的、默认值的
alter table score modify id int auto_increment;
alter table score modify score double(4,1) not null default 0;
3)批量添加多条记录都放在value/values 后面,每一条使用都好进行分隔。
insert into score (name) value ('James'),('Lucy'),('Merry');
删
delete from 表名 where 条件;
1)当有where子句时,只有符合条件的记录才会被删除。
2)当没有where时,所有记录都会被删除
3)当删除之后,自增主键还会延续之前的值
truncate 表名:将表重构,相当于将表删除,再重新创建。
与delete的区别
1)truncate是重构表,delete是删除记录,如果要删除所有的记录truncate会更快。
2)trancate只能删除所有,delete可以删除部分。
3)truncate自增主键会归零,delete还会沿用之前的值。
4)truncate不能回滚,delete可以回滚。
回滚:
改
数据管理语言
update 表名 set 字段=值 where 条件;
DQL
数据查询语言
查
DCL
数据控制语言
权限
Navicat
查询
简单查询
-
基本语法
select 字段列表 from 表名 where 条件 group by 字段列表 having 条件 order by 字段列表 desc/asc limit m,n
-
最简单的查询
select * from 表名; *:通配符,代表表中所有字段 - 筛选字段: select 字段1,字段2 from 表名; - 字段加别名(as可省略) Select name as '姓名' from 表名;
-
where字句
从表中筛选记录
- 比较运算符 >、>=、<、<=、=、!=、<>
select * from score where age <20;- 逻辑运算符 and、or、not
- 控制判断 is null、is not null
- 模糊查询 like ‘表达式’
%:代表任意个,任意字符
_:代表一个任意的字符- 范围
between …and…
相当于 >=a and <=b- 集合
in (1,2,3,4,5)
not in()
- 分组
- 聚合函数
多条记录在聚合时,会变成一条记录。
聚合函数 | 作用 | 特点 |
---|---|---|
count() | 统计数量 | 字段名【不会计算null】、* 、1 【代表查询结果的第一列,统计时最快】 |
sum() | 求和 | |
avg() | 求平均值 | 忽略null值 |
max() | 求最大值 | |
min() | 求最小值 |
-
分组
根据查询结果中 ,对指定字段值相同的记录,分成一组,合并成一条。distinct:合并相同的字段 group by 字段名1,字段名2; group by 字段的下标;【下标从1开始】
-
分组与聚合函数
对分组后的每一组进行聚合
- having
对分组后的数据进行筛选。
where对分组前的数据进行筛选
where与having的区别
- 语法:where要写在group的前面;having要写在group by的后面。
- 执行时间:where在从表中提取记录时进行执行,在分组之前。Having在groupby
执行之后执行- 聚合函数:where不能使用聚合函数;having可以使用聚合函数。
- 排序order by
让查询结果按照指定的字段或升序或降序进行排列。
order by 排序字段 asc/desc
默认升序
每一个字段的排序规则必须单独指定
排序字段也可以使用字段下标
-
limit
经常用于数据的分页操作limit m;取前m条 limit m,n;//从m开始取,取n条 【m从0开始】
限制数量
子查询
子查询:在一个SQL语句中,包含了另一个Select语句。
增删改查中都可以只用子查询。
- select
select (字段列表) from 表 where …()子查询
查询成绩比jack高的人
select * from score where score >(select score from score where name=''jack);
insert iinto 表名 values(子查询);
insert into 表名(字段列表) select (字段列表) from 表2;
- delete
delete from 表 where …(子查询) - update
update 表名 set 字段=值,字段=值 where …(子查询) - select
-
where 字段 比较运算符 子查询
子查询只可有一个字段 子查询只可有一个结果
-
where in /not in (子查询)
字段中只能有一个字段
-
where exists / not exists (子查询)
存在 select * from score where exists (select * from class where id=score.class_id); 先执行父传下,每筛选一条记录都会单独执行一次子查询,效率会很低 通常可以转换成in或者是not in的。
-
where 字段 比较运算符 any/all(子查询)
any:只需要子查询中的任意一条记录满足比较的运算符,即成立。 all:所有的子查询的记录都要满足比较运算符,才成立。
-
作为表
select * from (子查询) as 别名;
-
作为筛选的字段
select (子查询)
-
拼接
行拼接 union | union all 重复的出现
union:会合并相同的记录
union all:不会合并相同的记录
两者列的数量必须相同
连接查询
多表连查
笛卡尔积
select * from 表1,表2;
内连接
inner join/join
select * from 表1 inner join 表2 on 1.id=2.id;
效果与笛卡尔积是一样的,只有符合连接条件的记录,才会出现在查询的结果中。
外连接
有一个主表,一个从表
主表中的每一条记录,都会出现在查询结果中。
如果主表中的记录,在从表中没有记录,此时将以null进行填充
-
左外连接 left outer join
左表是主表select * from table1 left [outer] join table2 on
-
右外连接 right outer join
右表是主表 -
全外连接 【MySQL中不支持,SQLServer中支持,MySQL中有limit,SQLServer没有,但有top】