首页 > 数据库 >MySQL基础

MySQL基础

时间:2024-04-12 15:59:45浏览次数:27  
标签:group name 基础 MySQL employee post id select

1,初识SQL语句

SQL语句:

操作文件夹(库)
	增
		create database db1 charset utf8;
	查
		show create database db1;
		show databases;
	改
		alter database db1 charset gbk;
	删
		drop database db1;

操作文件(表)
	切换文件夹:use db1;
	查看当前所在文件夹:select database();
	
	增
		create table t1(id int,name char);
	查
		show create table t1;
		show tables;
		desc t1;
	改
		alter table t1 modify name char(6);
		alter table t1 change name NAME char(7);
	删
		drop table t1;

操作文件内容(记录)
	增
		insert t1(id,name) values(1,'egon1'),(2,'egon2'),(3,'egon3');
	查
		select id,name from db1.t1;
		select * from db1.t1;
	改
		update db1.t1 set name='SB';
		update db1.t1 set name='ALEX' where id=2;
	删
		delete from t1;
		delete from t1 where id=2;

2,存储引擎介绍

1、什么是存储引擎?
	存储引擎就是表的类型

2、查看MySQL支持的存储引擎
	show engines;
	
	
3、指定表类型/存储引擎
	create table t1(id int)engine=innodb;
	create table t2(id int)engine=memory;
	create table t3(id int)engine=blackhole;
	create table t4(id int)engine=myisam;


	insert into t1 values(1);
	insert into t2 values(1);
	insert into t3 values(1);
	insert into t4 values(1);

3,日期类型

create table student(
	id int,
	name char(6),
	born_year year,
	birth_date date,
	class_time time,
	reg_time datetime
);

insert into student values
(1,'egon',now(),now(),now(),now());

