Python41days

发布时间 2023-10-24 20:15:32作者: 拆尼斯、帕丁顿

创建表的完整语法

约束条件(在数据类型的基础上在进行约束)

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)$';