@[toc]目录
一、数据库和SQL语言的定义
1.数据库的结构
2.SQL语言分类
二、常见SQL语句
三、表里记录的常见操作
1.新增
2.删除
3.修改
4.查询
四、六大约束
1.主键约束
2.非空约束
3.唯一约束
4.外键约束
5.默认约束
6.检查约束
五、Mysql 的基础函数
六、条件查询
七、聚合函数
八、事务
1.概述
2.事务的隔离级别
3.事务的处理
九、索引
1.概述
2.创建索引
十、视图
1.概述
2.使用
十一、多表联查
1.笛卡尔积
2.表连接
3.子查询
数据库-表-字段的名字和字段的值
DML:数据操纵语言,指对数据的操作,CRUD
DDL:数据定义语言,创建库,创建表
DCL:数据控制语言,分配具体操作数据的权限
DQL:数据查询语言,主要是指对数据的查询
查询库 : 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 ;
insert into 表名 values ("字段1的值" ,"字段2的值")
例:insert into tb_door values (10000,"first","010-666888",'bj');
insert into tb_door(name) values('lilei'),('hanmeimei');
delete from 表名
例:delete from tb_door where age<10;
update 表名 set 字段名=字段的新值
例:update tb_door set addr="shanghai" where name='zhangsan';
select 字段名 from 表名
例: select * from tb_door;
id的值不能重复,不能是null 。primary key
(通常与自动递增auto_increment一起使用,组成逐渐递增)
例:create table a ( id int primary key auto_increment);
被约束字段的值不能为空 not null
例:create table a ( name varchar(10) not null)
字段的值不能重复 unique
例:create table a(name varchar(10) unique )
把两张表之间的关系,通过两个表的主键来表示
#外键约束 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) )
给指定的字段设置默认值 (default 设置默认值)
例:create table h( sex char(3) default '女' );
给字段增加检查条件,符合才能操作,不符合不能操作 (check)
例:create table a( age int , check ( age > 0 and age<=150 ) ) ;
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;
能保证多条SQL要么全成功要么全失败
4个特性:
原子性:多个SQL处于同一个事务里,要么全成功要么全失败
一致性:保证数据在不同的电脑里是一致的
隔离性:数据库支持并发访问,保证事务间是隔离的,互不影响
持久性:对数据库的操作是永久的
读未提交:性能最好,数据的安全性最差
读提交:Oracle的默认的隔离级别 – 性能较好,安全性较差
可重复读:Mysql的默认的隔离级别 – 性能较差,安全性较好
串行化:安全性最高,但是表级的锁,效率低
begin;#开启事务 insert into dept values(null,'java开发部','北京'); insert into dept values(null,'php开发部','上海'); commit;#提交事务--会对数据库产生持久影响 #rollback;#回滚事务--不会对数据库产生持久影响
好处:给加完索引的列,提高查询效率 坏处:索引本质上就是一张表,如果表的体积太大,比较占内存 主键本身就有索引、 分类: 单值索引(一个索引只包含着一个列) 复合索引(一个索引包含着多个列) 唯一索引(一个索引只包含着一个列,但是要求列的值不能相同)
经常被查询的字段建议加索引!!! 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条件查询 索引失效
本质上就是缓存了 查询的结果,作为一个表体现
视图:把一个查询语句的结果缓存起来存入视图中 好处:提高查询效率 坏处:占用了内存,无法进行SQL优化,当更新了数据时视图也需要时间更新 1. 创建视图 create view 视图名 as SQL语句 create view empView as select * from emp where ename like '%a%' #把SQL执行的结果存入视图 2. 使用视图,就当做一张表来用 select * from empView
通过逗号隔开多个表,写在from后面。where 后连接表之间的关联关系
例:select b.loc from emp a , dept b where a.deptno=b.deptno and a.ename='tony';
通过join连接多个表,分为内连接和外连接。通过on描述表关系,where后写过滤条件
例:select b.ename from dept d join emp e on d.deptno=e.deptno where d.loc='二区' ;
把上一次的查询结果,作为条件继续使用(嵌套查询)
例:select * from dept where deptno=(select deptno from emp where ename='tony');