计算机基础知识38

创建表的完整语法

create table t1(id int,name varchar(43),age int);

create table 库名.表名(

字段名1 数据类型 约束条件 约束条件 约束条件 约束条件,

字段名2 数据类型 约束条件 约束条件 约束条件 约束条件...);

  1. 字段名和数据类型必须写的,不能省略

  2. 约束条件是可选的,可有可无,而且可有有多个

  3. 表结构中最后一个字段不能有逗号

insert into 库名.t1 values('1', 2, 3, 4, 5, 6);

约束条件

约束条件其实就是在数据类型的基础之上在做约束

  1. unsigned # 无符号 id int unsigned

  2. zerofill # 0填充

  3. default # 默认值

python 复制代码
create table t4 (id int, name varchar(32) default 'kevin');
insert into t4 values(1, 'jerry');   # 不传便是默认值
insert into t4(id) values(1);  
  1. not null # 非空
python 复制代码
create table t5 (id int, name varchar(32) not null);
insert into t5(id) values(1);   # name不能为空
  1. unique # 唯一

单列唯一: create table t6 (id int, name varchar(32) unique); # 手机号

多列唯一:create table t7 (id int, ip varchar(32), port varchar(32),unique(ip, port));

ip 和端口不能同时重复,单独一个可以重复

  1. primary key # 主键

主键单纯从约束上来看,它相当于是非空且唯一 unique not null,本质是索引

python 复制代码
create table t8 (id int primary key);
create table t8 (id int unique not null);

InnoDB存储引擎规定每一张表都要有一个主键

之前创建的表都没有指定主键也创建成功,InnoDB存储引擎内部有一个隐藏的主键,

这个主键我们看不到,它也不能够加快查询速度,仅仅是为了帮助我们把表创建成功.

以后创建表时主动创建一个主键,我们自己创建的主键能够加快查询速度,因为是一个索引.

主键应大多都给id字段加了,每张表都要有一个id字段,

表中不只有一个主键,可以有多个主键,大多一个

主键一般都给 id aid sid uid pid ...

create table t( id int primary key, name varchar(32));

我们可以通过主键确定一张表中得唯一一条记录!!!

  1. auto_incrment 自增

自增:每一次主动比上一次加1,一般配合主键使用

python 复制代码
 create table t9 (
        id int primary key auto_increment,
        name varchar(32)
    );

整型中括号中得数字的作用

id int(10) # 数字不代表的是范围

name varchar(32) # 数字代表的就是存储的范围

清空表的两种方式

  1. delete from t; # 不会重置id值

  2. truncate t9; # 清空表、重置id值

truncate:建议使用truncate,使用这个,万一你清空错了,还有机会恢复

mysql它有很多个日志文件,binlog日志-----》可以恢复数据,记录了你所有的SQL语句

补充一些其他的SQL语句

  1. 修改表名 : alter table t9 rename t9 ;

  2. 增加字段

alter table t8 add name varchar(32);

alter table t8 add name varchar(32) after name ;

alter table t8 add name varchar(32) first name ;

  1. 删除字段: alter table t8 drop age ;

  2. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!

alter table t8 modify gender int ; # 报错,有值了就不能改数据类型

alter table t8 modify gender varchar(64); # 该范围是可以的

alter table t8 change gender gender1;

查询关键字之where

python 复制代码
# 数据准备
create table emp(
  id int 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);

1、查询id大于等于3小于等于6的数据

python 复制代码
select id,name from emp where id >= 3 and id <= 6;
select *  from emp where id between 3 and 6;  

2.查询薪资是20000或者18000或者17000的数据

python 复制代码
select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
select * from emp where salary in (20000,18000,17000);  # 简写

3.查询员工姓名中包含o字母的员工姓名和薪资

python 复制代码
select name,salary from emp where name like '%o%';
"""模糊查询:没有明确的筛选条件:show variables like '%mode%se';""

4.查询员工姓名是由四个字符组成的员工姓名与其薪资

python 复制代码
select name,salary from emp where name like '____';
select name,salary from emp where char_length(name) = 4;

5.查询id小于3或者大于6的数据

python 复制代码
select *  from emp where id not between 3 and 6;

6.查询薪资不在20000,18000,17000范围的数据

python 复制代码
select * from emp where salary not in (20000,18000,17000);

7.查询岗位描述为空的员工名与岗位名 # 针对null不能用等号,只能用is

python 复制代码
select name,post from emp where post_comment is NULL;   # 查询为空!
select name,post from emp where post_comment is not NULL;

查询关键字之group by分组

分组: 按照某个指定的条件将单个单个的个体分成一个个整体,应用场景:每个

分组一般配合聚合函数使用: sum max min avg count

分组的关键字:group by

按部门分组: select * from emp group by post;

  1. 分组之后默认可以获取所有的字段信息

  2. 分组之后,展示的数据都是每个组的第一条数据

不开严格模式会显示所有,开了只显示这个字段信息

严格模式,退出重新登录: set global sql_mode = 'only_full_group_by,STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';

获取每个部门的最高工资

select post,max(salary) from emp group by post;

补充:在显示的时候还可以给字段取别名,as也可以省略 但是不推荐省 因为寓意不明确
select post as '部门',max(salary) as '最高工资' from emp group by post;

python 复制代码
"""# 每个部门的最低工资\平均工资\工资总和\人数  """
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;

分组补充函数

group_concat 分组之后使用

select post,group_concat(name,'|',sex, '|', gender) from emp group by post ;

concat 不分组使用

select concat(name,'|',sex) from emp;

concat_ws()

select post,concat_ws('|', name, age, gender) from emp;

关键字之having过滤

where在分组之前对数据进行筛选

having在分组之后对数据进行筛选

统计各部门年龄在30岁以上的员工平均薪资,并且保留平均薪资大于10000的部门.

select * from emp where age > 30; # 先筛选出年龄在30岁以上的

select avg(salary) as avg_salary from emp where age > 30 group by post; # 在进行分组
select avg(salary) as avg_salary from emp where age > 30 group by post having avg(salary) > 10000; # 保留平均薪资大于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的部门,然后对平均工资进行排序

select * from emp where age > 20; # 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 5,5; # 从5行开始,限制显示5行

第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置

关键字之regexp正则

select * from emp where name regexp '^j.*(n|y)$'; # 了解就行,一般不会用

今日思维导图:

相关推荐
儿时可乖了1 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度3 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮5 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
好看资源平台1 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
进击的六角龙1 小时前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂1 小时前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc2 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤2 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai