-- 数据库相关--------------------------------------------------->
-- 查询所有数据库
show databases;
-- 创建数据库
create database table_test;
-- 创建数据库指定字符集
create database table_test1 character set utf8;
create database table_test1 character set gbk;
-- 查看数据库详情
show create database table_test;
-- 使用数据库
use table_test;
-- 删除数据库
drop database table_test1;
-- 表相关----------------------------------------------------->
-- 创建表
create table person1(name varchar(50),age int);
-- 表引擎
-- innodb(默认):支持数据库的高级操作(外键,事务等)
-- myisam:不支持数据的高级操作,只支持基本的数据增删改查操作
-- 创建表,设置引擎
create table t1(name varchar(10),age int) engine=myisam charset=gbk;
-- 修改字符集和表引擎
alter table 表名 engine=innodb/myisam charset=utf8/gbk;
alter table emp engine=myisam charset=gbk;
-- 修改表名称
rename table person1 to ttt;
-- 查看所有表
show tables;
-- 查看表详情
show create table person
-- 查看表字段
desc person;
-- 给表添加字段
-- 最后添加:
alter table emp add gender varchar(10);
-- 最前面添加:
alter table emp add map varchar(10) first;
-- xxx的后面:
alter table emp add hhh varchar(10) after name;
-- 修改字段名和类型
alter table emp change sal salary int;
-- 修改字段类型和位置
alter table emp modify hhh int first;
alter table emp modify name_hh varchar (10) after hhh;
-- 删除表字段
alter table emp drop gender;
-- 删除表
drop table t1;
-- 删除并创建新表
truncate table t1;
-- 数据相关----------------------------------------------->
-- 添加数据
-- 全表插入格式:一定要和表字段一致
create table user(id int,name varchar(10));
insert into user values(2,'网黑');
-- 指定字段插入格式:
insert into user(id) values(2);
-- 批量插入
insert into user(id,name)values(3,'nhao'),(4,'zhouyu')
查询数据相关-------------------------------------------------------------------------->
-- 查询结构
-- select ..... from .... where .... group by .... having .... order by ..... limit ....;
-- 查询数据
select * from user;
-- 修改数据
update user set name='table' where id=2;
-- 删除数据
delete from user where id=2;
-- 子查询-------------------------------------------嵌套查询
-- 可以嵌套无数层:子查询可写的位置:
-- 把子查询写在where或having的后面,当成查询条件的值
select max(sal) from emp; 5000
select * from emp where sal=(select max(sal) from emp);
-- 写在创建表的时候
create table emp_20 as (select * from emp where deptno=20);
-- 写在from后面,当成一张虚拟的表 必须有别名
select ename from (select * from emp where deptno=20) newtable;
-- 关联查询----------------------------------------------------->
-- 同时查询多张表的数据的查询方式称为关联查询
-- 如果关联查询不写关联关系会得到两张表数据的乘积,这种乘积称为笛卡尔积。
-- 笛卡尔积是一种错误的查询结果会占用大量的内存,工作中切记不要出现。
-- 查询方式有三种:等值连接、内连接、外连接
-- 如果查询的数据是两张表的交集数据使用等值或内连接(推荐)
-- 如果查询的数据是一张表的全部数据和另外一张表的交集数据使用外连接
-- 查询每一个员工的员工姓名和对应的部门名称
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
-- 查询在new york工作的员工姓名
select e.ename from emp e,dept d where e.deptno=d.deptno and d.loc='new york';
-- 等值连接和内连接-----------------
-- 等值连接和内连接查询到的是一样的结果,为两张表的交集数据
-- 等值连接:
select * from A,B where A.x=B.x and A.age=18;
-- 内连接:
select * from A [inner] join B on A.x=B.x where A.age=18;
-- 查询每一个员工的员工姓名和对应的部门名称
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
-- 外连接
-- 外连接查询到的是一张表的全部数据和另外一张表的交集数据
select * from A left/right [outer] join B on A.x=B.x where A.age=18;
-- 查询所有的部门名和其对应的员工名
select d.dname,e.ename from emp e right join dept d on e.deptno=d.deptno;
-- 设置主键自增>从最大处开始增加
create table t2(id int primary key auto_increment,name varchar(10));
-- 给表字段添加注释
create table t3(id int primary key auto_increment comment '这是个主键',name varchar(10) comment '这是名字呵呵');
-- 查看注释
show create table t3;
-- `符号的作用
-- ?用于修饰表名和字段名 可以省略,但不要和单引号搞混
? create table?t4(name?varchar(10));
-- 事务相关------------------------------->
-- 开启事务 begin
-- 提交事务 commit
-- 回滚事务 rollback
-- 保存回滚点 savepoint xxx;
-- 回滚到指定回滚点 rollback to xxx;
-- 先开启事务
Begin;
-- 执行语句
update user set money=1000 where id=1;
-- 保存回滚点
savepoint s1;
-- 执行语句
update user set money=2000 where id=1;?
-- 设置保存回滚点
savepoint s2;?
-- 回滚到指定回滚点
rollback to s1;
-- 面包屑相关-----------------------------------------------------------------------------
-- SQL语句中出现中文报错 该错误 由于终端的编码字符集和数据库服务器解码的字符集不一致导致 通过以下命令统一字符集
set names gbk;
-- truncate 清空主键自增
-- 创建表设置主键自增,然后清0
create table t5(id int primary key auto_increment,name varchar(10));
truncate table t5;
-- is null 和 is not null
select * from t5 where id is not null;
-- 别名
select id as '姓名' from hhhh;
select id 'ID' from hhhh;
select id 嘿嘿 from hhhh;
-- 查询时去掉重复的数据 distinct
select distinct deptno from emp;
create table test(id int,name varchar(10));
insert into test values(1,'111'),(2,'111'),(3,'333');
select distinct name from test
-- 模糊查询like
select name from test where name like '%1%' ;
-- 查询在两者之间 between x and y 包含xy
select name from test where name between 1 and 112;
-- in的用法
select name from test where id in (1,2)
-- 排序
-- order by 字段名 asc/desc;
select ename,sal from emp order by sal;
-- 分组查询group by 分组字段名
select deptno,avg(sal) from emp group by deptno;
-- 分页
limit 跳过的条数,请求的条数 limit (页数-1)*条数,条数
select * from emp order by sal desc limit 0,5;
-- group_concat() 组连接
-- 查询每个部门的员工姓名和对应的工资,要求一个部门的信息显示到一行
-- 10 张三:3000 李四:4000
-- 20 王五:5000 赵六:6000
select deptno,group_concat(ename,'-',sal) from emp group by deptno;
-- 数值计算 + - * / % 7%2 和 mod(7,2)
-- 查询员工姓名,工资和年终奖(年终奖=工资5)
select ename,sal,sal5 年终奖 from emp;
-- 查询商品表中每个商品的单价,库存和总金额(单价库存)
select price,num,pricenum 总金额 from t_item;
-- 查询每个员工涨薪5块钱之后的工资
select sal,sal+5 涨薪后 from emp;
-- ifnull()函数
-- age = ifnull(x,y) 如果x值为null则age=y 不为null age=x
select stu.*,IFNULL(score.english_score,0) from tbl_student stu,tbl_score score where 1=1 and stu.stu_id=score.stu_id
-- 聚合函数
-- 对多条数据进行统计查询 平均值、最大值、最小值、求和、统计数量
-- 平均值 avg(字段名)
-- 最大值 max(字段名)
-- 最小值 min(字段名)
-- 求和 sum(字段名)
-- 统计数量 count(字段名)
-- having聚合函数的条件写在having后面
select deptno,avg(sal) a from emp where a>2000 group by deptno; select deptno,avg(sal) a from emp group by deptno having a>2000;
-- 数学函数相关
-- 向下取整 floor(num)
select floor(3.8);
-- 四舍五入 round(num)
select round(23.8);
-- 四舍五入 round(num,m) m代表小数位数
select round(23.879,2);
-- 非四舍五入 truncate(num,m) m代表小数位数
select truncate(23.879,2);
-- 随机数 rand() 0-1随机数
select rand();
-- 3-5的随机整数 3,4,5 0-2+2
select floor(rand()*3+3);
-- 字符串相关----------------------------------------------------
-- 字符串拼接 concat(s1,s2)
-- select ename,concat(sal,'元') from emp;
-- 获取字符串的字符长度 char_length(str)
select ename,char_length(ename) from emp;
-- 获取字符串在另外一个字符串中出现的位置
instr(str,substr) select instr('abcdefg','d');
locate(substr,str) select locate('d','abcdefg');
-- 转大写 转小写
select upper('nba'),lower('AbC');
-- 截取字符串
-- 左边截取:
left(str,count); select left("abcdefg",2);
-- 右边截取:
right(str,count); select right("abcdefg",2);
-- 自由截取:
substring(str,start,length?); select substring("abcdefg",2); select substring("abcdefg",2,3);
-- 去空白:
trim(str) select trim(" a b ");
-- 重复
repeat(str,count) select repeat('ab',2);
-- 替换
replace(str,old,new) select replace('abc abc','c','m');
-- 反转
reverse(str) select reverse("abc");
-- 日期相关函数-------------------------------------------------->
-- 获取当前的系统时间(年月日时分秒)
select now();
-- 获取当前的年月日
select curdate();
-- 获取当前的时分秒
select curtime();
-- 从年月日时分秒中提取年月日 和 提取时分秒
select date(now());
select time(now());
select time(birthday) from user;
-- 查询商品表中每个商品上传年月日
select date(createdtime) from titem;
-- 查询商品表中每个商品上传时分秒
select time(createdtime) from titem;
-- 提取时间分量
extract select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());
-- 查询每个员工入职的年份
select extract(year from hiredate) from emp;
-- 日期格式化
-- date_format(时间,格式) %Y 四位年 2019 %y 2位年 19 %m 两位月 03 %c 1位月 3 %d 日 %H 24小时 %h 12小时 %i 分钟 %s 秒
-- 把now()转换成转成 2019年03月21号 15点34分00秒
select date_format(now(),'%Y年%m月%d号 %H点%i分%s秒');
-- 把非标准时间格式转成标准格式 strtodate(非标准字符串时间,格式)
-- 把 21.03.2019 15:41:30 转成标准时间格式
select strtodate("21.03.2019 15:41:30","%d.%m.%Y %H:%i:%s");
-- current这是游标里面用的,表示当前游标指向的记录前
-- 定位到结果集中的某一行。
-- 对当前位置的数据进行读写。
-- 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
-- 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。
-- 视图view-------------------------------------------------------------->
-- 什么是视图:数据库中表和视图都是其内部的对象,视图可以理解成一张虚拟的表,
-- 数据来自原表,视图本质其实就是取代了一段SQL查询语句
-- 为什么使用视图:视图可以起到SQL重用的作用,提高开发效率。可以隐藏敏感信息
-- 格式: create view 视图名 as (子查询)
-- 创建一个10号部门的视图
create view emp10 as (select * from emp where deptno=10);
create table emp20 as (select * from emp where deptno=10);
-- 创建一个没有工资的员工表
create view vempnosal as (select empno,ename,job,mgr,comm from emp);
-- 创建一个显示每个部门平均工资、最高工资、最低工资、工资总和、部门人数的视图
create view vempinfo as (select deptno,avg(sal),max(sal),min(sal),sum(sal),count(*) from emp group by deptno);
-- 对简单视图进行增删改操作
-- 插入数据
insert into emp10 (empno,ename,deptno) values(10010,'Tom',10);
insert into emp10 (empno,ename,deptno) values(10011,'Jerry',20);
-- 数据污染:往视图中插入一条视图中不可见,但是在原表中可见的数据称为数据污染
-- 如果不希望出现数据污染可以使用with check option 解决
create view vemp30 as (select * from emp where deptno=30) with check option;
insert into vemp30 (empno,ename,deptno) values(10012,'Lily',30);//成功
insert into vemp30 (empno,ename,deptno) values(10013,'Lucy',10);//失败 数据污染
-- 修改和删除
-- 只能对视图中存在的数据进行操作
delete from vemp30 where deptno=10; //不会有数据被删除
delete from vemp30 where ename='Lily'; //删除成功
update emp10 set ename='abc' where empno=10010;//修改成功
update emp10 set ename='abc' where empno=10011;//修改失败 视图中不存在
-- 修改视图
create or replace view 视图名 as (子查询);
create or replace view vemp30 as (select * from emp where deptno=30 and comm>0);
-- 删除视图
-- 格式: drop view 视图名;
drop view vemp30;
-- 视图别名
-- 如果创建视图的子查询中使用了别名,那么对视图进行操作时只能使用别名
create view vemp30 as (select ename name,deptno from emp where deptno=30);
delete from vemp30 where ename='xxx'; //报错 不认识ename
-- SQL分类
-- DDL数据定义语言 create drop alter truncate 不支持事务
-- DML数据操作语言 insert update delete select 支持事务
-- DQL数据查询语言 select
-- TCL事务控制语言 begin commit rollback savepoint xxx , rollback to xxx;
-- DCL数据控制语言 分配用户权限相关SQL
-- 约束----------------------------------------------------------------------------
-- 非空约束 not null
-- 值不能为 null
create table t1(id int,age int not null);
insert into t1 values(1,20);//成功
insert into t1 values(2,null); //失败
-- 唯一约束 unique
-- 值不能重复
create table t2(id int,age int unique);
insert into t2 values(1,20);//成功
insert into t2 values(2,20);//失败
-- 默认约束 default
-- 设置默认值
create table t3(id int,age int default 20);
insert into t3 values(1,10);
insert into t3 values(2,null);
insert into t3 (id) values(2); //默认值生效
-- 主键约束 primary key唯一且非空
-- 外键约束
-- 外键:用来建立关系的字段称为外键
-- 外键约束:值可以为null,可以重复,但不能是关系表中不存在的数据,如果建立好关系后 被依赖的数据不能先删除,被依赖的表不能先删除
-- 如何使用:
-- 创建部门表
create table mydept(id int primary key auto_increment,name varchar(10));
-- 创建员工表
create table myemp(id int primary key autoincrement,name varchar(10),deptid int,constraint fkdept foreign key(deptid) references mydept(id));
-- 格式介绍: constraint 约束名 foreign key(外键字段名) references 被依赖的表名(被依赖的字段名)
-- 插入数据
insert into mydept values(null,'神仙'),(null,'妖怪');
-- 测试:
insert into myemp values(null,'悟空',1); //成功
insert into myemp values(null,'赛亚人',3);//失败 不存在3
delete from mydept where id=1; //失败 数据被依赖
drop table mydept; //失败 表被依赖
drop table myemp; //成功
drop table mydept; //成功 没有被依赖
-- 外键约束工作中除非特定场景 一般使用外键的机会较少,因为添加外键后影响测试效率
-- 多对多关联---------------------------->
create table teacher(id int primary key autoincrement,name varchar(10));
create table student(id int primary key autoincrement,name varchar(10));
create table t_s(tid int,sid int);
insert into teacher values(null,'苍老师'),(null,'传奇哥');
insert into student values(null,'小明'),(null,'小红'),(null,'小黄'),(null,'小绿');
insert into t_s values(1,1),(1,2),(1,3),(2,1),(2,4);
-- 索引------------------------------------------------------------------
-- 索引是越多越好吗? 不是,因为索引会占用存储空间,只针对常用的查询字段创建索引
-- 创建索引格式:
-- create index 索引名 on 表名(字段(字段长度));
select * from item2 where title='100'; //耗费1.06秒
-- 通过title字段创建索引
create index iitemtitle on item2(title);
-- 再次测试查询速度
select * from item2 where title='100'; //耗费0.02秒
-- 如何查看索引
show index from item2;
-- 删除索引
-- drop index 索引名 on 表名;
drop index iitemtitle on item2;
-- 复合索引 通过多个字段创建的索引
create index iitemtitle_price on item2(title,price);
-- 索引总结
-- 索引是用来提高查询效率的技术,类似目录
-- 因为索引会占用磁盘空间索引不是越多越好,只针对常用的查询字段创建索引
-- 如果数据量小添加索引会降低查询效率,所以不是有索引就一定好
-- 数据类型
-- 整数类型
-- 常用:int(m)和bigint(m) m代表的是显示长度 需要结合zerofill关键字使用
create table tint(id int,age int(10) zerofill);
insert into tint values(1,18);
-- 浮点数
-- 常用:double(m,d) m代表总长度 d代表小数长度 78.386 m=5 d=3
-- decimal(m,d) 超高精度浮点数 当超高精度运算时使用
-- 字符串
-- 常用: char(m) 不可变长度 最大长度255 ,
-- varchar(m) 可变长度 节省资源 最大长度为65535
-- 长度超过255建议使用text text(m)可变长度 最大长度65535
-- 日期
-- date:只能保存年月日
-- time:只能保存时分秒
-- datetime:年月日时分秒,默认值为null,最大值9999-12-31
-- timestamp:时间戳,年月日时分秒,默认值为当前系统时间,最大时间2038-1-19
create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);
insert into t_date values('2019-03-20',null,null,null);
insert into t_date values(null,'16:33:30','2019-03-22 15:00:05',null);