insert into student values
(2,'alex',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12");

4,字符类型

char:定长
varchar:变长

#宽度指的是字符的个数
create table t13(name char(5));
create table t14(name varchar(5));

insert into t13 values('李杰 '); #'李杰   '
insert into t14 values('李杰 '); #'李杰 '


select char_length(name) from t13; #5
select char_length(name) from t14; #3


select name from t13 where name='李杰';
select name from t13 where name like '李杰';




name char(5)
egon |alex |wxx  |


name varchar(5)
1bytes+egon|1bytes+alex|1bytes+wxx|
4+egon|4+alex|3+wxx|



5,枚举类型和集合类型

create table consumer(
	id int,
	name char(16),
	sex enum('male','female','other'),
	level enum('vip1','vip2','vip3'),
	hobbies set('play','music','read','run')
);


insert into consumer values
(1,'egon','male','vip2','music,read');

insert into consumer values
(1,'egon','xxxxx','vip2','music,read');

6,约束条件nnot null与default

create table t15(
	id int(11) unsigned zerofill
);

create table t16(
	id int,
	name char(6),
	sex enum('male','female') not null default 'male'
);

insert into t16(id,name) values(1,'egon');

7,约束条件unique key

unique key

单列唯一
	#方式一
	create table department(
		id int unique,
		name char(10) unique
	);
	#方式二:
	create table department(
		id int,
		name char(10),
		unique(id),
		unique(name)
	);




	insert into department values
	(1,'IT'),
	(2,'Sale');


联合唯一
create table services(
	id int,
	ip char(15),
	port int,
	unique(id),
	unique(ip,port)
);



insert into services values
(1,'192.168.11.10',80),
(2,'192.168.11.10',81),
(3,'192.168.11.13',80);




insert into services values
(4,'192.168.11.10',80);


8,约束条件primary key

primary key
约束:not null unique
存储引擎(innodb):对于innodb存储引擎来说,一张表内必须有一个主键

# 单列主键
create table t17(
	id int primary key,
	name char(16)
);



insert into t17 values
(1,'egon'),
(2,'alex');

insert into t17 values
(2,'wxx');

insert into t17(name) values
('wxx');

create table t18(
	id int not null unique,
	name char(16)
);



# 复合主键
create table t19(
	ip char(15),
	port int,
	primary key(ip,port)
);


insert into t19 values
('1.1.1.1',80),
('1.1.1.1',81);


9,约束条件auto_increment

auto_increment

create table t20(
	id int primary key auto_increment,
	name char(16)
);

insert into t20(name) values
('egon'),
('alex'),
('wxx');



insert into t20(id,name) values
(7,'yuanhao');

insert into t20(name) values
('egon1'),
('egon2'),
('egon3');


#了解
	show variables like 'auto_inc%';

	#步长:
	auto_increment_increment默认为1
	#起始偏移量
	auto_increment_offset默认1
	
	#设置步长
	set session auto_increment_increment=5;
	set global auto_increment_increment=5;
	
	#设置起始偏移量
	set global auto_increment_offset=3;
	强调:起始偏移量<=步长
	
	create table t21(
		id int primary key auto_increment,
		name char(16)
	);
	
	insert into t21(name) values
	('egon'),
	('alex'),
	('wxx'),
	('yxx');
	
	

清空表:
	delete from t20;
	delete from t20 where id = 3;
	insert into t20(name) values
	('xxx');
	
	truncate t20; #应该用它来清空表
	

10,约束条件之foreign key

foreign key:建立表之间的关系

#1、建立表关系:
	#先建被关联的表,并且保证被关联的字段唯一
	create table dep(
		id int primary key,
		name char(16),
		comment char(50)
	);


	#再建立关联的表
	create table emp(
		id int primary key,
		name char(10),
		sex enum('male','female'),
		dep_id int,
		foreign key(dep_id) references dep(id) 
		on delete cascade 
		on update cascade
	);

#2、插入数据
#先往被关联表插入记录
insert into dep values
(1,"IT","技术能力有限部门"),
(2,"销售","销售能力不足部门"),
(3,"财务","花钱特别多部门");

#再往关联表插入记录
insert into emp values
(1,'egon','male',1);

insert into emp values
(2,'alex','male',1),
(3,'wupeiqi','female',2),
(4,'yuanhao','male',3),
(5,'jinximn','male',2);




delete from emp where dep_id=1;
delete from dep where id=1;



delete from dep where id=3;

11,表之间的关系

两张表之间的关系:
	1、多对一
		出版社    书(foreign key(press_id) references press(id))
	2、多对多
		作者       书
		egon: 
			九阳神功
			九阴真经
		alex: 
			九阳神功
			葵花宝典
		yuanhao:
			独孤九剑
			降龙十巴掌
			葵花宝典
		wpq:
			九阳神功
			
		insert into author2book(author_id,book_id) values
		(1,1),
		(1,2),
		(2,1),
		(2,6);
			
		
	3、一对一
		customer表       student表
	

12,单表查询

单表查询

select distinct 字段1,字段2,字段3 from 库.表 
	where 条件
	group by 分组条件
	having 过滤
	order by 排序字段
	limit n;
	
	
#where
select id,name,age from employee where id > 7;
	
select name,post,salary from employee where post='teacher' and salary > 8000;

select name,salary from employee where salary >= 20000 and salary <= 30000;
select name,salary from employee where salary between 20000 and 30000;

select name,salary from employee where salary < 20000 or salary > 30000;
select name,salary from employee where salary not between 20000 and 30000;


select * from employee where age = 73 or age = 81 or age = 28;
select * from employee where age in (73,81,28);

select * from employee where post_comment is Null;
select * from employee where post_comment is not Null;

select * from employee where name like "jin%";
select * from employee where name like "jin___";


#group by
mysql> set global sql_mode="ONLY_FULL_GROUP_BY"; 
分组之后,只能取分组的字段,以及每个组聚合结果

select post from employee group by post;

#聚合函数
max
min
avg
sum
count

#每个职位有多少个员工
select post,count(id) as emp_count from employee group by post;
select post,max(salary) as emp_count from employee group by post;
select post,min(salary) as emp_count from employee group by post;
select post,avg(salary) as emp_count from employee group by post;
select post,sum(age) as emp_count from employee group by post;

#没有group by则默认整体算作一组
select max(salary) from employee;

#group_concat
select post,group_concat(name) from employee group by post;


#练习:
select post,group_concat(name) from employee group by post;

select post,count(id) from employee where age > 50 group by post;

select sex,count(id) from employee group by sex;


select sex,avg(salary) from employee group by sex


#having
select post,group_concat(name),count(id) from employee group by post;

select post,group_concat(name),count(id) from employee group by post having count(id) < 2;


select post,avg(salary) from employee group by post having avg(salary) > 10000;


#order by
select * from employee order by age asc; #升序
select * from employee order by age desc; #降序

select * from employee order by age asc,id desc; #先按照age升序排,如果age相同则按照id降序排


select distinct post,count(id) as emp_count from employee
	where salary > 1000
	group by post
	having count(id) > 1
	order by emp_count desc
	;


#limit
select * from employee limit 3;
select * from employee order by salary desc limit 1;


select * from employee limit 0,5;
select * from employee limit 5,5;
select * from employee limit 10,5;
select * from employee limit 15,5;


#总结:
	语法顺序:
		select distinct 字段1,字段2,字段3 from 库.表 
			where 条件
			group by 分组条件
			having 过滤
			order by 排序字段
			limit n;

	执行顺序:

def from(db,table):
		f=open(r'%s\%s' %(db,table))
		return f
	
def where(condition,f):
	for line in f:
		if condition:
			yield line

def group(lines):
	pass
	
def having(group_res):
	pass

def distinct(having_res):
	pass

def order(distinct_res):
	pass
	
def limit(order_res)
	pass
	
def select():
	f=from('db1','t1')
	lines=where('id>3',f)
	group_res=group(lines)
	having_res=having(group_res)
	distinct_res=distinct(having_res)
	order_res=order(distinct_res)
	res=limit(order_res)
	print(res)
	return res
	
#正则表达式
select * from employee where name like 'jin%';
select * from employee where name regexp '^jin';
select * from employee where name regexp '^jin.*(g|n)$';


13,连表操作

内连接:只取两张表的共同部分
select * from employee inner join department on employee.dep_id = department.id ;

左连接:在内连接的基础上保留左表的记录
select * from employee left join department on employee.dep_id = department.id ;

右连接:在内连接的基础上保留右表的记录
select * from employee right join department on employee.dep_id = department.id ;

全外连接:在内连接的基础上保留左右两表没有对应关系的记录
select * from employee full join department on employee.dep_id = department.id ;


select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id ;


14,多表查询练习

13、查询全部学生都选修了的课程号和课程名
17、查询平均成绩大于85的学生姓名和平均成绩
19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名

15,权限管理

权限管理
	1、创建账号
		# 本地账号
		create user 'egon1'@'localhost' identified by '123'; # mysql -uegon1 -p123
		# 远程帐号
		create user 'egon2'@'192.168.31.10' identified by '123'; # mysql -uegon2 -p123 -h 服务端ip
		create user 'egon3'@'192.168.31.%' identified by '123'; # mysql -uegon3 -p123 -h 服务端ip
		create user 'egon3'@'%' identified by '123'; # mysql -uegon3 -p123 -h 服务端ip
		
	2、授权
		user:*.*
		db:db1.*
		tables_priv:db1.t1
		columns_priv:id,name
		
		grant all on *.* to 'egon1'@'localhost';
		grant select on *.* to 'egon1'@'localhost';
		revoke select on *.* from 'egon1'@'localhost';
		
		grant select on db1.* to 'egon1'@'localhost';
		revoke select on db1.* from 'egon1'@'localhost';
		
		
		grant select on db1.t2 to 'egon1'@'localhost';
		revoke select on db1.t2 from 'egon1'@'localhost';
		
		grant select(id,name),update(age) on db1.t2 to 'egon1'@'localhost';

16,存储过程


#1、无参存储过程
	delimiter //
	create procedure p1()
	BEGIN
		select * from db7.teacher;
	END //
	delimiter ;


	# MySQL中调用
	call p1();


	# Python中调用
	cursor.callproc('p1')
	
	
#2、有参存储过程
	delimiter //
	create procedure p2(in n1 int,in n2 int,out res int)
	BEGIN
		select * from db7.teacher where tid > n1 and tid < n2;
		set res = 1;
	END //
	delimiter ;


	# MySQL中调用
	set @x=0
	call p2(2,4,@x);
	select @x;

	# Python中调用
	cursor.callproc('p2',(2,4,0))# @_p2_0=2,@_p2_1=4,@_p2_2=0
	cursor.execute('select @_p3_2')
	cursor.fetchone()
	
	

	
应用程序与数据库结合使用
方式一:
	Python:调用存储过程
	MySQL:编写存储过程

	
方式二:
	Python:编写纯生SQL
	MySQL:
	
方式三:
	Python:ORM->纯生SQL
	MySQL:

17,函数与流程控制

CREATE TABLE blog (
    id INT PRIMARY KEY auto_increment,
    NAME CHAR (32),
    sub_time datetime
);

INSERT INTO blog (NAME, sub_time)
VALUES
    ('第1篇','2015-03-01 11:31:21'),
    ('第2篇','2015-03-11 16:31:21'),
    ('第3篇','2016-07-01 10:21:31'),
    ('第4篇','2016-07-22 09:23:21'),
    ('第5篇','2016-07-23 10:11:11'),
    ('第6篇','2016-07-25 11:21:31'),
    ('第7篇','2017-03-01 15:33:21'),
    ('第8篇','2017-03-01 17:32:21'),
    ('第9篇','2017-03-01 18:31:21');
	
	
	
select  date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m')

标签:group,name,基础,MySQL,employee,post,id,select
From: https://www.cnblogs.com/Tuige123/p/18131463

相关文章

  • redis基础
    redis数据类型redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。redis={"name":"yuan","scors":["100","89","78"],"info":{"name":"rain"......
  • c# LiteDB的基础用法
    LiteDB是一个轻量级的嵌入式NoSQL数据库,其设计理念与MongoDB类似,但它是完全使用C#开发的,因此与C#应用程序的集成非常顺畅。与SQLite相比,LiteDB提供了NoSQL(即键值对)的数据存储方式,并且是一个开源且免费的项目。它适用于桌面、移动以及Web应用程序。安装LiteDB包......
  • mysql修改密码报错:Your password does not satisfy the current policy requirements
    参考https://blog.csdn.net/u013449046/article/details/106455041这是mysql初始化时,使用临时密码,修改自定义密码时,由于自定义密码比较简单,就出现了不符合密码策略的问题。密码策略问题异常信息:ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequ......
  • MySQL的CDC数据实时同步
    MySQL的CDC数据实时同步 背景近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存、更新或者软删除)到一个另一个数据源,持久化之前需要清洗数据并且构建一......
  • MySQL数据库下载及安装教程
    MySQL数据库下载及安装教程(最最新版)一、下载mysql数据库二、安装Mysql三、验证是否安装成功(一)、命令提示符cmd窗口验证(二)、MySQL控制台验证一、下载mysql数据库进入MySQL官方网站(https://www.mysql.com/downloads/),按下图顺序点击进入下载页面。 注意:这里MSIInstal......
  • mysql半同步复制
    1、首先在master上面安装插件INSTALLPLUGINrpl_semi_sync_masterSONAME'semisync_master.so';QueryOK,0rowsaffected(0.01sec)2、设置master全局变量和超时时间SETGLOBALrpl_semi_sync_master_enabled=1;QueryOK,0rowsaffected(0.00sec)查看变量是否开......
  • PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)
    此处特别感谢小昌做出的贡献!PythonOCC基础使用:建模——矩阵变换(平移/旋转/缩放/镜像)-卡核(caxkernel.com) 1.平移效果图:fromOCC.Core.BRepPrimAPIimportBRepPrimAPI_MakeConefromOCC.Core.TopLocimportTopLoc_LocationfromOCC.Core.TopoDSimportTopoDS_Shapefr......
  • 2-68. 基础数据创建 Node & GridNodes
    AStar算法概览先选FCost最小的点,如果FCost相同再选HCost最小的点回来的时候是找FCost最小的点数据结构创建Node脚本GridNodes修改MapData_SO因为地图上左下角的点是负数,这个点没有办法直接导入到数组下标中,所以需要对这个点进行处理,以便它能够映射到数......
  • Java基础学习 | 2024年4月12日
    修饰符1.受保护的访问修饰符-protected子类与基类在同一包中:被声明为protected的变量、方法和构造器能被同一个包中的任何其他类访问;子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。简单来讲,被p......
  • Mysql中Varchar(50)和varchar(500)区别是什么?
    一.问题描述我们在设计表结构的时候,设计规范里面有一条如下规则:对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。为什么这么规定,我在网上查了一下,主要基于两个方面基于存储空间的考虑基于性能的考虑网上说Varchar(50)和varchar(500)存储空间上是......