创建表的完整语法
约束条件(在数据类型的基础上在进行约束)
unsigned zerofill default
not null unique primary key auto_increment
其余SQL语句
其他查询关键字
select from where order by limit
having regexp and or in not in betwee and like 等
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
create table t1 ( id ,int,name varchar (43),age int);
creat table 库名 表名(
字段名1 数据类型 约束条件 约束条件………………
字段名2 数据类型 约束条件 约束条件………………);
insert into 库名 表名 values (‘1‘,2,3,4,5,6);
字段名 和数据类型 必须写 不能省略
约束条件可选 ,可有多个
表结构中最后一个字段不能有逗号
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————约束条件
约束条件其实就是在数据类型的基础上在做约束
1. unsigned 无符号
id int unsigned
2. zerofill 填充
整型中括号中得数字得作用
id int(10) 数字不代表范围-
name varchar (32) 存储得范围
create table t1(id int (3));
create table t2(id int (9));
insert into t2 values(9);
create table t3(id int (9)zerofill);
insert into t3 values(9);
3.default 默认值
create table t4(id int, name varchar (32) default 'keeeen')
insert into t4 values(1,'jerry');
insert into t4 (id) values (1);
Not null 非空
create table t5 (id int,name varchar (32) not null);
insert into t5(id) values (1);
unique 唯一 不能出现重复
单列唯一
create table t6 (id int, name varchar (32) unique);
多列唯一
create table t7 (id int , ip varchar (32),port samllint);
samllint 可以改为 varchar(32)
加上 unique(ip,port)
主键(paimary key)
主键但从约束来看,是非空切唯一 unique not null
id unique not null 等价于 id primary key
create table t8(id, int primary key);
= create table t8 (id,int paimary key);
主键 本身是一种索引,加快查询速度
innoDB存储规定 每张表都有 一个主键
InnoDB内部有隐藏主键 不能加快查询速度, 目的帮助 我们成功创建表,而当我们自主创建表得时候 主动创建 主键 自己创建的主键能够加快查询速度 因为是一个索引
一般情况下 大多给id字段 所以每张表都要有一个 id字段 ,并且一张表中不只是有一个主键,可以有多个主键,但大多数情况 只有一个
主键一般都给 id aid sid uid pid等
create table t (id int primary key,
name varchar (32)
) 通过主键确定一张表中 唯一一条记录
auto_incrment
自增 每次主动比上一次加1
配合 主键使用
create table t9 (id int primary key auto_increment,name varchar(32));
insert into t9(name) values ('kenen');
不管是否删除 只要存在过 就基于上一次增加
清空表得两种方式
1.delete from t?; 不会重置id
2. truncat t? ; 清空表 充值id值
语法:
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 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————
模糊查询:没有明确的筛选条件
关键字:like
关键符号:
%:匹配任意个数任意字符
_:匹配单个个数任意字符
show variables like '%mode%se';
查询关键字 where
select *from emp where id》=15and id《=30;
或者select * from emp where id between 15 and 30;
或者 select * from emp where salary in(20000,18000,17000);
或者 select * from emp where char_length(name)=4;
查询薪资不在 (~~~~~~~) select * from emp where ????not in
查询关键字之group by分组
分组: 按照某个指定的条件将单个单个的个体分成一个个整体
按照男女分组:男 女
按照年龄分组:20岁以下 20-30 30-40
单纯的分组是没有意义的
在MySQL中分组之后,只能够获得分组的依据! 按照哪个字段分组就只能获取这个字段的值,别的字段不能拿到
分组一般配合聚合函数使用:
sum max min avg count
分组的关键字:group by
数据分组应用场景:每个部门的平均薪资,男女比例等
1.按部门分组
1. 分组之后默认可以获取所有的字段信息
2. 分组之后,展示的数据都是每个组的第一条数据
分组之后默认只能够直接过去到分组的依据 其他数据都不能直接获取
针对5.6需要自己设置sql_mode
set global sql_mode = 'only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
聚合函数
聚合函数主要就是配合分组一起使用
max min sum count avg
获取所有信息 是因为 没有 设置 严格模式
分组之后展示得数据 都是每组得第一条数据
分组补充函数
# 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排序
elect * 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;
关键字之limit分页
限制展示条数
限制展示条数
select * from emp limit 3;
查询工资最高的人的详细信息
select * from emp order by salary desc limit 1;
分页显示
select * from emp limit 0,5; 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置
select * from emp limit 5,5;
关键字之regexp正则
select * from emp where name regexp '^j.*(n|y)$';
标签:group,name,Python41days,分组,emp,id,select From: https://www.cnblogs.com/wzh366/p/17785665.html