1. 针对库的SQL语句
# 增加
create database 库名;# 查看库
show databases;
show create database db1;# 修改库(基本上不用,直接删掉直接创建)
alter database db1 charset='utf8';# 删库跑路
drop database db1;# 不要轻易使用(测试环境随便使用,线上环境一般情况下你是没有权限)
针对表的sql语句
1.创建表的完整语法
create table t1(idint,
name varchar(43),
age int);
create table 库名.表名(
字段名1 数据类型 约束条件 约束条件 约束条件 约束条件,
字段名2 数据类型 约束条件 约束条件 约束条件 约束条件,
字段名3 数据类型 约束条件 约束条件 约束条件 约束条件,
字段名4 数据类型 约束条件 约束条件 约束条件 约束条件,
字段名5 数据类型 约束条件 约束条件 约束条件 约束条件,
字段名6 数据类型 约束条件 约束条件 约束条件 约束条件
);
insert into 库名.t1 values('1',2,3,4,5,6);1. 字段名和数据类型必须写的,不能省略
2. 约束条件是可选的,可有可无,而且可有有多个
3. 表结构中最后一个字段不能有逗号
2. 针对表的SQL语句
"""如何选择库"""
use 库名;
use db1;# 双击db1文件夹了# 增加表
create table 表名 (id 数据类型, name 数据类型, gender 数据类型)
create table t1(idint, name varchar(32), gender varchar(32));# 修改表
alter table t1 rename t2;# 修改表名# 查看表
show tables;
show create table t1;# 查看表结构
desc t1;# 查看表结构,格式化了# 删除表
drop table t2;
针对记录的sql语句
3.针对记录的sql语句
记录:表中的一行一行的数据称之为是一条记录
# 需要先有库、在有表、最后操作记录id name age gender
1 kevin 20 male
1. 查看记录
select *from t1;# 查所有
select t1(表头中的一个或几个)from t1;
select id,name,age from t1;2. 增加数据
insert into t1 values(1,'kevin',20);# 第一种方式,全字段增加, 单条增加
insert into t1 values(2,'kevin1',20),(3,'kevin2',20),(4,'kevin3',20),(5,'kevin4',20),(6,'kevin5',20);# 第二种方式,全字段增加, 批量增加
insert into t1(id, name) values(7,'kevin7');# 空的使用NULL填充3. 修改
update t1 set name='tank' where id=1;
update t1 set age=30 where name='tank';
update t1 set name='jerry',age=30 where id=3;
update t1 set name='oscar' where name='tank'and age=30;
update t1 set name='oscar' where name='kevin3'or name='kevin4';
update t1 set name='tony';"""以后再自行更新和删除的sql语句的时候,一定要细心、好好看看你的条件是否正确"""
案例:
update t1 set age=age+40 where id=1;
update t1 set price=price+10;"""一定要谨慎!!!!"""4. 删除
delete from t1 where id=1;
delete from t1 where id=2orid=7;
delete from t1;# 这是清空表
约束条件
约束条件其实就是在数据类型的基础之上在做约束
1. unsigned # 无符号,整型默认带符号,这个就可以直接修改不带符号idint unsigned
2. zerofill # 0填充,经常与整型数据结合一起使用
create table t3(idint(9) zerofill);3. default # 默认值
相当于形参中的默认参数
create table t4 (idint, name varchar(32) default 'kevin');
insert into t4 values(1,'jerry');
insert into t4(id) values(1);'如果不指定字段,会报错,因为不指定字段,会默认所有的字段都需要传参,但是因为有默认值在,所以如果想不传参,就要在前边指定那些字段需要传参,那些不需要,默认字段如果指定不需要传参,那就是默认值,这个和形参的默认值还是有一点点差别的'4.not null # 非空,即必须保证被限制的这个字段被传了参数
create table t5 (idint, name varchar(32)not null);
insert into t5(id) values(1);5. unique # 唯一
单列唯一:'被约束的那一列不能出现重复的数据'
create table t6 (idint, name varchar(32) unique);
多列唯一:'被限制的那几列加起来不能出现重复'
create table t7 (idint,
ip varchar(32),
port varchar(32),
unique(ip, port));6. 主键(primary key)"""主键单纯从约束上来看,它相当于是非空且唯一 unique not null"""id unique not null ---等价于-->id primary key
create table t8 (idint primary key);
create table t8 (idint unique not null);# 主键本身是一种索引,索引能够加快查询速度
InnoDB存储引擎规定每一张表都要有一个主键,但是,我之前创建的表都没有指定主键, 表是怎么创建成功的?
"""
是因为InnoDB存储引擎内部有一个隐藏的主键,这个主键我们看不到,它也不能够加快查询速度,仅仅是为了帮助我们把表创建成功. 所以,以后我们创建表的时候都主动的创建一个主键,我们自己创建的主键能够加快查询速度,因为是一个索引.
一般情况下,主键应该创建哪个字段? 大多都给id字段加了,所以,每一张表都要有一个id字段,并且一张表中不只是有一个主键,可以有多个主键,但是,大多数情况下,都只有一个
"""
主键一般都给id aid sid uid pid ...
create table t(idint primary key,
name varchar(32))# 我们可以通过主键确定一张表中得唯一一条记录!!!因为主键不能重复,所以,我们就可以查询出唯一的一条信息7. auto_incrment
# 自增:每一次主动比上一次加1"""一般情况下,它配合主键使用"""
create table t9 (idint primary key auto_increment,
name varchar(32));
'只要增加过,不管删了还是没删,都会基于上次的值增加,比如,增加到8,然后我把第8个数据删了,在新增加的时候,就会是9,而不是继续是8
整型中括号中得数字的作用
idint(10)# 数字不代表的是范围而是位数,和zerofill结合使用,表示几位数字,不够的位数用0填充。如果超过这个位数,那就不限制了,就跟python中的那个数字占位符一样子
name varchar(32)# 数字代表的就是存储的范围
create table t1(idint(3));
create table t2(idint(9));
insert into t2 values(9);
create table t3(idint(9) zerofill);
insert into t3 values(9);
清空表的两种方式
1. delete from t;# 不会重置id值2. truncate t9;# 清空表、重置id值"""truncate:建议使用truncate,使用这个,万一你清空错了,还有机会恢复"""
mysql它有很多个日志文件,binlog日志-----》可以恢复数据,记录了你所有的SQL语句
补充一些其他的SQL语句
语法:
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],#默认是在字段之后添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;#在字段之前添加字段
ALTER TABLE 表名ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;#在字段之后添加字段名 3. 删除字段
ALTER TABLE 表名 DROP 字段名;4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];"""除了以上的SQL语句,还有很多其他的,如果遇到了不会写,就直接搜索引擎"""
以上命令小写也可以
关键字练习题
数据准备
# 数据准备
create table emp(idint primary key auto_increment,
name varchar(20)not null,
sex enum('male','female')not null default 'male',#大部分是男的
age smallint(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int,#一个部门一个屋子
depart_id int);
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('tom','male',78,'20150302','teacher',1000000.31,401,1),#以下是教学部('kevin','male',81,'20130305','teacher',8300,401,1),('tony','male',73,'20140701','teacher',3500,401,1),('owen','male',28,'20121101','teacher',2100,401,1),('jack','female',18,'20110211','teacher',9000,401,1),('jenny','male',18,'19000301','teacher',30000,401,1),('sank','male',48,'20101111','teacher',10000,401,1),('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门('呵呵','female',38,'20101101','sale',2000.35,402,2),('西西','female',18,'20110312','sale',1000.37,402,2),('乐乐','female',18,'20160513','sale',3000.29,402,2),('拉拉','female',28,'20170127','sale',4000.33,402,2),('僧龙','male',28,'20160311','operation',10000.13,403,3),#以下是运营部门('程咬金','male',18,'19970312','operation',20000,403,3),('程咬银','female',18,'20130311','operation',19000,403,3),('程咬铜','male',18,'20150411','operation',18000,403,3),('程咬铁','female',18,'20140512','operation',17000,403,3);
查询关键字之where
# where------>筛选条件的
where筛选功能
"""
模糊查询:没有明确的筛选条件
关键字:like
关键符号:
%:匹配任意个数任意字符
_:匹配单个个数任意字符
#查询员工姓名中包含o字母的员工姓名和薪资
# 在你刚开始接触mysql查询的时候,建议你按照查询的优先级顺序拼写出你的sql语句
"""
先是查哪张表 from emp
再是根据什么条件去查 where name like ‘%o%’
'%o%表示,o前后是什么都可以'
再是对查询出来的数据筛选展示部分 select name,salary
"""
select name,salary from emp where name like '%o%';
"""# 1.查询id大于等于3小于等于6的数据
select id,name from emp where id>=3andid<=6;
select *from emp where id between 3and6;# 2.查询薪资是20000或者18000或者17000的数据
select *from emp where salary =20000or salary =18000or salary =17000;
select *from emp where salary in(20000,18000,17000);# 简写# 4.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like '____';#四个下划线,表示四个长度,一个下划线代表一个
select name,salary from emp where char_length(name)=4;#char_lenth()内置函数,相当于python中的len()# 5.查询id小于3或者大于6的数据
select *from emp where idnot between 3and6;# 6.查询薪资不在20000,18000,17000范围的数据
select *from emp where salary notin(20000,18000,17000);# 7.查询岗位描述为空的员工名与岗位名 '针对null不能用等号,只能用is'
select name,post from emp where post_comment '=' NULL;# 查询为空!
select name,post from emp where post_comment is NULL;
select name,post from emp where post_comment isnot NULL;'''在sql中,NULL和 '' 不一样'' 所以要用is而不是=
查询关键字之group by分组
分组: 按照某个指定的条件将单个单个的个体分成一个个整体
# 单纯的分组是没有意义的
在MySQL中分组之后,只能够获得分组的依据字段的值(严格模式)! 按照哪个字段分组就只能获取这个字段的值,别的字段不能拿到,分组一般配合聚合函数使用:
summaxmin avg(平均值) count(计数)
分组的关键字:group by
一、非严格模式
1. 分组之后默认可以获取所有的字段信息(不是严格模式下)
2. 分组之后,展示的数据都是每个组的第一条数据
#按部门分组
select *from emp group by post;# 分组后取出的是每个组的第一条数据
select id,name,sex from emp group by post;# 验证"""
如果设置了严格模式,即设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据,
不应该在去取组里面的单个元素的值,那样的话分组就没有意义了,因为不分组就是对单个元素信息的随意获取
"""
二、分组之后默认只能够直接得到分组的依据字段的值(严格模式下) 其他数据都不能直接获取,需要结合聚合函数使用
setglobal sql_mode="strict_trans_tables,only_full_group_by";# 重新链接客户端
select *from emp group by post;# 报错
select id,name,sex from emp group by post;# 报错
select post from emp group by post;# 获取部门信息# 强调:只要分组了,就不能够再“直接”查找到单个数据信息了,只能获取到组名
针对严格模式需要自己设置sql_mode
setglobal sql_mode ='only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
三、严格模式下,得到非分组依据字段的信息,就要聚合函数配合分组一起使用
maxminsum count avg
例:
# 2.获取每个部门的最高工资 # 以组为单位统计组内数据>>>聚合查询(聚集到一起合成为一个结果)# 每个部门的最高工资
select post,max(salary)from emp group by post;
补充:在显示的时候还可以给字段取别名
select post as'部门',max(salary)as'最高工资'from emp group by post;as也可以省略 但是不推荐省 因为寓意不明确
# 每个部门的最低工资
select post,min(salary)from emp group by post;# 每个部门的平均工资
select post,avg(salary)from emp group by post;# 每个部门的工资总和
select post,sum(salary)from emp group by post;# 每个部门的人数
select post,count(id)from emp group by post;
统计的时候只要是非空字段 效果都是一致的
这里显示age,salary,id最后演示特殊情况post_comment
group by 分组补充函数
# group_concat 分组之后使用
如果真的需要获取分组以外的数据字段 可以使用group_concat()# 每个部门的员工姓名
select post,group_concat(name)from emp group by post;
select post,group_concat(name,'|',sex)from emp group by post;
select post,group_concat(name,'|',sex,'|', gender)from emp group by post;
select post,group_concat(distinct name)from emp group by post;
select post,group_concat(distinct name separator '%')from emp group by post;# concat 不分组使用
select concat(name,sex)from emp;
select concat(name,'|',sex)from emp;# concat_ws()
select post,concat_ws('|', name, age, gender)from emp group by post;
关键字之having过滤
where与having都是筛选功能 但是有区别
where在分组之前对数据进行筛选
having在分组之后对数据进行筛选
1.统计各部门年龄在30岁以上的员工平均薪资,并且保留平均薪资大于10000的部门.# 先筛选出年龄在30岁以上的
select *from emp where age >30;# 在进行分组,按照部门分组
select avg(salary)as avg_salary from emp where age >30 group by post;# 保留平均薪资大于10000的部门
select avg(salary)as avg_salary from emp where age >30 group by post having avg(salary)>10000;
关键字之distinct去重
distinct:去重
"""带主键的数据去重有没有意义? 没有,主键本身就是唯一的"""
select distinct id,age from emp;
关键字之order by排序
select *from emp order by salary;#默认升序排
select *from emp order by salary desc;#降序排#先按照age降序排,在年轻相同的情况下再按照薪资升序排
select *from emp order by age desc,salary;'''多字段排序,如果想让后面的字段排序生效,前提:前面的排序字段必须一样'''# 统计各部门年龄在20岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序# 20岁以上的员工
select *from emp where age >20;# 各部门的平均薪资
select avg(salary)from emp where age >20 group by post having avg(salary)>1000;#
select avg(salary)from emp where age >20 group by post having avg(salary)>1000 order by avg(salary) desc;