MySQL数据库(三)

文章目录

MySQL数据库

一、约束条件

python 复制代码
	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

python 复制代码
	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存储引擎会自动将该字段设置为主键

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

3.auto_increment 自增

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

python 复制代码
	create table test8(id int auto_increment);
python 复制代码
	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表名;(删除表数据并且重置主键值)

清空表的两种方式

python 复制代码
	1. delete from ts1; # 不会重置id值
	2. truncate ts2;   # 清空表、重置id值
	"""truncate:建议使用truncate,使用这个,万一你清空错了,还有机会恢复"""
	mysql它有很多个日志文件,binlog日志-----》可以恢复数据,记录了你所有的SQL语句

三、补充一些其它SQL语句

python 复制代码
	语法:
	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

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

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

python 复制代码
	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的数据

python 复制代码
	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字母的员工姓名和薪资

python 复制代码
	'在你刚开始接触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.查询员工姓名是由四个字符组成的员工姓名与其薪资

python 复制代码
	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的数据

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

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

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

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

python 复制代码
	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分组

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

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

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

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

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

3.每个部门的人数

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

七、分组补充函数

group_concat 分组之后使用

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

1.每个部门的员工姓名

python 复制代码
	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

python 复制代码
	select concat(name,sex) form emp;
	select concat(name,'|',sex) from emp;

八、关键字之having过滤

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

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

python 复制代码
	'首先先筛选出年龄大于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:去重,去重见名知意,但是去重的前提是数据必须一模一样
带主键的数据去重没有一样,因为主键本事就是唯一的

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

十、关键字之order by排序

asc 默认升序 desc降序

python 复制代码
	select * from emp order by salary asc;  # 默认升序
	select * from emp order by salary desc; # 降序

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

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

python 复制代码
	select * from emp order by age desc,salary asc;

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

python 复制代码
	'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分页

限制展示条数

python 复制代码
	select * from emp limit 7;

查询工资最高的人的详细信息

python 复制代码
	select * from emp order by salary desc limit 1; 

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

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

十二、关键字之regexp正则

python 复制代码
	select * from emp where name regexp '^j.*(n|y)$';  # regexp正则关键字,最后面的就是正则表达式
相关推荐
零炻大礼包38 分钟前
【SQL server】数据库远程连接配置
数据库
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
令狐少侠20111 小时前
explain执行计划分析 ref_
mysql
随心............1 小时前
python操作MySQL以及SQL综合案例
数据库·mysql
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
CopyDragon1 小时前
设置域名跨越访问
数据库·sqlite
xjjeffery1 小时前
MySQL 基础
数据库·mysql
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
独行soc2 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节