####数据类型
1.整形
2.bite(M)
位字段类型,M指定位数,默认值为1,范围1-64(A)
bit类型存储到mysql中默认表示为ASCII显示
bit(1)约定数据,只能存放0或1,节省空间
3.float(m,d)[unsigned]
m显示长度,d指定小数位数 eg float(4,2):-99.99~99.99
浮点数保存时会自动的四舍五入 eg:99.985—99.99
unsigend 会变成double吗----0-198.99 不会double,超出了位数的表示范围,所以只能变成0-99.99
4.decimal(m,d)[ungined]
mysql推荐使用decimal来表示浮点数
和float的区别 decimal的精度更高,其中float的最大精度表示到小数点的后7位
m的最大位数为65,d的最大为30
5.字符串类型char(L):定长字符串
L是可以存储的长度,单位为字符,最大长度值可以为255
char(2):可以存储两个字符的字符串,中英文都可以。
当存放的数据位数小于定长字符串位数,还是按照定长位数来存储
char(2) :a,还是两个字符
6.varchar(L): 可变长度字符串
L表示字符长度,最大长度65535个字节
verchar(5),'abc’实际存放的就是3个字符(推荐使用)
utf-8一个字符为3个字节,L最大为21844,前面最开始会置成一个字符来存放utf或gbk(数据中没有其他类型的数据)
编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)
要求变长长度不超过35000字节,超过此字节,必须将verchar变成Text
区别:如果存储数据时,数据长度确定都一样,就使用定长字符串,检索效率更高。如果存储数据,数据长度不确定,使用变长字符串,节省磁盘空间
7.日期和时间
datetime:"yyyy-mm-dd HH:ii:ss 8个字节 日期时间类型
date:日期类型:"yyyy-mm-dd "占用3个字节
timestamp时间戳不需要自动插入或修改"yyyy-mm-dd HH:ii:ss" 4个字节,UTC时间,每当数据库中有增加或者更新时,时间戳会自动更新到当前时间
8.enum与set
enum在数据库中表示单选,存储数据时,可以使用从1开始的数据下标开存储 1 …655535整个值的最大为655535
set在数据库中表示多选,插入数据时必须在同一个’ '中存储多个可选项,插入数据必须要在集合中有选项,如果要查找是否有数据,要用到关键字find_in_set(‘要查找的数据项’,对应的set集合)eg:select * from votes where find_in_set(‘登山’, hobby);
####mysql表约束
1.空属性null(默认值)not null
数据库默认字段都允许为空,但是实际开发时,尽量保证字段不能为空,数据为空不能参与运算。(1+null=null,说明如果字段为空,在运算时会发生错误)ID int not null
在规定字段为not null,在做数据插入时,带字段必须插入有效值或者有默认值。
2.默认值default
要是数据经常会出现,可以在数据定义时设置为默认值,也可以和空属性约束当配起来。
3.列描述comment
用于描述字段,会根据创建于巨保存,主要是给其他程序员和DBA阅读。相当于注释,给每个属性值,列入age代表年龄,可以在后面加comment列属性,加以注释
用show create table;来看到描述信息
3.zerofile 自动补零
如果定义某整数列为zerofile约束,该整数列自动变为无符号整形unsigend;
当整数位数不足时,会在前面自动加0
5.主键约束primary key
主键约束,不能重复,不能为空,一张表最多只能有一个主键,主键所在的列一般为整数类型
6.复合主键 primary key(复合属性1,复合属性2,…)
多个字段作为主键
复合键的重复定义,例如(1,1)(1,2),可以插入,属性1的值或属性2的值可以不同,但是组合起来的属性必须不同。
创建表后追加主键:alter table 表名 add primary key(字段列表)
删除主键:alter table 表名 drop primary key;
删除主键后列的属性仍然not null
7.自增长 auto_increment;与主键搭配使用,作为逻辑主键。
表中字段要使用自增长
该字段必须是整数
一张表最多只能有一个自增长
该字段必须至少是索引
以当前表最大值+1,即使最大值被删除过,也以曾经出现的最大值为基础
(例:id为主键,插入id为1,2,再插入10,这时再插入,id为11,将11删除,再插入为12 )
8.唯一键unique
可以解决表中多个字段需要唯一性约束的问题
表中允许多个字段设置为唯一键
唯一键可以为空,NULL可以重复(不唯一),空置不作为唯一键比较
例如学号可以为空,但不能重复
9.外键
foreign key (字段名) references 主表(列名)
foreign key (class_id) references myclass(id) )【学生所在班级对应着班级的编号】
外键用于定义主表和从表关系
外键约束定义在从表上,外键约束对应的主表是有主键约束或唯一键约束
外键所在的列做数据插入时,该数据必须在主表中有
##注释只在代码编写的时候才能看见,其他情况君看不见,但是comment可以通过show table看见
###增删改查
1.增加
insert into table_name [(column[,column…])] values (value [,value…]);
插入的数据必须与字段对应数据类型相同
数值型可以插入数值型字符串’101’
插入的数据大小应在规定范围内
values列出的数据位置必须与规定的位置相对应
日期与字符类型必须包含在单引号中
批量插入 insert into table values(),(),…
增加进阶:若是插入的主键值重复:1.更新操作 insert into table (字段列表) values (要插入的值) on duplicate key update 字段=要插入的值(了解)本质:当主键重复时,先删除已有数据再做插入数据
2.替换操作:replace into table (字段名称)values (值列表)【掌握】 本质:将主键的重复的先删除再做插入 若此时主键不重复,则此时的操作知识简单的插入数据
共性:将主键的重复的先删除再做插入 若此时主键不重复,则此时的操作知识简单的插入数据
9.更新
update table set [字段=值],[字段=值]… [where 语句] [limit n]
update goods set price=20.50;不跟where语句的操作更新的是列属性
**有where属性的更新操作,更新的是行属性 update goods set price=20.50 where id=103; **
** [limit n] 限制更新数量 update goods set price=20.50 limit 2;只会更新从第一行始的前两行 **
10.删除
delete from table [where语句]
删除指定数据
delete from goods whrere id=101;
删除整表数据(慎用)
delete from goods;一行一行的删,速度慢,返回被删除的行数
整表删除
truncate table goods2;把整个表的长度编程0,一次删除所有的表数据,速度更快。
两种都只是删除表的数据,而不删除表的特性结构。drop table删除整个表的结构。
###备份表:轻量级备份表:
1.创建一个和goods相同的表goods2
create table1 goods2 like goods;
2.导入数据
insert into goods2 select *from goods;
####查询
select [distinct] * [要查询的列名… 表名
1.指定查询的某些列
select id,name,math from table;
*表示查询所有列,尽量少用,效率极低。
2.distinct 去重查询
若果结果中有重复行,去掉重复行。
3.select 可以对查询出的结果进行计算。计算结果不会影响原数据。
4.select可以使用as来为结果集取名。
5.select 的where语句(查询过滤)
in()显示在in列表的值 in(100,200)
like:模糊查询
between … and …;查询在某一区间的值,表示闭区间
逻辑操作符
and:多个条件同时成立
or:多个条件任意成立
not;不成立
select name,(chinese+math+english) as ‘总成绩’ from student where ‘总成绩’>200; ERROR
where语句不可以用别名
select name,(chinese+math+english) as ‘总成绩’ from student where (chinese+math+english)>200;
先依据where语句将表做一个区分,所以不能用别名
##删除表中重复记录,重复记录只能保存一份(变态)
1.创建一个与原来表结构完全相同的新表。(create table student2 like student );
2.插入不重复记录
insert into student2 select distinct math,distinct chinese,distinct english ,name ,id from student;*切记不能distinct from table 不起作用
注意在distinct时可能一去重值为空 与not null不服;
3.删除原来的表
drop table student;
4.将不重复的表名修改为原来的表名
alter table student2 rename student;
11.select的order by 子句
1.显示每个部门(deptno)的平均工资(sal)与最高工资
select avg(sal),max(sal),deptno from emp group by deptno;
2.显示每个部门每种岗位的平均工资和最高工资
select avg(sal),max(sal),deptno,job from emp group by deptno,job;
group by 中的,代表了优先级
3.显示平均工资低于2000的工资的部门编号和它的平均工资
select deptno,avg(sal) as dept_sal from emp group by deptno having dept_sal<2000;
having语句只能和group by 语句使用
14.查询日期
select current_data();等等 …,
15.查询当前使用sql的用户
select user();
查看当前使用的数据库
select database();
##例子
1.查询工资高于500或岗位为MANAGER的雇员,同时满足姓名字母为答谢的J
select ename from emp where (sal>500 or job=‘MANAGER’) and ename like ‘J%’;
2.按照部门升序而员工工资降序排序
select * from emp order by deptno,sal desc;
3.显示工资最高的员工姓名和工作岗位和所述部门
select ename,deptno,job from emp where sal>=(select max(sal) from emp);
max等函数不能单独卸载where语句中,只能搭配select语句
3.显示各种岗位的雇员总数和平均工资
select count(*),avg(sal),job from emp group by job;
##多表查询
数据来源于不同的表
1.显示查询员工的姓名、工资(emp)以及所在部门的名字(dept)[有外键关系】
select * from emp,dept;(笛卡尔积)[x]
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno;
2.显示部门编号为10的部门名称,员工姓名及员工工资
select dname,ename,sal from emp,dept where emp.deptno=dept.deptno and emp.deptno(注意要注明是哪个表中的deptno)=10;
2.自连接
自连接是指在同一张表连接查询
显示员工姓名为FORD的上级领导的编号和姓名、
单表自连接查询
select ename,empno from emp where empno=(select mgr(上级编号) from emp where ename=‘FORD’)
单表多表查询【为表起别名】
select leader.ename,leader.empno from emp leader,emp worker 【为表起别名】 where worker.mgr=leader.empno and worker.ename=‘FORD’;
3.子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
3.1单行子查询
子查询只返回一行记录
查找和SMITH同部门的员工
select * from emp where deptno=(select deptno from emp where ename=‘SMITH’);
3.2多行子查询
返回多行记录的子查询
查询和10号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,deptno from emp where job in (select distinct job from emp
where deptno=10) and deptno <> 10;[查出的工作是多种的,job不能用等于】
#####关键字
1.in 只要在子查询的范围中【集合】
2.all
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);
或者all
select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);
3.any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno=30);
或者any
select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);
3.3多列子查询
子查询则是指查询返回多个列数据的子查询语句
查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
select ename from emp where (job,deptno)=(select job,deptno from emp where ename=‘SMITH’) and ename <> ‘SMITH’;
(job,deptno)=(select job,deptno from emp where ename=‘SMITH’) 【顺序不能改变】
3.4在from子句中使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
1.显示高于自己部门平均工资的员工的信息【姓名,平均工资】
select ename,avg_sal from emp, (select avg(sal) as avg_sal,deptno as dt from emp group by deptno) as tmp where emp.deptno=tmp.dt and emp.sal>tmp.avg_sal;
注意在将查询结果当成另一个表起别称时,表中属性名不要重复,要起别称,如deptno要起为dt
3.5 合并查询,合并多个select的执行结果
3.5.1 union
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
将工资大于25000和职位是MANAGER的人找出来
select * from emp where sal>2500 union select * from emp where job =‘MANAGER’
或者
select * from emp where sal>2500 or job =‘MANAGER’;
###表的内连和外连
1.内连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开
发过程中使用的最多的连接查询。
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;【不常用】
等同于
select 字段 from 表1,表2 where 表1。列=表2.列;
2.外连接
2.1 左外连接
两张表查询,以左表为主,左表完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来【以学生表为主】
select name,grade from stu left join exam on stu.id=exam.id;
2.2右外连接
两张表查询,以右表为主,右表完全显示
select 字段名 from 表名1 right join 表名2 on 连接条件
对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来【学生的名字为空,成绩表为主】
select name,grade from stu right join exam on stu.id=exam.id;
所有的左外连接和右外连接都可以互换,把两个表的顺序换一下就可以
索引
select * from 表名 where match(全文索引列名)against (要查询的数据)
2.删除索引
第一种方法-删除主键索引:alter table 表名 drop primary;(删除单个索引)
第三种方法方法: drop index 索引名 on 表名(删除所有索引)
3.创建索引的原则
比较频繁作为查询条件的字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件,比如性别
更新非常频繁的字段不适合作创建索引(频繁改动二叉树的结构,时间来校太大)
不会出现在where子句中的字段不该创建索引
####事务
事务就是一组SQL语句组成,这些语句在逻辑上存在相关性,这一组语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不不相同的
1.开始一个事务
start transaction;
2.创建一个保存点
savepoint 保存点名;
3.回到保存点(根据具体情况)
rollback to 保存点名;
当回滚到先保存点aaa,无法再回滚到后发生的保存点bbb
当事务提交后,无发回滚
4.事务提交commit
5.事务的隔离级别
当我们有多个客户端同时操作数据库的某张表,如何进行隔离操作?MySQL提供了隔离级别。
脏读:是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读:是指在一个事务内,多次读同一数据。**在这个事务还没有结束时,(此事务未提交)**另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)
幻读:
事务A重复读取表中的数据时(此事务未提交)
由于另一个事物B增加或者删除表中的数据别切提交事务造成的,事务A读取到不同数据
事务的隔离级别操作(默认为可重复读)
查看当前的隔离级别: select @@tx_isolation;
设置事务隔离级别(不推荐)
set session transaction ioslation level read uncommitted;
事务的ACID特性
原子性(Atomicity):
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):
事务都是从一个一致性状态到里一个一致性状态,保持系统出在一致性状态
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
隔离性(Isolation):
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库中的数据的修改就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
####视图(简化查询)
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
创建视图create view 视图名 as select语句;
修改了视图,对基表数据有影响
修改了基表,对视图有影响
###视图和表的区别
表要占用磁盘空间,视图不需要
视图不能添加索引
使用视图可以简化查询
视图可以提高安全性
笔试
数据库增删改查。查询!!!!!!!!!!!
(多变查询的常用写法)
知道事务的特性ACID
面试
没有隔离级别会发生的三大现象
熟悉索引,视图用法