Sql(sublime text )

####数据类型
1.整形

  • **tinyint (-127-128) **
  • **unsigned (0-255)1-2=-1,会变成bigint型,很大的数
    所以不要使用无符号整形 **

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 子句

  • 对查询结果集排序,默认为升序
  • **order by写在select 末尾
  • select column1,column2,… from table where 条件order by column asc|desc,…;
  • select name,(math+english+chinese) as ‘总成绩’ from student order by 总成绩 desc; 所以order by 可以用别称
    查询所有姓渣同学的总成绩,并按总成绩降序排列
    select (math+chinses+englisn),name as ‘total’ from student where name like ‘渣%’ order by total desc;
    12.select的limit分页查询(默认从0开始)
  • select 字段 from 表名 where 条件 limit 起始位置 (是指数据的起始位置),记录条数
  • select 字段 from 表名 where 条件 limit 记录条数 offset 起始位置
    查询所有学生的信息,每页展示3个,查询第一页;通常用于页数相关。
    select * from student limit 0,3;展示第一页
    select * from student limit 2,3;展示第二页
    13、聚合函数
    1.count函数(相当于printf)
    select count(*) |count(列名) from table where 条件
  • **count函数返回某一列的个数(表中的记录数)
    统计班级人数
    select count() from student;
    统计一个班级数学及格人数
    select count(
    ) frrom student where math >=60;
    count(*)【返回总行数】会统计为null的情况,count(列名)会自动去空
    2.sum()函数返回满足where条件的行的和
    select sum(列名), [sum(列名)…] from table [where 条件]
    统计一个班数学,英语,语文总成绩
    select sum(math) ,sum(english),sum(chinese) from tudent;
    统计班级的语文平均分
    select sum(math)/count(*) from student;[x][此时math为空]
    select sum(math)/count(math) from student;[][此时math为空]
    3.agv()函数返回满足where条件的一列的平均值
    select avg(math) from student;
    去空求职
    4.max/min函数返回满足where条件的一列的最大/最小值
    求班级最高、最低分的学生的姓名和总成绩
    select max(chinese+math+english) min(chinese+math+english) from student;
    5.在select中使用group by 子句可以对指定列进行分组查询
    select 列名 from table group 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;
所有的左外连接和右外连接都可以互换,把两个表的顺序换一下就可以


索引

  • 主键索引(primary_key),字段不能重复
    一张表有且只有一个主键,主键索引的效率最高。
    一般int列作为主键(逻辑主键)
    一般和自增(auto_increment)搭配起来使用
  • 唯一索引(unique),字段不能重复
    表中可以有多个,查询效率仅此于主键索引,允许为null,并且null不作为判断。
  • 普通索引(index)
    允许字段重复,表中允许多个字段添加普通索引,查询效率低于唯一索引,select *from table where empno=1999900;
    添加了索引后,将empno转化了二叉树形式红黑树,使得查找次数大幅度减少(常数级)–必须查找条件用到了普通索引
    alter table 表名 add index(作为普通索引列)
  • 全文索引
    主要针对Text类型,大文本搜索
    mysql5.6以前只有MyISAM引擎支持全文索引,5.6以后InnoDB也支持全文索引。
    默认只支持英文。
    用explain查询语句中的相关信息

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
面试
没有隔离级别会发生的三大现象
熟悉索引,视图用法

你可能感兴趣的:(Sql(sublime text ))