一、数据库进入退出:
1.mysql -uroot -p 进入数据库 + 回车
2.exit; 退出数据库
二、数据库相关:
1.show databases; 查询数据库
2.create database db1; 创建一个数据库
3.show create database 数据库名; 查看数据库详情
4.create database 数据库名 character set gbk/utf8; 创建数据库指定字符集
5.drop database 数据库名; 删除数据库 注意!
6.use db1; 使用数据库 唯一没有 database 的语句 m 三表单相关: 操作表之前必须要有一个使用的数据库 1.create table 表名(字段1名字 字段1类型 字段2名字 字段2类型); 创建表 create table person(name varchar(10),age int); (内代表字节数)不给字节默认为noll
show
2.show tables; 查询所有表
3.show create table 表名; 查看表详情
4.1.innodb:(默认)支持数据库的高级操作,如事务,外键等。 2.mysiam:只支持数据库的基础增删改查操作 引擎
5.create table 表名(字段1名字 字段1类型 字段2名字 字段2类型)engine=myisam charset=gbk/utf-8; create table db1 (name varchar(10),age int)engine=myisam charset=gbk; 创建表指定引擎和字符集
6.desc 表单名; 查看表字段信息 desc db1;
7.drop table 表名; 删除表 drop table db1;
8.rename table 原名to新名 修改表名; rename table student to stu;
9.alter table 表名 engine=myisam charset=gbk/utf-8 修改引擎和字符集 alter table stu engine=myisam charset=gbk/utf-8
10.1.最后面格式:alter table 表名 add 字段名 字段类型; 添加表字段 2.最前面格式:alter table 表名 add 字段名 类型 first; 3.某字段名的后面格式:alter table 表名 add 新字段名 类型 after 旧字段名;
11.alter table 表名 drop 字段名; 删除表字段
12.alter table 表名 change 原名 新名 新类型; 修改字段名和类型
13.alter table 表名 modify 字段名 新类型 first/after xxx 修改字段类型和位置
三、插入数据:
1.全表插入格式:insert into 表名 value(值1,值2); insert into db1 value('Tom',30);
2.指定字段格式: insert into 表名(字段名1,字段2)value(值1,值2); insert into db1(name)value('jerry');
3.批量插入: insert into db1 value('aa',10),('bb',20),('cc',30); insert into user(name)value('xxx'),('yyy'),('ccc');
4.插入中文数据: insert into db1 value('刘德华',50); 如果报错执行以下命令: set names gbk;
5.查询数据: select 字段信息 from 表名 where 条件; select name/age/所有 from db1 条件; select from db1 where age<30; 查询年龄小与30的
6.修改数据: update 表名 set 字段名=值 where 条件; update db1 set age=18 where name='刘德华';
7.删除数据: delete from 表名 where 条件; delete from db1 where name='xxx';
四、主键约束: 主键约束:表示数据唯一性的字段为主键 约束:创建表时给表字段添加限制条件 主键约束:限制值唯一且非空 格式:create table t1 (id int primary key,name varchar(10)); insert into t1 values(1,'AAA'); insert into t1 values(1,'BBB');//不能重复 insert into t1 values(null,'CCC');//不能为null
五主键约束+自增: 从历史最大值基础上+1 自增数值只加不减 格式:create table t2(id int primary key auto_increment,name varchar(10)); insert into t2 values(null,'aaa');//1 insert into t2 values(2,'bbb');//2 insert into t2 values(10,'bbb');//10 insert into t2 values(null,'ddd');//11 delete from t2 where id>=10; insert into t2 values(null,'eee');//12
六、注释 comment 格式: create table t3(id int primary key auto_increment comment '这是id',name varchar(10) comment'名字');
七、`的作用用于修饰表名和字段名 可以省略
八、冗余; 由于表设计的不够合理导致出现的大量重复数据成为冗余。通过合理拆分表的形式解决问题。 练习1
创建表: create table emp(id int primary key auto_increment,name varchar(10),age int,gender varchar(5),salary int,dept_id int);
create table dept(id int primary key auto_increment,name varchar(10),parent_id int);
插入数据:
insert into dept values(null,'集团总部',null),(null,'教学研发部',1),(null,'java教研部',2),(null,'市场部',1),(null,'市场A部',4);
insert into emp values(null,'苍老师',18,'男',5000,3),(null ,'小明',19,'女',20000,5);
练习2
创建表:
create table iten(id int primary key auto_increment,name varchar(10),price int,num int,category_id int9);
create table category(id int primary key auto_increment,name varchar(10),parent_id int);
插入数据: insert into category(name,parent_id) valuse('家电',null),('电视机',1),('办公用品',null),('打印机',3);
insert into item values(null,'小米电视',1888,200,2),(null,'惠普打印机',1500,100,4);
九、事务:
事务是数据库中执行同一业务多条SQL语句的工作单元,事务可以保证多条SQL语句全部执行成功或全部执行失败; 和事务相关的SQL:
1.开启事务: begin;
2.提交: commit;将内存中的改动一次性提交到磁盘中。
3.回滚: rollback; 将内存中的改动清除,回滚到正确的点。
验证转账: create table user(id int primary key auto_increment,name varchar(10),money int,status varchar(5));
insert into user values(null,'超人',50,'冻结'),(null,'蝙蝠侠',20000,'正常');
转账SQL: update user set money=money-2000 where id=2 and status='正常';
update user set money=money+2000 where id=1 and status='正常';
有事务保护的情况下 回滚流程:
1.开启事务:begin;
2.蝙蝠侠-2000:update user set money=money-2000 where id=2 and status='正常';
3.此时当前终端查询数据已经发生改变(因为查询到的是内存中的数据),开启另一个终端查询会发现数据并未改变
4.超人+2000 : update user set money=money+2000 where id=1 and status='正常';
5.当判断处有一条执行失败,则需要回滚: --------rollback;
6.有事务保护下提交流程
insert into user values(null,'灭霸',20,'正常'); begin;
update user set money=money-5000 where id=2 and status='正常';
update user set money=money+5000 where id=3 and status='正常'; commit;
保存回滚点:
begin; update user set money=200 where id=3;
savepoint s1; update user set money=400 where id=3;
savepoint s2; update user set money=600 where id=3;
rollback to s2;
10、SQL分类: DDL Date Definition Language 数据定义语言 包括: create,alter,drop,truncate 不支持事务
DML Data Manipulation Language 数据操作语言 包括:insert update delete select(DQL) 支持事务
DQL Data Query Language 数据查询语言 只包括:select
TCL Transaction Control Language 事务控制语言 包括:begin commit rollback savepoint xxx rollback to xxx
DCL Data Control Language 数据控制语言 分配用户权限相关的SQL
11、数据类型:
1.整数: int(m)和bigint(m),m代表显示长度 不足m长度时补零, 需要结合zerofill关键字使用。 create table t_int(id int,age int(10) zerofill); insert into t_int values(1,12); select * from t_int;
2.浮点: double(m,d) m代表总长度 d代表小数长度 超高精度浮点数 decimal(m,d)当涉及超高精度运算时时用。 25.234 M=5 D=3
3.字符串 char(m)固定长度,最大长度255 好处 执行率高 varchar(m)可变长度 随着长度改变 好处 节省资源 最大长度 65535 但是超过255建议使用text text(m)可变长度,最大长度65535
4.日期 date :只能保存年月日 time :只能保存时分秒 datetime:年月日时分秒 最大值:9999-12-31 默认值为null timestamp:事件戳 年月日时分秒 最大值:2038-1-19 默认值为当前系统时间 练习1: create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp); insert into t_date values('2019-05-17',null,null,null); insert into t_date values(null,'16:29:00','2019-05-17 16:30:00',null);
12、导入 sql文件
1.windows系统 把文件放到D盘目录,然后执行:source /文件路径; linuex系统 2.把文件放在桌面,然后执行 : mysql> source /home/soft01/桌面/item_backup.sql;
验证:show tabale;
is null 和 is not null
select ename,sal from emp where mgr is null;
select ename,sal comm from emp where comm is n null;
13.别名 select ename from emp; select ename as '姓名' from emp; select ename '姓名' from emp; select ename 姓名 from emp;
14.比较运算符 > , < , >= , <= , = , != ,<>
select ename,job,sal from emp where sal<=1600
select ename,job,sal from emp where jod='manager'
select ename,deptno from emp where deptno!=23 G
select * from t_item where price=23 G
select title,price from t_item where price!=8443 G
15.去重 distinct 把关键字 distinct 写在需要去重的的字段前面
1.查询员工表有哪些职位job select distinct job from emp;
2.查询员工表部门编号有哪些 select distinct deptno from emp;
16.and 和or 当需要满足一个条件同时满足时使用 and 当多个条件满足一个就行时使用 or
celect from emp where deptno=10 and sal<2000; 查询30号部门或工资大于3000的员工信息 celect from emp where deptno=30 or sal>3000;
17.模糊查询 like %代表0或多个未知字符 _代表单个未知字符
select ename from emp wgere like '%a%';
select ename,sal from emp wgere like '_l%';
select tatle from t_item wgere like '%记事本%';
select ename,sal,job from emp wgere job like '%an%' and sal>1500;
select * from t_item where sell_point like '%赠% and title like '%dell%';
select * from t_item where price<100 and title like '%笔记本%' G;
select * from t_item where image is not null title like '%得力%' G;
select ename,sal from emp where ename not like '%a%';
between x and y
select sal,ename from emp where sal>=2000 and sal<=3000; 查询工资在2000到3000之间的员工和工资(要求包含2000和3000) select sal,ename from emp where between 2000 and 3000;
select title,price from t_item where price between 50 and 100;
select ename,sal from emp where sal not between 1000 and 2000;
in select from emp where sal=800 sal=1300 sal=1500; 查询员工价格为 800 1300 1500 的员工信息 select from emp where in(800,1300,1500);
select title,price from t_item where price in(56,58,89);
select ename,sal from emp where sal not in(3000,5000,1500);
select * from t_item where category_id in(238,917) G;
select title,price from t_item where title like '%得力%' price between 50 and 200;
select ename,sal,mgr from emp where mgr is not null and<2000;
select ename,sal,mgr from emp where comm>0 and mgr is not null;
select distinct job from emp where ename like '%a%' and<3000;
排序 order by
字段名 order by 字段名 asc(升序)默认 /desc(降序)
select ename,sal,mgr from emp order by sal;
10号部门按照工资升降序
select ename,sal from emp where deptno=10 order by sal;
select ename,sal,comm from emp where comm>0 order by comm desc;
select title,price from t_item where price<100 order by price;
多字段排序 ,隔开 在后面在写一个字段
select title,price,category_id from t_item where price<200 order by category_id desc,price;
分页查询 limit 跳过条数,请求条数
select ename,sal from emp order by sal limit 4,2;
select sal from emp order by sal desc limit 0,3;
select title,price from t_item order by price limit 10,5;
select * from emp where deptno=30 order by sal desc limit 0,1;
数值计算 + - * / 7%2 = mod(7,2)
select enaem,sal,5*sal 年终奖 from emp;
select title,price,num,price*num 总价值 from t_item;
select ename,sal+5 加新5 from emp;
日期相关
1.SQL语言中的HelloWorld select 'HelloWorld';
2.获取当前时间 select now();
create table t_date(name varchar(10),birthday datetime); insert into t_date values('刘德华',now());
3.获取当前年月日,当前时分秒 current当前 select curdate(),curtime();
4.从年月日时分秒中提取年月日 和 提取时分秒 select date(now()),time(now());
查询每个商品的创建时间(年月日)和(时 分 秒) select created_time,date(created_time) from t_item;
select created_time,time(created_time) from t_item;
5.从完整的年月日时分秒中提取时间分量
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 ename,extract(year from hiredate) from emp; 查询有员工入职的年份+去重 select distinct ename,extract(year from hiredate) from emp;
6.日期格式化 date_format(时间,格式) %Y四位年 %y俩位年 %m2位月 %c1位年 %d日 %H 24小时 %h 12小时 %i分钟 %s秒 测试:select date_format(now(),'%Y年%c月%d号 %H点%i分%s秒'); 当前时间
7.把非标准时间格式转成标准时间 str_to_date(时间,格式) 测试: select str_to_date("19.04.2019","%d.%m.%Y %H点%i分%s秒");
ifnull() 格式; age = ifnull(x,y)如果为null为y 不为null为x 测试:修改奖金为null的值为0,不为null则不变 update emp set comm=ifnull(comm,0);
聚合函数 对查询多条数据进行统计
:平均值,最大值,最小值,求和,计数
1.平均值avg(字段名) 测试:查询有奖金员工的平均奖金 select avg(comm) from emp where comm>0;
2.最大值max(字段名) 测试:查询20号部门最高工资 select max(sal)from emp where deptno=20;
3.最小值min(字段名) 测试:查询有领导的员工最低工资是多少 select min(sal) from emp where mgr is not null;
4.求和sum(字段名) 测试:查讯20号部门的工资总和 select sun(sal) from emp where deptno=20; 100块钱以内的商品总和 select sun(price) from t_item where price<100;
5.统计数量count(字段名) 测试:查询30号部门有多少人 select count(*) from emp where deptno=30;
字符串相关
1.字符串拼接 concat('s1','s2')='s1s2' 测试:查询,每个员工的姓名工资 工资以元为单位 select ename,concat(sal,'元') from emp;
2.获取字符串长度 char_length(字段名) 测试:查询每个员工的姓名和名字长度 select ename,char_length(ename) from emp;
3.获取字符串出现的位置 instr(str,substr) select instr('abcdefg','d');
4.转大写 upper() lower() select upper('nba'),lower('ABC');
5.截取字符串 从左边截取 select left('abcdefg',2); 从右边截取 select right('abcdefg',2); 自由截取substring(str,位置,长度) select substring('abcdefg',2,3);
6.去空白trim()去俩边不去除中间 select trim(' a b ');
7.重复repeat() select repeat('ab',2);
8.替换replace('abcdefg abc','b','m'); select replace('abcdefg abc','b','m'); 9.反转reverse() select reverse('abc');
数学相关
1.向下取整 floor(num) select floor(3.85);
2.四舍五入 round(num) round(3.8);
3.四舍五入 round(num,m)m代表小数位 select round(23.879,2);
4.非四舍五入 truncate(num,m)m代表小数位 select truncate(23,879,2);
5.随机数 rand() select floor(rand()*6;)
分组group by
格式:group by 字段名n select...from 表名 where ...group by ...order by...limit...;
1.查询每个部门的平均工资 selcet deptno,avg(sal) from emp group by deptno;
2.查询每个部门的最高工资 select job,max(sal) from emp group by job;
3.查询每个部门人数 select deptno,count(_) from emp group by deptno;
4.__查询每个部门的平均工资要求员工工资高于1000 select deptno,avg(sal) from emp where sal>1000 group by deptno;
5.查询每个主管mgr的手下人数 select mgr,count(_) from emp where mgr is not null group by mgr;
多字段分组 group by 字段名,字段名;
select deptno,job,avg(sal) from emp group by deptno,job ;
1.select deptno,count(_),sum(sal) from emp group by deptno order by count(_),sum(sal) desc;
select deptno,count(*) c,sum(sal) s from emp group by deptno order by c,s desc; 2.select deptno,avg(sal),min(sal),max(sal) from emp where sal between 1000 and 3000 group by deptno order by avg(sal);
3.select job,count(*) c,sum(sal),avg(sal) a from emp where mgr is not null group by job order by c desc,a;
书写顺序 select...from 表名 where ...group by ... order by...having...limit...;
having where 写普通条件 having 后面写聚合条件 需配合 group by使用
2.select category_id,avg(price) a from t_item group by category_id having a<100;
3.select category_id,avg(price) a from t_item where category_id in(238,917) group by category_id having a;
4.select deptno,count(*),avg(sal) a from emp group by deptno having a>2000 order by a desc;
5.select deptno,sum(sal),avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000 order by a;
6.select extract(year from hiredate) year,count(*) from emp group by year; 查询平均工资最高的部门编号和平均工资 7.select deptno,avg(sal) a from emp group by deptno order by a desc limit 0,1;
子查询(嵌套查询)
1.查询工资高于平均工资的员工信息 select * from emp where sal>(select avg(sal) from emp);
2.查询员工表中工资最高的员工信息 select * from emp where sal=(select max(sal) from emp);
3查询工资高于20号部门最高工资的员工信息 select * from emp where sal>(select max(sal) from emp where deptno>20);
4.查询jones相同工作的其他员工信息 select * from emp where job=(select job from emp where ename='jones') and ename!='jones';
- select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);
6.select max(HIREdate) from emp where HIREdate=(select max(HIREdate)from emp);
- select * from dept where deptno=(select deptno from emp where ename='king');
- select deptno from emp; select * from dept where deptno in(select distinct deptno from emp);
- select avg(sal) a from emp group by deptno order by a desc limit 0,1;
子查询可以写的位置 1.写在where或having后面 当做查询条件 2.写在创建表的时候 create table emp_10 as (select from emp where deptno=10); 3.写在from后面 当成一张虚拟表 select ename from (select from emp where deptno=10)newtable;
关联查询 同时查询多张表的查询方式称为关联查询 关联查询必须写关联关系,如果不写会得到俩张表的乘积,这个乘积称为笛卡尔积, 工作中千万不要出现这种情况 这是一个错误的查询结果集 1.查询每一个员工的姓名和对应的部门名 select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
等值连接和内连接 1.等值连接:select from A,B where A.x=B.x and A.age>20; 2.内连接:select from A join B on A.x=B.x where A.age>20;
1.查询每一个员工的姓名和对应的部门名(内连接) select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
练习1 select from emp e join dept d on e.deptno=d.deptno where d.loc='new york';
练习2 select d.loc,d.dname from emp e join dept d on e.deptno=d.deptno where e.ename='james';
外连接 :查询一张表的全部和另外一张表的交集 或者俩张表的交集 格式: select *from A left/rigt join B on A.x=B.x where A.age=20;
1.select d.dname,e.ename from emp e right join dept d on e.deptno=d.deptno;
总结:如果查询的数据是俩张表的交集数据使用内连接 如果查询的数据是一张表的全部和另一张表的交集数据使用外连接
表设计 :关联关系 外键 用于建立关系的字段,称为外键
一对一
create table user(id int primary key auto_increment , username varchar(10),password varchar(10)); create table userinfo(user_id int ,nick varchar(10),age int); insert into user values(null,'libai','admin'),(null,'libai','123456');insert into userinfo values(1,'诗仙','38'),(2,'大耳贼','50'); select u.username,ui.nick from user u join userinfo ui on u.id=ui.user_id; 一对多 create table t_dept(id int primary key auto_increment,name varchar(10)); create table t_emp(id int,name varchar(10),dept_id int); insert into t_dept values('null','神仙'),('null','妖怪'); insert into t_emp values(null,'吾空',1),(null,'猪八戒',1),(null,'白骨精',2),(null,'蜘蛛精',2); select e.name,d.name from t_dept d join t_emp e on d.id=e.dept_id;
多对多
表设计 权限管理
create table user(id int,name varchar(10)); create table role(id int,name varchar(10)); create table module(id int,name varchar(10)); create table u_r(uid int, rit int); create table r_m(rid int, mid int);
insert into user values(1,'苍老师'),(2,'传奇弟'); insert into role values(1,'男游客'),(2,'男管理员'),(3,'女会员'),(4,'女管理员'); insert into module values(1,'男浏览'),(2,'男发帖'),(3,'男删贴'),(4,'女浏览'),(5,'女发帖'),(6,'女删贴');
insert into u_r values(1,2),(1,3),(2,4); insert into r_m values(1,1),(2,1),(2,2),(2,3),(3,4),(3,6),(4,4),(4,5),(4,6);
select * from user u join u_r ur on u.id=ur.uid join role r on r.id=ur.rit join r_m rm on r.id=rm.rid join module m on m.id=rm.mid;
- select u.name,r.name from user u join u_r ur on u.id=ur.uid join role r on r.id=ur.rit;
- select u.name,m.name from user u join u_r ur on u.id =ur.uid join r_m rm on ur.rit=rm.rid join module m on m.id=rm.mid;
- select u.name,m.name from user u join u_r ur on u.id =ur.uid join r_m rm on ur.rit=rm.rid join module m on m.id=rm.mid where u.name='苍老师';
- select u.name,m.name from user u join u_r ur on u.id =ur.uid join r_m rm on ur.rit=rm.rid join module m on m.id=rm.mid where m.name='女浏览';
视图
create view 视图名 as (子查询); 创建一个10号部门
create view v_emp_10 as(select * from emp where deptno=10); 创建一个没有工资得员工表视图
create view v_emp_nosal as(select empno,ename,deptno fromemp);
create table t_department( id int auto_increment comment '部门id',name varchar(30) unique not null comment '部门名称', primary key(id) )default charset=utf8;
insert into t_department(name)values('软件研发部'),('人力资源部'),('财务部'),('销售部'),('后勤部');
alter table t_user add column department_id int;
update t_user set department_id=1 where id in (21,28,32); update t_user set department_id=2 where id in (24,25,26); update t_user set department_id=3 where id in (22,27,30); update t_user set department_id=4 where id in (23,29,31);
视图
视图的分类:
- 简单视图: 创建视图的子查询中不包含去重,分组,关联查询,聚合函数的视图称为简单视图,可以对视图中的数据进行增删改查操作
- 复杂视图: 和简单视图相反,只能对视图中的数据进行查询操作
· 创建查询每个部门平均工资,最高工资,最低工资,工资总和,部门人数的视图 create view v_emp_info as (select deptno,avg(sal),max(sal),min(sal),sum(sal),count(*) from emp group by deptno); ####对简单视图进行增删改操作
· 操作方式和table一样 insert into v_emp_10 (empno,ename,deptno)values(10010,'Tom',10); //插入成功 insert into v_emp_10 (empno,ename,deptno)values(10011,'Jerry',20);//数据污染 -数据污染:当往视图中添加一条视图中不可见原表中却可见的数据称为数据污染,可以通过创建视图时添加with check option 解决。 create view v_emp_20 as(select * from emp where deptno=20) with check option; insert into v_emp_20 (empno,ename,deptno)values(10012,'刘备',10);//数据污染失败 insert into v_emp_20 (empno,ename,deptno)values(10012,'刘备',20);//成功!
· 修改和删除只能操作视图中存在的数据 update v_emp_10 set ename='TTT' where ename='Tom';//成功 update v_emp_10 set ename='xxx' where ename='Jerry'; 失败 delete from v_emp_10 where empno=10010; 成功 delete from v_emp_10 where empno=10011; 失败
· 创建或替换视图 create or replace view v_emp_10 as (select ename,sal from emp where deptno=10);
· 删除视图 drop view v_emp_10;
· 别名:创建视图时使用了别名,则对视图操作时只能使用别名 create view v_emp_30 as (select ename name from emp where deptno=30); select ename from v_emp_30; 报错不认识ename 应该用name ###约束
约束: 创建表时给字段添加的限制条件
- 主键约束 primary key
限制主键的值唯一且非空 - 非空约束 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 (u ni que)
限制字段的值不能重复 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 (3);//默认值生效 - 外键约束 foreign key (否恩)
外键:用于建立关系的字段称为外键
添加外键约束的字段值可以为null,可以重复,但是不能是关联表中不存在的数据,如果建立了关系被关联的数据不能先删除,被关联的表不能先删除
测试: create table mydept(id int primary key auto_increment,name varchar(10));
create table myemp(id int primary key
auto_increment,name varchar(10),dept_id int,
constraint fk_dept foreign key(dept_id) 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);//失败 delete from mydept where id=1; //失败 不能先删除 delete from myemp where id=1; //成功 delete from mydept where id=1; //成功 drop table mydept; //失败 被依赖的表不能先删除 drop table myemp; //成功 drop table mydept;//成功 ###索引
windows: source d:/item_backup.sql;.
linux: source /home/soft01/桌面/item_backup.sql;
索引:索引是数据库中提高查询效率的技术,类似于字典的目录
索引的作用:数据会零散的保存在每一个磁盘块中,如果不使用索引,查询数据时会挨个遍历每一个磁盘块查找数据,如果使用了索引,磁盘块会以树桩结构保存,查找数据时能够大大降低访问的磁盘块的数量,从而提高查询效率
有索引就一定好吗? 不是,因为数据量小的话会降低查询效率,所以只针对大量数据访问时才使用索引技术
索引是越多越好吗? 不是,因为索引会占用磁盘空间,只针对查询时频繁使用的字段创建索引
创建索引的格式: create index 索引名 on 表名(字段名(?长度));
- 创建索引前先查询一次 看耗费时间 1.39秒 select * from item2 where title='100';
- 创建索引 create index i_item_title on item2(title);
- 验证 耗费时间0.01秒 select * from item2 where title='100';.
查看索引 如果给表添加主键约束,会自动创建主键的索引
格式: show index from 表名; show index from item2;
删除索引: drop index 索引名 on 表名; drop index i_item_title on item2;
复合索引: 通过多个字段创建索引 create index i_item_title on item2(title,price); show index from item2;//创建了两个索引
总结:
- 索引是数据库中提高查询效率的技术类似于目录
- 因为索引会占用磁盘空间不是越多越好,只针对查询时频繁使用的字段创建索引。
- 数据量越大索引效果越明显,如果数据很少可能会降低查询效率。
事务
· 事务是数据库中执行同一业务多条SQL语句的工作单元,保证多条SQL全部执行成功或全部执行失败
· 相关SQL: 开启事务begin 提交事务commit 回滚事务rollback 保存回滚点savepoint xxx 回滚到某个回滚点rollback to xxx;
· 事务的四大特性,ACID特性, ACID特性是保证事务正确执行的四大基本要素
- Atomicity:原子性,最小不可拆分,保证全部成功或全部失败
- Consistency: 一致性,从一个一致状态到另一个一致状态
- Isolation: 隔离性,多个事务之间互不影响
- Durability: 持久性,事务提交后数据保存到磁盘中持久生效
group_concat()方法 组连接
- 查询每个部门的员工姓名和工资,要求每个部门的数据显示在一行 select deptno,group_concat(ename,':',sal) from emp group by deptno;
- 查询每种工作的员工姓名,要求员工姓名一行显示 select job,group_concat(ename) from emp group by job;
1.建库 create database tedu_store;
2.用库 use tedu_store;
3.建表
create table t_user(
uid int auto_increment comment '用户id',
username varchar(50) unique not null comment '用户名',
password char(32) not null comment '密码',
salt char(36) comment '盐值',
gender int comment '性别,0-女,1-男',
phone varchar(20) comment '手机号码',
email varchar(50) comment '电子邮箱',
avatar varchar(100) comment '头像',
is_delete int comment '是否删除,0-未删除,1-以删除',
created_user varchar(50) comment '创建人',
created_time datetime comment '创建时间',
modified_user varchar(50) comment '最后修改人',
modified_time datetime comment '最后修改时间',
primary key(uid) )
default charset=utf8mb3;