@[toc]目录
#一、数据库和SQL语言的定义
#1.数据库的结构
数据库-表-字段的名字和字段的值
#2.SQL语言分类
DML:数据操纵语言,指对数据的操作,CRUD
DDL:数据定义语言,创建库,创建表
DCL:数据控制语言,分配具体操作数据的权限
DQL:数据查询语言,主要是指对数据的查询
#二、常见SQL语句
查询库 : show databases ;
新增库: create database cgb2105 ;
删除库: drop database cgb2105 ;
使用数据库: use cgb2105;
创建表: create table abc ( id int(3), name varchar(10), age int(3) );
查询表: show tables ;
删除表: drop table abc ;
增加表字段 : alter table tb_door add column addr varchar(100) ;
注 : 默认添加在最后 1.如果末尾加first就添加在首位 2.如果末尾加after name就放在name后面
修改表名: rename table person to p;
删除表字段: alter table p drop name ;
修改表字段: alter table p change age id int (age原名,id新名,int 新类型)
描述表: desc tb_door ;
#三、表里记录的常见操作
#1.新增
insert into 表名 values ("字段1的值" ,"字段2的值")
例:insert into tb_door values (10000,"first","010-666888",'bj');
insert into tb_door(name) values('lilei'),('hanmeimei');
#2.删除
delete from 表名
例:delete from tb_door where age<10;
#3.修改
update 表名 set 字段名=字段的新值
例:update tb_door set addr="shanghai" where name='zhangsan';
#4.查询
select 字段名 from 表名
例: select * from tb_door;
#四、六大约束
#1.主键约束
id的值不能重复,不能是null 。primary key
(通常与自动递增auto_increment一起使用,组成逐渐递增)
例:create table a ( id int primary key auto_increment);
#2.非空约束
被约束字段的值不能为空 not null
例:create table a ( name varchar(10) not null)
#3.唯一约束
字段的值不能重复 unique
例:create table a(name varchar(10) unique )
#4.外键约束
把两张表之间的关系,通过两个表的主键来表示
#外键约束
create table tb_user(
id int primary key auto_increment,
name varchar(20),
age int
)
create table tb_user_addr(
user_id int primary key auto_increment,
addr varchar(200) ,
#描述了两张表之间通过哪个字段关联着--外键约束
# 外键 (子表的字段) 参考 主表名称(主表的字段)
foreign key(user_id) references tb_user(id)
)
#5.默认约束
给指定的字段设置默认值 (default 设置默认值)
例:create table h( sex char(3) default '女' );
#6.检查约束
给字段增加检查条件,符合才能操作,不符合不能操作 (check)
例:create table a( age int , check ( age > 0 and age<=150 ) ) ;
#五、Mysql 的基础函数
lower : 全转小写 select dname,lower(dname) from dept;
upper : 全转大写 select dname,upper(dname) from dept;
length : 求长度 select length(dname) from dept;
concat: 拼接串 select concat(dname , 'hello') from dept;
substr: 截取字符串 select substr(dname,2,5) from dept;
replace: 替换字符串 select replace(dname,'a','666') from dept;
ifnull: 对null元素的替换 select ifnull(comm,0) from emp;
round: 对小数四舍五入
ceil: 对小数向上取整
floor: 对小数向下取整 select comm,round(comm),ceil(comm),floor(comm) from emp;
now: 获取当前的年月日时分秒 select now();
year:获取当前日期里的年
mouth-月 day-日 hour-时 minute-分 second-秒
select now(),year(now()),mouth(now()),day(now()),hour(now()),minute(now()),second(now());
转义字符: \ ’ select 'xi \' an' == select “xi ' an”
#六、条件查询
1.distinct :去掉重复结果 where: 用来过滤数据也就是条件( 条件可以用and或者or连接)
例:select distinct dname from dept where deptno=1 and loc='一区';
2.like : 模糊查询 %为占位符
例:select * from dept where dname like '%a%';
3.null : is null / is not null 查询条件为空或者不为空
例:select * from emp where comm is null;
4.between and (条件在什么之间)/ limit (分页)/order by(排序,asc升序默认的,desc降序)
例:select * from emp where sal between 5000 and 10000 order by sal desc limit 2;
5.in: 条件在几个选择之间
例:select * from emp where sal in(3000,5000,7000);
#七、聚合函数
1.max-最大值 min-最小值 sun-求和 avg-平均数 count(*)/count(1)-总数
例:select count(comm), max(sal), min(sal), sum(sal), avg(sal) from emp;
2.group by 分组查询 ,使用having 在分组后的结果上继续添加过滤条件
例: 查询每个部门平均工资大于10000的部门以及它的平均工资
select deptno , avg(sal) from emp group by deptno having avg(sal) >10000;
#八、事务
#1.概述
能保证多条SQL要么全成功要么全失败
4个特性:
原子性:多个SQL处于同一个事务里,要么全成功要么全失败
一致性:保证数据在不同的电脑里是一致的
隔离性:数据库支持并发访问,保证事务间是隔离的,互不影响
持久性:对数据库的操作是永久的
#2.事务的隔离级别
读未提交:性能最好,数据的安全性最差
读提交:Oracle的默认的隔离级别 – 性能较好,安全性较差
可重复读:Mysql的默认的隔离级别 – 性能较差,安全性较好
串行化:安全性最高,但是表级的锁,效率低
#3.事务的处理
begin;#开启事务
insert into dept values(null,'java开发部','北京');
insert into dept values(null,'php开发部','上海');
commit;#提交事务--会对数据库产生持久影响
#rollback;#回滚事务--不会对数据库产生持久影响
#九、索引
#1.概述
好处:给加完索引的列,提高查询效率
坏处:索引本质上就是一张表,如果表的体积太大,比较占内存
主键本身就有索引、
分类:
单值索引(一个索引只包含着一个列)
复合索引(一个索引包含着多个列)
唯一索引(一个索引只包含着一个列,但是要求列的值不能相同)
#2.创建索引
经常被查询的字段建议加索引!!!
1. 创建 普通索引: create index 索引名 on 表名(字段名)
create index dname_index on dept(dname)
2. 查看索引(观察三列:表名/字段名/索引名)
show index from dept
3. 使用索引,按照索引列查的快
explain
select * from dept where dname like '%a%'
4. 创建 唯一索引:alter table 表名 add unique(字段名)
alter table dept add unique(dname)
5. 创建 复合索引:给多个字段加一个索引
alter table dept add index fuhe(dname,loc)
6. 删除 索引 :alter table 表名 drop index 索引名
alter table dept drop index dname_index
注:1.复合索引使用时要遵循最左特性 2.模糊查询,or条件查询 索引失效
#十、视图
#1.概述
本质上就是缓存了 查询的结果,作为一个表体现
#2.使用
视图:把一个查询语句的结果缓存起来存入视图中
好处:提高查询效率
坏处:占用了内存,无法进行SQL优化,当更新了数据时视图也需要时间更新
1. 创建视图 create view 视图名 as SQL语句
create view empView as
select * from emp where ename like '%a%' #把SQL执行的结果存入视图
2. 使用视图,就当做一张表来用
select * from empView
#十一、多表联查
#1.笛卡尔积
通过逗号隔开多个表,写在from后面。where 后连接表之间的关联关系
例:select b.loc from emp a , dept b where a.deptno=b.deptno and a.ename='tony';
#2.表连接
通过join连接多个表,分为内连接和外连接。通过on描述表关系,where后写过滤条件
例:select b.ename from dept d join emp e on d.deptno=e.deptno where d.loc='二区' ;
#3.子查询
把上一次的查询结果,作为条件继续使用(嵌套查询)
例:select * from dept where deptno=(select deptno from emp where ename='tony');