索引
添加主键索引
alter table table_name add primary key(所有字段)
添加唯一索引
alter table table_name add unique index_name(索引字段)
添加单值索引
alter table table_name add index index_name(索引字段)
添加复合索引
alter table table_name add index index_name(字段a,字段b...)
添加全文索引
alter table table_name add fulltext index_name(索引字段)
查看表的索引
show index from table_name
查询语法
查看表结构
desc table_name
查询表数据
select * from table_name
去重查询
select distinct field_name from table_name
条件查询
select * from table_name where field_name =10 (=,<>,>=,<=)
select * from table_name where field_name is (not) null 字段非空条件查询
select * from table_name where field_name in ("a","b") in模糊查询
select * from table_name where field_name like '_A%' _代表一个字母,%代表0个或多个字母. 如果查询%
结果排序查询
select * from table_name order by field_name desc (默认:asc):根据字段降序查询
计数查询
select count(distinct field_name) from table_name
结果分组查询
select deptno,avg(sal) from emp group by deptno 求每个部门的平均薪水.
对分组结果筛选(Where是对单条纪录进行筛选,Having是对分组结果进行筛选)
select avg(sal),deptno from emp where sal>1200 group by deptno having avg(sal)>1500 order by avg(sal) desc; 查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.
表连接方式
select * from emp e1 left join emp e2 on(e1.mgr =e2.empno) 左外连接:会把左边这张表多余数据显示出来。
select ename,dname from emp e right join dept d on(e.deptno =d.deptno); 右外连接:
inner join : on 条件同时过滤两张表
full join : 都不过滤
on:针对的是两表连接条件过滤 where:针对的是中间表过滤
case when:
对字段值判断并按照自定义规则生成新的字段,用于转义,统计
case sex when 0 then '女' else '男' end) as '性别'
case when score>=90 then '优' when score>=80 then '良' when score>=60 then '及格' else '不及格' end as '等级'
常用sql
清空表数据,保留表结构
truncate table table_name
增加表字段
alter table table_name add `column _name` varchar(64) comment '这里是注释内容'
删除表字段
alter table table_name drop column `createTime` --符号不能错
修改表字段
alter table table_name MODIFY column_name VARCHAR(32) comment '这里是注释内容'
展示数据库所有函数
show function status
查看函数详细信息
show create function func_name
判断表是否存在
SELECT table_name FROM information_schema.TABLES WHERE table_name =''
表中插入数据
insert into 表名 列名 values(expr|default...);
存储过程
前言:
存储过程:一堆SQL的合并。中间加了点逻辑控制。
一次调用完成一系列sql操作,不需要多次连接数据库。
强烈不建议
1.维护性差
2.本身并不能提高查询效率,数据量的逻辑尽量还是放在内存合理
场景使用
1.生成测试数据
展示数据库所有存储过程
show procedure status
查看存储过程详细信息
show create procedure proc_name
创建存储过程
DELIMITER $
CREATE PROCEDURE procedure_name() --存储过程名称(参数列表)
BEGIN
--多条sql + 流程控制
END $
调用存储过程
call procedure_name() --call 存储过程名称(参数)
存储过程参数种类
IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,两者结合
删除存储过程
drop procedure procedure_name;
生成大批量表数据的例子:
生成 INT 条 name 100~1000 power 10000~100000..的数据
delimiter $$
create procedure add_hero_data(size INT)
begin
START TRANSACTION;
SET @id=0;
WHILE @id<size DO
SET @name= CEILING(RAND()*900+100);
SET @power= CEILING(RAND()*90000+10000);
SET @agile= CEILING(RAND()*90000+10000);
INSERT INTO weitao.t_hero(name, power,agile)
VALUES(@name,@power,@agile);
SET @id=@id+1;
end while ;
COMMIT;
end$$
函数
select substr(field_name,2,3) from table_name ;从第二字符截,一共截三个字符.
select sysdate from dual; 获取系统当前时间
select to_char(sysdate,'yyyy-mm-dd') from dual 转换为固定格式字符串
select to_date('2012-07-26','yyyy-mm-dd') from dual 固定格式字符串转换为data
Group function 组函数(max,min,avg ,count,sum函数)