DBMS 数据库管理系统-科学有效地管理数据
关系型数据库(SQL):mysql,oracle,SqlServer,SQLlite等
如mysql是关系型数据库,数据存在一张张表中,表和表,行和列来组织管理数据
非关系型数据库(NOSQL=NOT ONLY SQL):Redis,MongoDB
如redis非关系型数据库,对象存储,通过对象的自身属性组织和管理数据
mysql内2种数据库引擎:myisam和innoDB
MyIsam | InnoDB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 表锁(操作数据是锁整张表) | 行锁 |
外键 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大(约为MyIsam2倍) |
MyIsam :节约空间,速度较快
InnoDB:支持事务,安全性高,多表多用户操作
配置环境变量
userpath中添加mysql的bin文件夹
--2.1登录 mysql -uroot -p123456 --2.2查看数据库 show databases; --2.3选择进入某个表 use `表名`;-- 如果表明,字段名是mysql关键字,防止认错要加上 ` ` ps:最好以后都加上 --database changed --2.4 进入表 show tables; --退出 exit;
单行注释 -- 多行注释 /**/
DDL:数据定义语言 define create alter drop DML:数据操作语言 mange 增删改 insert update delete DQL:数据查询语言 query DCL:数据控制语言 control
-- 创建数据库 --if exists 加判断条件防止已存在时创建或不存在时出错 create database[if exists] base; -- 删除数据库 drop database [if exists] base; -- 查看数据库 show databases; -- 使用数据库 use 数据库名 use base; -- --
字段属性解释
属性名 | 内容 | 重点 |
---|---|---|
列名 | 对应java成员变量名 | 下划线隔开,对应java驼峰命名 |
类型/长度 | 字段的数据类型 | 见下表常用类型 |
小数点 | 可保留的小数点位数 | |
非空 not null | 创建字段必须赋值,否则报错 | |
虚拟 | ||
主键 primary key | 唯一主键 | |
自动递增 autoincreament | ||
无符号 unsigned | 选中后值不能为负数 | 针对整数 |
填充零 zerofill | 不足字段设置的长度,值前填充0 | 如字段长度为5,值为3,则为00003 |
字段类型 常用
每张表内必备字段(阿里)
`id` 主键 `version` 乐观锁 `is_delete` 伪删除(改变值) `gmt_create` 创建时间 `gmt_update` 修改时间
CREATE TABLE IF NOT EXISTS `student` ( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码', `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别', `birthday` DATETIME DEFAULT NULL COMMENT '出生日期', `address` VARCHAR(100) DEFAULT NULL COMMENT '住址', `email` VARCHAR(20) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8
6.1 添加(insert)
标准写法 如果不写表的字段,从第一个字段一一匹配 insert into 表名(字段名1,字段名2,....) values (值1,值2,..); 插入多行 insert into 表明 values (值1),(值2); 插入2行 同一个字段的值
6.2 修改(update)
标准写法 update 表 set 字段1=值1,字段2=值2...where 字段=值 批量修改 使用in语句 修改字段n的值为1,2,3的内容 update 表set 字段1=值1,字段2=值2...where 字段n in(n值1,n值2,n值3)
6.3 删除(delete/truncate)
delete 和 truncate区别
相同点:都能删除数据,都不会影响表结构
不同点:truncate清空表数据,自增会归零,重新设置自增列,计数器归零,不会影响事务
delete不会影响自增
标准写法 delete from 表 where 字段n=值n 批量删除 删除字段n的值为1,2,3的内容 delete from 表 where 字段n in (n值1,n值2,n值3) -- truncate关键字删除 完全清空一个数据库表,表的结构和索引约束不会变 truncate 表名
1.查询所有 select * from 表 4.查询选定字段所有的值 select (字段1,字段2,字段3) from 表
去除select语句查询出的结果中重复的数据
select distinct from 表
例如: 查询出的studentResult全部+1
select studentno,studentResult+1 as 加分后 from result
查询数据中心符合条件的值
可用的条件语句
运算符 | 语法 |
---|---|
and && | a and b a && b |
or || | a or b a || b |
not ! | not a ! a |
可用的模糊查询(区间)条件
between and
以上的条件语法都可以出现在select语句中
1.按字段值查询 select * from 表 where 字段=值 2.查询选定字段 select (字段1,字段2,字段3) from 表 where 字段=值 3.与条件查询 select * from 表 where 条件1 and 条件2 4.或条件查询 select * from 表 where 条件1 or 条件2 5.非条件查询 select * from 表 where not 条件1 6.模糊(区间)条件查询 where 字段 between a and b select * from 表 where 字段 between 条件1 and 条件2
where 字段+运算符,对运算符进行匹配,如果匹配上,返回匹配上的结果
可用的运算符:is null,is not null ,between,like,in...
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null,结果为真 |
IS NOT NULL | a is not null | 如果操作符不为null,结果为真 |
BETWEEN | a between b and c | 如果a在b和c之间,结果真 |
LIKE | a like b | 如果a能够匹配b,结果真 |
IN | a in (a1,a2,a3...) | 如果a在a1 a2 a3其中的一个,结果真 |
模糊查询字段的匹配符
like+
%,存在一个或多个
_,仅存在一个
具体值+
in ( 条件1,2,3),查询符合条件的记录
实例:
select * form stu where name like '刘%' --查询以刘字开头的姓名,后面不管有几个字 select * form stu where name like '刘_' --查询以刘字开头的姓名,且后面只有一个字 select * from stu where name like '%刘%' --查询名字中包含刘字的姓名,不管名字有几个字 select * from stu where name like '%刘' --查询以刘字结尾的姓名 select * from stu where name like '_刘' --查询2个字的名字以刘字结尾 select * from stu where name like '_刘_' --查询3个字的名字中间是刘字 select * from stu where no in (1001,1002,1003) --查询学号在01,02,03范围内的记录
创建数据表
dept 部门表
id | name |
---|---|
1 | 法务部 |
2 | 业务部 |
3 | 人事部 |
4 | 财务部 |
5 | 行政部 |
emp 员工表
uid | did | name |
---|---|---|
1 | 1 | 小李 |
2 | 2 | 小王 |
3 | 3 | 小于 |
4 | 4 | 小张 |
5 | 6 | 小赵 |
多表连接查询的形式
1.笛卡尔积 (不常用)
select * from dept,emp;
查询结果,每张表的每一条数据都对应另一张表的每条数据,结果条数为2张表条数之积,没有参考意义
2.内连接 inner join on
-- 一种写法 select * from dept,emp where dept.id=emp.did -- 第二种写法 inner join 内连接 select * from dept inner join emp on dept.id = emp.did
查询结果,查询出2张表内的内容都符合条件的条目,不会出现行政部
3.外连接
3.1 左外连接 left join
查询出左边表全部内容和右边表内符合查询条件的条目
select * from dept left join emp on dept.id=emp.did
查询结果,dept所有内容,包括行政部,右边表内,没有小赵
3.2右外连接 right join
查询出右边表全部内容和左边表内符合查询条件的条目
select * from dept right join emp on dept.id=emp.did
查询结果,dept表内不包括行政部,右边表内,包括小赵
3.3 全外连接(mysql不支持,oracle支持) full join
查询出左边表和右边表全部内容
select * from dept full join emp on dept.id = emp.did
查询结果,2张表内的内容都有
自连接:
一张表拆为2张一样的表,查询父子关系
select a.proname,b.prodname form prod a,prod b where a.prodid=b.prodpid;
排序:order by asc升序,desc降序
语法:order by 字段 asc/desc 默认升序
select stuno from stu order by stuno desc;
分页:limit
(n-1)pageSize,pagesize n 当前页,pagesize 每页条数 (n-1)pageSize 起始页
语法:所有语句语法的最后一条 limit 起始页,分页大小(每页数据条数)
select * from stu order by stu no desc limit 1,5;
本质,在where子句中嵌套一个子查询语句,好处 不用联表查询
子查询由里及外
实例
select stuNo,stuScore,subjectNo form stu where(select subjectNo form subject where subjectname = "科目1")
--数学函数 1.取绝对值 select(值) ABS 2.向上取整 select(值) ceiling 3.向下取整 select(值) floor 4.随机数 select rand(值) -- 5.返回参数的符号 select sign(值) 返回 -1 0 1 --字符串函数 1.字符串长度 select char_length(字符串) 2.合并字符串 select Concat('值1','值2') 3.替换字符串 select insert() 4.转换大小写 select LOWER/UPPER 5.返回第一次出现的字符串的索引 select instr() --相当于java indexof 6.替换整体字符串 select replace() 7.截取字符串 select substr(原字符串,开始截取位置,截取长度) 返回指定的字符串 8.翻转字符串 select reverse
函数名 | 功能 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均数 |
MAX() | 最大值 |
MIN() | 最小值 |
用法:count(指定列)、count(*)、count(1)
都能够统计表中的数据条数
区别:
1.指定列会忽略所有null值
2.count(*)和count(1)不会忽略null值
3.*和1计算所有行数 count(1)常用
实例:
select SUM(stuScore) 总分 from student select AVG(stuScore) 平均分 from student select MAX(stuScore) 最高分 from student select MIN(stuScore) 最低分 from student select count(1) 总条数 from student
通过什么字段来分组
有些数据分组后再过滤条件,用having
核心:要么都成功,要么都失败-- 案例 转账
事务四大特性
原子性:要么都成功,要么都失败
一致性:事务前后的数据完整性保持一直
隔离性:多个用户操作一行数据,为每个用户开启单独事务,互不影响*
持久性:事务一旦提交,不可逆转,没提交,还是原来的数据
*隔离性出现问题的情况:
脏读:
不可重复读:
虚读:
mysql默认开启事务自动提交
SET AUTOCOMMIT=0 关闭 SET AUTOCOMMIT=1 开启
手动处理事务
-- 标记事务开始 START TRANSATION -- 以下作为事务组内内容 insert... insert... -- 如果事务长,可以中间设置保存点 savepoint 保存点名 --事务提交 COMMIT --事务回滚 ROLLBACK --事务结束
索引是数据结构 通过索引可以更快获取数据