数据库:结构化查询语言
数据类型:
real 浮点型
decimal(m,n) 指定精度的小数 m表示总长度 n表示小数位
char(n)定长字符串 varchar(n)不定长,只要在0-n的长度范围都可以
date日期 time时间
datetime日期+时间
DDL 数据定义语言 创建 删除 修改表结构
DML 增加 删除 更新表数据
DQL 查询数据
sql语言关键字不区分大小写
null表示没有该字段数据 不是代表为0或者空字符串
通常情况下,应该避免允许为null,这样查询的时候速度可以提升
在关系数据库中,关系是通过主键和外键来维护的
主键是指任意两条记录的值都不一样,插入相同主键的两条记录是不被允许的,对于主键的要求,最主要是:记录一旦被插入到表中,主键最好不要再修改。
所以选取主键字段的一个基本原则:不适用任何业务相关的字段作为主键
可以设置联合主键,也就是只要不是所有主键都相同的记录就是被允许的,但是一般情况下,不建议这样做
一对多的关系,通过设置外键约束来实现,但是会降低性能
多对多关系,比如一个老师可以带几个班级,而一个班级可以有多个老师。
多对多的关系可以用多个一对多的关系来实现,就是通过中间表来关联两个一对多的关系,就形成了多对多关系
如果一个列中存在的值几乎各不相同,可以 使用索引来大大提高查询效率,如果值几乎相同,创建索引的必要性越低
主键,数据库会自动为其创建索引,而如果像身份证号这种由于和业务有关,但是同时又有唯一性要求的,就可以用add unique来为其添加唯一性索引。
创建索引与否,对于用户来说没有任何感官的区别,仅仅在数据库查询的时候会自动使用索引而已
基本查询语句:select * from <表名> select表示执行一个查询 表示所有列 from表示从哪个表查询
select查询结果是一个二维表
设置查询条件,select * from 表名 where 条件表达式1 and 表达式2; and代表并 or表示或
not代表非 select * from 表名where not 条件表达式
多条件按照linq表达式进行编写
字符串类型需要用单引号括起来
判断是否相等 =
判断是否不相等 <>
判断相似 name like ‘ab%’ 其中%表示任意字符 类似于
select 列1 别名1,列2,列3 where 条件表达式 可以投影查询并给结果列起别名
select * from 表名 order by 列名 desc 表示结果用列名倒序排序 正序是从小 到大
分页查询 对应的语句就是limit m offset n,结果集中跳过前n个结果然后选取后面的m个
一般对应业务的ui,m= pagesize,n = (pageindex-1)pagesize 在mysql中可以简写成limit m,n,查询效率随着n越来越大,效率会越来越低
聚合函数:
count() 结果集的个数 count()和count(id)都行
sum(列名) 合计值 必须为数值类型
avg()平均值 必须为数值类型
max()某一列最大值 如果字符类型 会返回 排序最后的字符
min()。。。。。。。。。。。。。。。。。。排序最前的字符
多表查询 select * from a,b
行数是a行数 * b行数 列数是a列数 +b列数
连接:确定一个主表,然后将附表中的某几列添加主表中去
select stu.id,stu.name,cla.name from <主表名> inner join<附表名> on stu.classid = cla.id;
这是内连接,表示会返回两个表的交集然后满足条件的行,列是根据select来选择
右连接,返回附表的所有行数,如果有多余的行数,主表没有的,就用null填充
左连接,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
全连接 full outer join返回左右表都存在的记录
修改数据
增删改查
insert into<表名>(列1,列2,列3…) values(值1,值2,值3…)
如果字段有默认值,也可以在上面的列中不出现
字段顺序不用和真正的表结构保持一致,但是值必须和字段顺序一致
可以插入多条数据
insert into<表名>(列1,列2,列3…) values(值1,值2,值3…),(第二条),(第三条),记录与记录之间有逗号
更新数据
UPDATE students SET name=‘大牛’, score=66 WHERE id=1;
UPDATE students SET name=‘小牛’, score=77 WHERE id>=5 AND id<=7;更新多条数据
set后面的语句可以使用表达式,比如score = score +10
删除数据
delete from <表名>where 条件表达式 可以删除多条
删除数据库会把 所有表给删除
数据库-表-行列
插入一条新纪录 如果存在 需要先删除再insert 可以用replace来替换记录 如果replace没有对应id的记录 则会插入新的记录
数据库事务,是指一系列sql语句,用begin开始,用commit结束
数据库事务具有ACID这4个特性:
A:Atomicity,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
D:Durability,持久性,即事务完成后,对数据库数据的修改被持久化存储。
有四种数据库事务的隔离级别,用于隔离多个事务的并发进行,由低到高是
read uncommitted,事务a会读到其他事务b更新的但是未提交的数据,如果事务b更新过了数据后面又回滚了,那么事务a读到的数据就是脏数据,所以也被称为脏读。
read committed,但也会遇到不可重复读的问题。
repeatableRead级别,会遇到幻读的问题,也是mysql的默认级别
serializable 最高级别,所以事务串行进行,但是效率低