SQL语句约束条件

2023-10-25 01:28

本文主要是介绍SQL语句约束条件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.创建表的完整语法

二.约束条件

三.补充

1.整型中括号中的数字的作用

2.清空表的两种方式

3.一些其他的SQL语句

四.查询关键字

1.数据准备

2.where关键字查询

3.group by关键字分组

4.having关键字过滤

5.order by关键字排序

6.limit关键字分页

7.regexp关键字正则


一.创建表的完整语法

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

create table 库名.表名(
    字段名1 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名2 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名3 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名4 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名5 数据类型 约束条件 约束条件 约束条件 约束条件,
    字段名6 数据类型 约束条件 约束条件 约束条件 约束条件
);

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

  1. 字段名和数据类型必须写的,不能省略
  2. 约束条件是可选的,可有可无,而且可以有多个
  3. 表结构中最后一个字段不能有逗号

二.约束条件

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

  1. unsigned  (无符号)
                    id int unsigned
  2. zerofill  (0填充)
  3. default  (默认值)
                   create table t4 (id int, name varchar(32) default 'kevin');
                   insert into t4 values(1, 'jerry');
                   insert into t4(id) values(1);
  4. not null  (非空)
                   create table t5 (id int, name varchar(32) not null);
                   insert into t5(id) values(1);
  5. unique  (唯一)
    1. 单列唯一:
              create table t6 (id int, name varchar(32) unique);
    2. 多列唯一:
              create table t7 (
              id int, 
              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 (id int primary key);
                      create table t8 (id int unique not null);
                    **主键本身是一种索引,索引能够加快查询速度**
    ######InnoDB存储引擎内部有一个隐藏的主键,这个主键我们看不到,它也不能够加快查询速度,仅仅是为了帮助我们把表创建成功. 所以,以后我们创建表的时候都主动的创建一个主键,我们自己创建的主键能够加快查询速度,因为是一个索引######
  7. auto_incrment  (自增)
                     每一次主动比上一次增加1,一般情况下配合主键使用
                     create table t9 (
                      id int primary key auto_increment,
                      name varchar(32)
                      );

三.补充

1.整型中括号中的数字的作用

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

2.清空表的两种方式

  • delete from 表名;    (不会重置id值)
  • truncate t9;    (清空表,重置id值)

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

MySQL有很多日志文件,binlog日志就记录了使用过所有的SQL语句,可以用来恢复数据

3.一些其他的SQL语句

  • 修改表名
    • ALTER TABLE 表名   RENAME 新表名;
  • 增加字段
    • ALTER TABLE 表名 ADD 字段名  数据类型 [完整性约束条件…],
      ALTER TABLE 表名 ADD 字段名  数据类型 [完整性约束条件…]  FIRST;
      ALTER TABLE 表名 ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;  
  • 删除字段
    • ALTER TABLE 表名 DROP 字段名;
  • 修改字段(modify只能改字段数据类型完整约束,不能改字段名,但是change可以!)
    • ALTER TABLE 表名 MODIFY  字段名 数据类型 [完整性约束条件…];
      ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

四.查询关键字

1.数据准备

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

2.where关键字查询

where:筛选条件使用

模糊查询:没有明确的筛选条件

关键字:like

关键符号:%:匹配任意个数任意字符

                  _:匹配单个个数任意字符

show variables like '%mode%';

# 1.查询id大于等于3小于等于6的数据
select id,name from emp where id >= 3 and id <= 6;
select *  from emp where id between 3 and 6;  # 2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
select * from emp where salary in (20000,18000,17000);  # 简写# 3.查询员工姓名中包含o字母的员工姓名和薪资
# 在你刚开始接触mysql查询的时候,建议你按照查询的优先级顺序拼写出你的sql语句
"""
先是查哪张表 from emp
再是根据什么条件去查 where name like ‘%o%’
再是对查询出来的数据筛选展示部分 select name,salary
"""
select name,salary from emp where name like '%o%';# 4.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like '____';
select name,salary from emp where char_length(name) = 4;# 5.查询id小于3或者大于6的数据
select *  from emp where id not between 3 and 6;# 6.查询薪资不在20000,18000,17000范围的数据
select * from emp where salary not in (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 is not NULL;'''在sql中,NULL和''不一样''

3.group by关键字分组

分组:按照某个指定的条件将单个单个的个体分成一个个整体

例如:按照身高分组,按照年龄分组,按照性别分组等

在MySQL中分组之后,只能够获得分组的依据!按照哪个字段分组就只能获取这个字段的值,别的字段不能拿到

单纯的分组是没有意义的,分组一般配合聚合函数一起使用:

sum  max  min  avg  count

分组的关键字:group  by

数据分组应用场景:每个部门的平均薪资,男女 比例等

分组之后默认可以获取所有的字段信息
分组之后展示的数据都是每个组的第一条数据

# 1.按部门分组
select * from emp group by post;  # 分组后取出的是每个组的第一条数据
select id,name,sex from emp group by post;  # 验证
"""
设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据,
不应该在去取组里面的单个元素的值,那样的话分组就没有意义了,因为不分组就是对单个元素信息的随意获取
"""
set global 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;  # 获取部门信息
# 强调:只要分组了,就不能够再“直接”查找到单个数据信息了,只能获取到组名# 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_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;

4.having关键字过滤

where和having都是过滤筛选功能,但是有区别

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

统计各部门年龄在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;

5.order by关键字排序

  • select * from emp order by salary;            默认升序
  • select * from emp order by salary desc;    降序

多字段排序,如果想让后面的字段排序生效,前提:前面的排序字段必须一样

统计各部门年龄在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;

6.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;

7.regexp关键字正则

select * from emp where name regexp "^j.*(n|y)$";'''
以j 开头 以 n 结尾 , 中间任意
以某个字母开头,某个字母结尾
'''

这篇关于SQL语句约束条件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/279097

相关文章

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp