MySQL数据库(约束条件|关键字查询)

MySQL数据库

一、约束条件

	insert into 表名 values()  # 默认按照创建表的字段顺序添加
	insert into 表名(字段) values()  # 可以自定义字段顺序

	1.unsigned 无符号
		create table test(id int unsigned);
		insert into test values(255);

	2.zerofill 0填充
		create table test1(id int zerofill);
		insert into test1 values(20);

	3.default 默认值
		create table test2(id int,name varchar(32) default 'jack');
		insert into test2(id) values(1);
		insert into test2 values(2,'tom');

	4.not null 非空
		create table test3(name varchar(32) not null);
		insert table test3 values();

	5.unique 唯一值
		'单列唯一'
		create table test4(id int unique);
		insert into test4 values(1);
		insert into test4 values(1);
		
		'多列唯一'
		create table test4(
			id int,
			ip varchar(32),
			port varchar(32),
			unique(ip,port)
		); '两个结果只能出现一次'
		insert into test4 values(1,'127.0.0.1',3306);
		insert into test4 values(1,'127.0.0.1',3306);
		insert into test4 values(1,'127.0.0.1',3307);	

在这里插入图片描述

二、约束条件之主键

Primary key 主键
1.主键单纯从约束上来看,它相当于是非空且唯一 unique not null

	id unique not null -------> id primary key
	create table test5(id int primary key);
	create table test6(id int unique not null);
	
	insert into test5 values(1);
	insert into test6 values(1);

'主键本身是一种索引,索引能够加快查询速度'

在这里插入图片描述
2.InnoDB存储引擎规定每一张表必须有一个主键,并且只有一个主键(当然也可以有多个)
但是我们之前创建的表都没有指定主键,表是怎么创建成功的?

是因为InnoDB存储引擎内部有一个隐藏的主键,这个主键我们看不到,它也不能够加快查询速度,仅仅是为了帮助我们把表创建成功,所以以后我们创建表的时候都主动的创建一个主键,我们自己创建的主键能够加快查询速度,因为是一个索引。

一般情况下,主键应该创建哪个字段?

大多数都是给id字段加了,所以每张表都要有一个id字段,并且一张表中也可以有多个主键,但是大多数情况下只有一个

如果创建的表中没有主键但是有非空且唯一的字段那么InnoDB存储引擎会自动将该字段设置为主键
在这里插入图片描述

	补充知识
		create table ts1(id int primary key)  # 单列主键
		create table ts22(uid int,id int primary key(uid,id)) # 多列主键

3.auto_increment 自增
该约束条件不能单独使用,必须要跟在主键后面(主要配合主键一起使用)

	create table test8(id int auto_increment);

在这里插入图片描述

	create table test8(id int primary key auto_increment,name varchar(32) not null);
	insert into test8(name) values('jack');
	insert into test8(name) values('tom');

在这里插入图片描述

我们发现auto_increment有自增的特点,但是自增的操作不会因为删除数据后重置重新开始,如果自己设置了更大的数 则之后按照更大的往前自增
在这里插入图片描述

但是如果非要重置主键,需要格式化表Truncate表名;(删除表数据并且重置主键值)

在这里插入图片描述
清空表的两种方式

	1. delete from ts1; # 不会重置id值
	2. truncate ts2;   # 清空表、重置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语句,还有很多其他的,如果遇到了不会写,就直接搜索引擎"""

四、表查找关键字Select与from

	SQL语句的关键字编写顺序与执行顺序是不一致的
		eg:select name from emp;
			肯定是先获取到表emp再去执行select想要的内容name
	编写SQL语句针对select和from有一个固定模版
		select * from 表名 其他操作
	select后面的字段可能是实际的字段,也可以是通过SQL动态产生的 所有*占位再修改
	selet 自定义查询表中对应的数据 from指定操作的对象(来自哪一张表,可以是多张表)

	like 模糊查询
		% 匹配任意个数的任意字符
		_ 匹配单个个数的任意字符
创建一个大数量的表格
	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
		);


	2.添加数据
		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筛选

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

	select * from emp where id >= 3 and id <= 6;
	select id,name emp where id >= 3 and id <= 6;
	select * from emp where id between 3 and 6;

在这里插入图片描述

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

	select salary from emp where salary = 20000 or salary = 18000 or salary = 17000;
	select salary from emp where salary in (20000,18000,17000);

在这里插入图片描述

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

	'在你刚开始接触mysql查询的时候,建议你按照查询的优先级顺序拼写出你的sql语句'
	'''
		先是查哪张表 from emp
		再是根据什么条件去查 where name like '%o%';
		再是对查询出来的数据筛选展示部分 select name,salary
	'''
	select * from emp where name like '%o%';
	select name,sarlary from emp where name like '%o%';

在这里插入图片描述
4.查询员工姓名是由四个字符组成的员工姓名与其薪资

	select * from emp where name like '____';
	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 < 3 or id > 6;
	select * from emp where not between 3 and 6;

在这里插入图片描述
6.查询薪资不在20000,18000,17000范围的数据

	select * from emp where salary not in (20000,18000,17000);

在这里插入图片描述

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

	selet * from emp where post_comment is null;  # 获取所有为空的数据
	select name,post from emp where post_comment=null;  # 不能使用等号,查询结果为空!
	select name,post from emp where post_comment is null; 
	'在sql中,NULL和' '不一样'

在这里插入图片描述

六、查询关键字之group by分组

	分组:按照一些指定的条件单个单个的数据分为一个个整体
	select post from emp group by post;
	分组一般配合聚合函数使用:summaxmin、avg、count
	分组之后我们研究的对象应该是一组为单位,不应该直接获取单个数据
	如果获取了应该直接报错
	select后面可以直接填写字段名只能是分组的依据(其他字段需要借助于一些方法才可以获取)
	
	set global sql_mode = 'strict_trans_tables,only_full_group_by';
	"""
	设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据,
	不应该在去取组里面的单个元素的值,那样的话分组就没有意义了,因为不分组就是对单个元素信息的随意获取
	"""

1.获取每个部门的最高工资

	'以组为单位统计组内数据>>>聚合查询(聚集到一起合成为一个结果)'
	select post,max(salary) from emp group by post;
	
	select post as '部门',max(salary)as '最高工资' from emp group by post;
	'为了辨识 在显示的时候还可以给字段取别名,用到as'

在这里插入图片描述

2.每个部门的最低工资、平均工资、部门工资总和

	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;  # 工资总和

在这里插入图片描述

3.每个部门的人数

	select post,count(id) from emp group by post;
	统计的时候只要是非空字段 效果都是一致的 
	这里显示age,salary,id最后演示特殊情况post_comment

在这里插入图片描述

七、分组补充函数

group_concat 分组之后使用
如果真的需要获取分组以外的数据字段,可以使用group_concat()

1.每个部门的员工姓名

	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(distinct name) from emp group by post;  # distinct关键字 去重 
	select post,group_concat(distinct name separator '%') from emp group by post;

在这里插入图片描述
不分组使用 concat

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

在这里插入图片描述

八、关键字之having过滤

	where与having的功能其实是一样的,都是用来筛选数据
	只不过where用于分组之前对数据进行筛选,而having在分组之后对数据进行筛选
	为了人为的区分,所以叫where是筛选,having是过滤

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

	'首先先筛选出年龄大于30以上的'
	select * from emp where age > 30;
	'在进行分组,按照部门分组'
	select * from emp group by post;
	'保留平均薪资大于10000的部门'
	select post,avg(salary) from emp where age > 30 goroup by post having avg(salary) > 10000;

在这里插入图片描述

九、关键字之distinct去重

distinct:去重,去重见名知意,但是去重的前提是数据必须一模一样
带主键的数据去重没有一样,因为主键本事就是唯一的

	select distinct age from emp;
	select distinct id,age from emp; #多样数据其中有带主键的数据,就无法去重

在这里插入图片描述

十、关键字之order by排序

asc 默认升序 desc降序

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

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

在这里插入图片描述

按照age降序排,在年轻相同的情况下再按照薪资升序排

	select * from emp order by age desc,salary asc;

在这里插入图片描述

统计各部门年龄在20岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序

	'20岁以上的员工'
	select * from emp where age > 20;
	'各部门的平均薪资,保留平均薪资大于1000的部门'
	select port,avg(salary) from emp where age > 20 group by post having avg(salary) > 1000;
	'对平均工资进行排序'
	select post,avg(salary) from emp where age > 20 group by post having avg(salary) > 1000 order by avg(salary) desc;

在这里插入图片描述

十一、关键字之limit分页

限制展示条数

	select * from emp limit 7;

在这里插入图片描述
查询工资最高的人的详细信息

	select * from emp order by salary desc limit 1; 

在这里插入图片描述

分页展示 从第五条开始 总共展示五条

	select * from emp limit 5,10; # (第一个数字表示起始位置,第二个表示条数,不是索引位置)

在这里插入图片描述

十二、关键字之regexp正则

	select * from emp where name regexp '^j.*(n|y)$';  # regexp正则关键字,最后面的就是正则表达式

在这里插入图片描述

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值