MySQL语句 - sql语句

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL语句 - sql语句相关的知识,希望对你有一定的参考价值。

mysql语句 - sql语句

sql 语句介绍

什么是sql 语句?

SQL(Structure Query Language)是 结构化查询语句的缩写,它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索

20 世纪 80 年代初,美国国家标准局(ANSI)开始着手制定 SQL 标准,最早的 ANSI 标准于1986 年完成,就被叫作 SQL-86。标准的出台使 SQL 作为标准关系数据库语言的地位得到了加强。SQL 标准目前已几经修改更趋完善

正是由于 SQL 语言的标准化,所以大多数关系型数据库系统都支持 SQL 语言,它已经发展成为多种平台进行交互操作的底层会话语言

SQL语句的分类:

DDL(Data Definition Languages)语句:

  • 数据定义语言这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 createdropalterrenametruncate

DML(Data Manipulation Language)语句:

  • 数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insertdeleteupdate

DCL(Data Control Language)语句:

  • 数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grantrevoke

DQL(Data Query Language)语句:

  • 数据查询语句,用于从一个或多个表中检索信息。主要的语句关键字包括 select

MySQL中如何求帮助

通过官方文档查看:软件安装下载说明

MySQL5.6官方文档

MySQL5.7官方文档

通过man文档查看:软件命令说明

  • man文档可以对mysql的一些基本工具及后台命令求帮助
查看命令说明:
	# man mysql	
	# man mysql_install_db
	# man mysqldump
	# man mysqld

MySQL的命令行求帮助:主要针对SQL语句说明

  • 需要进入mysql
  • 在mysql内部,没有clear命令,也就是无法使用clear实现清屏,如果想实现清屏操作,可以使用快捷键Ctrl + Shift + L
进入mysql:
	# mysql -uroot -p

通过help或?查看帮助:
	mysql> ? 或	mysql> help;		=>	查看命令帮助


	如果想深入了解sql语句的增删改查:
		mysql> help contents; 

	备注:出来啥选项就在前面加个'? 选项'进一步查看帮助即可,会显示相关语法

sql语句的基本操作

前置知识

MySQL内部结构:

我们平常所说的MySQL其实是MySQL数据库管理软件

一个MySQL DBMS 可以同时存放多个数据库,理论上一个项目对应一个数据库。如:博客项目的blog数据库、商场项目shop数据库、微信项目wechat数据库等

一个数据库还可以同时包含多个数据表,数据表才是真正用于存放数据的位置。理论上一个功能就对应一个数据表。如:博客系统中的用户管理功能,就需要一个user数据表、博客中的文章就需要一个article数据表、博客中的评论就需要一个message数据表

一个数据表又可以拆分为多个字段,每个字段就是一个属性(对应其功能的位置,如user表中的username、passsword字段)

一个数据表除了字段以外,还有很多行,每一行都是一条完整的数据(记录)

数据库和表的操作:

show查询数据库或数据表
database数据库
databases所有数据库
table数据表
tables当前数据库下所有数据表
use使用一个数据库
create创建数据库或数据表
alter修改数据库或数据表的编码格式,修改数据表名称,对数据表的字段(增删改)或字段类型(改),修改数据表的引擎
drop删除数据库或数据表

数据的操作:

insert对数据表插入记录
delete删除数据表的记录
update修改字段的值
select查询某个数据表记录

编码格式:

latin1MySQL数据库默认的编码格式是latin1 (拉丁文)编码格式,最大只有256个字符
gb2312 和 gbk因为中国汉字无法通过256个字符进行描述,所以早期开发个自己的编码格式gb2312(不兼容繁体), 后期升级为gbk(兼容繁体),用两个字符组合成为一个汉字
big5中国台湾因为早期gb2312不兼容繁体,所以自己开发了一套编码格式big5
utf8 和 utf8mb4标准化组织开发了一套多国通用的编码utf8(也称万国码),后来MySQL5.6版本以后又升级为utf8mb4(真正的UTF-8编码)

数据库的基本操作

  • 在MySQL5 以后的版本中,MySQL不支持更改数据库的名称。我们所谓的修改数据库主要修改的是数据库的编码格式

  • 创建数据库时,如果不指定字符集则默认使用MySQL的字符集latin1

  • default character set utf8 = default charset=utf8,两者用法一样

数据库的增删改查:

创建数据库:create
	#	mysql > create database 数据库名称;					=>	创建一个数据库
	#	mysql > create database 数据库名称 default charset=编码格式;		=>	创建数据库 并指定默认字符集
		演示:
			create database db_blog;						=>	创建数据库不指定编码格式,默认使用latin1编码格式
			create database db_blog default charset=gbk;	=>	创建数据库并指定gbk编码格式


	判断数据库是否已创建:if not exists
		#	mysql > create database if not exists 数据库名称 default charset=编码格式	=>	数据库不存在则创建,存在则给出一个警告提示
			演示:
				create database if not exists db_shop default charset=utf8;



查询数据库:show
	#	mysql > show databases;					=>	显示所有数据库

	#	mysql > show create database 数据库名称;		=>	显示某个数据库数据库的数据结构



修改数据库的编码格式:alter
	#	mysql > alter database 数据库名称 default charset=新编码格式;		=>	将某个数据库的编码格式修改为utf8
		演示:
			alter database db_blog default charset=utf8;



删除数据库:drop
	#	mysql > drop database 数据库名称;			=>	删除某个数据库



指定数据库:use
	#	use 数据库名称;			=>	使用某个数据库

数据表的基本操作

  • 创建数据表时,最后一个字段结尾是没有逗号,

  • 创建数据表前需要先指定某个数据库mysql > use DB_name,才能够在指定数据库下创建数据表

  • 在MySQL 5.6以后的版本中,MySQL的引擎默认为innodb

  • 创建数据表时如果不更改引擎,默认使用innodb

数据表的增删改查:

创建数据表:create
	#	mysql > create table 数据表名称(字段1 字段类型 [字段约束],字段1 字段类型 [字段约束],...)		=>	创建数据表,并指定字段和类型					

	#	mysql > create table 数据表名称(字段1 字段类型 [字段约束],字段1 字段类型 [字段约束],...) engine=引擎 default charset=编码格式;
					=>	创建一个数据表,并指定其引擎和编码格式
			演示:
				create table tb_user(id tinyint,username varchar(20),password char(32)) engine=innodb default charset=utf8;



查询数据表:show、desc
	#	mysql > show tables;					=>	查询指定数据库下所有数据表

	#	mysql >  show create table 数据表名称;		=>	显示某个数据表的创建过程(编码格式、字段等信息)		
	#	mysql > desc 数据表名称;						=>	显示某个数据表的字段和类型信息



修改数据表信息:alter
	数据表添加字段:add
		#	mysql > alter table 数据表名称 add 新字段名称 字段类型 first|[after 其他字段名称]
				选项说明:
					first:把新添加的字段放在第一位
					after 字段名称:把新添加字段放在指定字段的后面				
			演示:
				alter table tb_user add gender enum('男','女','保密') first		=>	将gender 字段添加为tb_user表第一字段
				alter table tb_user add gender enum('男','女','保密') after id	=>	将gender 字段添加到id字段后面
				
		
	修改字段名称或字段类型:change、modify			
		修改字段名称与字段类型(也可以只修改名称):
			#	mysql > alter table 数据表名称 change 旧字段名称 新字段名称 字段类型;		=>	修改字段名称,字段类型改也可不改
				演示:
					alter table tb_user change id number varchar(20);		=>	将id字段名称修改为number,字段类型不修改


		仅修改字段的类型:
			#	mysql > alert table 数据表名称 modify 字段名称 新字段类型;	=>	修改字段类型
				演示:
					alter table tb_user modify number varchar(40);		=>	将number字段类型varchar(20)修改为varchar(40)


	删除某个字段:drop
		#	mysql > alter table 数据表名称 drop 字段名称;		=>	删除一个字段
			演示:
				alter table tb_user drop gender;			=>	删除tb_user表中的gender字段


	修改数据表引擎(MyISAM或InnoDB): engine=
		#	mysql > alter table 数据表名称 engine=新引擎;		=>	修改某个数据表的引擎
			演示:
				mysql table tb_user engine=myisam;		=>	修改tb_user表的引擎为myisam


	修改数据表的编码格式:default charset=
		#	mysql > alter table 数据表名称 default charset=新编码格式;		=>	修改数据表的编码格式
			演示:
				alter table tb_user default charset=utf8mb4;			=>	将tb_user表的引擎修改为utf8mb4


	修改数据表名称:rename、alter
		移动数据表到另一个数据库并重命名:
		#	mysql > rename table 数据库名称.数据表名 to 新数据库名.新表名;		=>	将数据表移动到新的数据库下并重命名(也可不更改数据表名)		
		#	mysql > alter table 数据库名称.数据表名 rename 新数据库名.新表名;		=>	将数据表移动到新的数据库下并重命名(也可不更改数据表名)
			演示:
				alter table db_blog.tb_user rename db_wechat.tb_wechat_user;		=>	将db_blog数据库中的tb_user表移动到db_wechat数据库并更名为tb_wechat_user表


		只重命名,不移动数据库:rename、alter	
		#	mysql > rename table 旧表名 to 新表名;		=>	重命名数据库表名
		#	mysql > alter table 旧表名 rename 新表名;	=>	重命名数据库表名
			演示:
				alter table tb_user rename tb_host;			=> 将数据表tb_user名称更名为tb_host




删除数据表:drop
	#	mysql > drop table 数据表名称;

数据的基本操作

  • 在sql 语句中,除了数字字段类型,其他字段类型的值,都需要使用引号引起来,否则插入数据时会报错
  • 在插入数据时,可以不跟字段名,只要插入的数据与表中字段总数一致即可
  • 在修改字段的数据时,记得添加where子句,不然会将修改字段所有的数据都修改为新值

delete fromtruncate区别:

delete:删除数据记录

  • 数据操作语言(DML)
  • 在事务控制里,DML语句要么commit(成功),要么rollback(失败)
  • 删除大量记录速度慢,只删除数据不回收高水位线(不重新编号,接着删除前的编号,即自动增长约束)
  • 可以带条件删除

truncate:删除所有数据记录

  • 数据定义语言(DDL)
  • 不在事务控制里,DDL语句执行前会提交前面所有未提交的事务
  • 清理大量数据速度快,回收高水位线(high water mark)(重新开始编号,即自动增长约束)
  • 不能带条件删除

数据的增删改查:

数据的增加:insert
	#	mysql > insert into 数据表名称[(字段1,字段2,...)] values (字段1的值,字段2的值,...);		=>	对数据表中的字段插入数据
		演示:
			insert into tb_user(id,gender,username,password) values (1,'男','admin',md5('admin666'));
			insert into tb_user values (1,'男','admin',md5('admin666'));		=>	都是往数据表字段插入一条记录
		


数据的查询:	select
	#	mysql > selrct*from 数据表名称 [where 查询条件];		=>	查询某个数据表所有字段数据,还可以指定where子句精确查询某条记录
	#	mysql > select 字段1,字段2,.. from 数据库名称 [where 查询条件]=>	精确查询某数据表的某个字段的数据,还可以指定where子句精确查询某条记录
		演示:
			select*from tb_user;				=>	查询tb_user表的所有数据
			select*from tb_user where id=1;		=>	查询tb_user表中id=1字段这条记录
			
			select id,username from tb_user;	=>	查询tb_user表中id和username字段的所有数据
			select id,username from tb_user where password='admin666';		=>	查询tb_user表id和username字段的数据,但是password字段值需得为'admin666'




数据的修改:update
	#	mysql > update 数据表名称 set 字段1=新值,字段2=新值,.. where 更新条件;	=>	修改某表中符合某条件字段的值
		演示:
			update tb_user set gender='保密',password=md5('12as') where username='admin';	=>	修改admin用户的密码及性别
			
			
			假设学校需要将去年入学的学生年龄整体更新一次,年龄字段为age,表名为tb_student
					#	mysql > update 数据表名称 set 字段=字段[运算符]数字
						演示:
							update tb_student set age=age+1;		=>	该字段所有值就会自身加1




数据的删除:delete
		#	mysql > delete from 数据表名称[where 删除条件];		=>	删除某表中的所有记录或是符合某条件的记录
		#	mysql > truncate 数据表名称;			=>	清空数据表所有记录
			演示:
				delete from tb_user;		=>	删除tb_user表中的所有记录
				delete from tb_user where id=1;		=>	只删除tb_user表字段id=1的记录

自动增长(水位线)与主键约束

一般情况下,我们在设计数据表时,必须拥有一个类似id主键字段,非空、自动编号、主键约束。

查询数据时通过主键索引能够加快查询速度

自动增长:

  • 创建数据表时定义,一般设置某字段自动增长都会设置其为主键
auto_increment自动增长(对某个字段进行自动编号)
not null代表非空约束,这个字段只要是插入数据就必须要有值。如果与自动增长结合插入null就代表它自增长的值
#  myqssl > create table 数据表(字段1 字段类型 not null auto_increment,字段2 字段类型 [字段约束],...);

主键约束(非空、唯一):

  • 插入数据,id位置直接写null即可,不用另外写序号。系统会自动
primary key代表这个字段数据不能为空,且该字段的数据不能相同
第一种写法:跟在所在字段后面
	# mysql > create table 数据表(字段1 字段类型 not null auto_increment primary key,字段2 字段类型 [字段约束],...);


第二种写法:写到最后面
	# mysql > create table 数据表(字段1 字段类型 not null auto_increment,字段2 字段类型 [字段约束],...,primary key(id));

default 默认值:

default 约束用于向列中插入默认值。 如果没有规定其他的值,那么会将默认值添加到所有的新记录。 也就是说添加默认值之后该列就会有一个初始默认值,以后无论添加多少数据,只要没有主动改变改列的值那么就会默认该默认值

# mysql > create table 数据表(字段1 字段类型 not null auto_increment primary key,字段2 字段类型 [default 默认值],...);

数据类型

  • 在创建数据表时,必须明确指定字段的名称以及字段的类型

下图为MySQL中sql语句支持的字段类型:

整数类型

应用场景: 人的年龄、考试成绩等等相关的信息都可以使用整数类型进行存储

选择方式: 整数类型的选择主要取决于数值的范围

  • 比如存储中国人的人口信息,可以用INT类型也可以用BIGINT类型,但是在数据库设计原则中,不是越大越好,而是正好满足条件即可。否则浪费磁盘空间

整数类型存储字节范围
tinyint1-281 ~ 127
tinyint unsigned10 ~ 255
smallint2-32768 ~ 32767
smallint unsigned20 ~ 65535
mediumint3-8388608 ~ 8388607
mediumint unsigned30 ~ 16777215
int4-2147483648 ~ 2147483647
int unsigned40 ~ 4294967295
bigint8-2^63 ~ 2^63-1
bigint unsigned80 ~ 2^64-1
mysql> use 数据库名称;
mysql> create table tb_student(
	id mediumint unsigned not null auto_increment,
	username varchar(20),
	age tinyint unsigned,		=>	定义
	mobile char(11),
	primary key(id)
) engine=innodb default charset=utf8;

小数类型(浮点类型、定点类型)

浮点类型(近似值)

floatdouble:

  • float和double类型代表近似数字数据值。 float单精度浮点数精确到约7位小数,double双精度浮点数精确到大约15位小数 。类型浮点会随着数值的增大精度会减小(即单精度超过7位或双精度超过十五位选取的是数值的近似值)

举例说明:

  • float(M,D),其中,M表示存储的有效位数,D代表小数点后面的位数;即整数位数+小数部分不能超过M值。

  • 如:colum1 float(7,4),代表你插入为999.00009到cloum1列,那么mysql在存储时会四舍五入变为999.0001插入。

  • double(7,4) :double类型的使用与float类型完全一致,唯一的区别就是占用字节不同且浮点数的精度有所不同。

浮点类型精度存储字节精确性精确小数位数
float单精度4约7位,超过取近似值
double双精度8低,比float高约15位,超过取近似值

定点类型(精确值)

decimal 和 numeric:

decimal和numeric 类型的存储精确的数值数据。使用这些类型时,重要的是要保留精确的精度,例如使用货币数据。在MySQL中, numeric被作为decimal来应用,所以下面的举例decimal同样适用于 numeric

应用场景: 多用于货币数据的使用,避免数据存储时失真

举例说明:

  • decimal(M,D),其中,M代表精度,N代表刻度。M表示数值存储的有效位数,N表示小数点后面可存储的位数,即整数位数+小数部分不能超过M值。

  • 如:salary decimal(5,2),代表能够存储五位数和两位小数的任何值,因此可以存储在salary 列中的值的范围-999.99是 999.99

  • 特别注意:
    decimal(M)decimal(M,0)是相等的,存储长度取决于M的值,默认情况下M值为10.刻度为0表示没有小数。

浮点类型精度存储字节精确性精确小数位数
decimal高精度M字节(D+2 , 如果M < D)直接截取到给定小数位,不取近似值
mysql> use db_itheima;
mysql> create table tb_staff(
	id smallint unsigned not null auto_increment,
	username varchar(20),
	salary decimal(11,2),		=>	定义
	addtime date,
	primary key(id)
) engine=innodb default charset=utf8;

字符串 类型

char 类型 (定长)

char 类型的字符串定长,长度范围是0 ~ 255 之间,占用定长的存储空间,不足的部分用空格填充(空格也是占用磁盘空间);读取时删掉后面的空间

应用场景: 用于知道确定字符长度的字段,如:mobile char(11),身份证、 或是密码经过加密存储的数据password char(32)(比如密码经过md5加密后得到一个32位字符串)

存储空间:

  • char(M)类型的存储空间和字符集有关系,一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes、数字和字符统一用一个字符表示。

存储机制:

  • 在不够M长度时,MySQL在存储数据时,需要填充特殊的空格.
字符串类型存储字节储存空间特点
charM字节,1 <= M <= 255不足部分用空格填充占用定长的所有空间
mysql> use db_itheima;
mysql> create table tb_admin(
	id tinyint unsigned not null auto_increment,
	username varchar(10),
	password char(32),		=>	定义
	primary key(id)
) engine=innodb default charset=utf8;

varchar 类型(变长)

varchar类型是变长存储,仅使用必要的存储空间.

应用场景: 主要适合存储长度不固定的字符串信息,如用户名称、产品标题、新闻标题、新闻描述(不超过255个字符,超过建议用text类型)

存储空间:

  • varchar(M)类型的存储空间和字符集有关系,一个中文在utf8字符集中占用3个bytes、gbk统一占用2个bytes、数字和字符一个字符表示。

存储机制:

  • varchar(M)字段存储实际是从第二个字节开始存储,然后用1到2个字节表示实际长度,剩下的才是可以存储数据的范围,因此最大可用存储范围是65535-3=65532字节;

  • 第一个字节标识是否为空.(长度小于255字节,使用一个字节来表示长度;大于255字节使用两个字节来表示长度)。

字符串类型存储字节储存空间特点
varcharM字节 1<=M<=65535仅使用必要的存储空间,最大可用存储范围是65535-3=65532字节变长,用1到2个字节表示实际长度
mysql> use db_itheima;
mysql> create table tb_news(
	id int not null auto_increment,
	title varchar(80),			=>	定义
	description varchar(255),	=>	定义
	addtime date,
	primary key(id)
) engine=innodb default charset=utf8;

text 类型(文本)

text代表文本类型的数据,当我们使用varchar类型存储数据时(早期最大只能存储255个字符,MySQL5版本中,其gbk可以存储3万多个字符,utf8格式可以存储2万多个字符),如超过了varchar的最大存储范围,则可以考虑使用text文本类型。

255个字符以内(包括),定长就使用char类型,变长就使用varchar类型,如果超过255个字符,则使用text文本类型。

应用场景: 文本内容、产品的详细介绍等等

mysql> use db_itheima;
mysql> create table tb_goods(
  id int not null auto_increment,
  name varchar(80),
  price decimal(11,2),
  content text,		=>	定义
  primary key(id)
) engine=innodb default charset=utf8;

其他字符串类型

blob 类型:保存二进制的大型数据(字节串),没有字符集,eg:图片、音频视频等。

  • 在存储中很少将文件直接保存在数据库端,一般文件的存储都是基于路径进行操作的

enum 枚举类型:多选一,从给定的多个选项中选择一个,如gender enum(‘男’,‘女’,‘保密’)

set 集合类型:多选多,从给定的多个选项中选个多个,如hobby set(‘吃饭’,‘睡觉’,‘打豆豆’)

binary 类型和 varbinary 类型:类似charvarchar;保存字节字符串,而不是字符字符串,这意味着它们没有字符集(即保存的字符与存储的编码格式有关)

日期时间 类型

时间类型的选择比较简单,主要看你需要的时间格式,是年月日、小时分钟秒等等

date 类型(年-月-日):

  • date 类型用于具有日期部分但没有时间部分的值。 MySQL 以’YYYY-MM-DD‘格式检索和显示日期值。 支持的范围是’1000-01-01’到’9999-12-31’。

datetime 类型(年月日小时分钟秒):

  • datetime 类型用于同时包含日期和时间部分的值。 MySQL 以’YYYY-MM-DD HH:MM:SS‘格式检索和显示datetime 值。 支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。

datetime范围相对于timestamp范围更广,‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’

timestamp 类型(年月日小时分钟秒):

  • timestamp 数据类型用于同时包含日期和时间部分的值。 timestamp 的范围是 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC。

timestamp选项如果不插入时间,则MySQL会自动调用系统时间写入数据

以上是关于MySQL语句 - sql语句的主要内容,如果未能解决你的问题,请参考以下文章

python:mysql之ORDER BY 语句

SQL之SELECT语句排序

求一条sql语句,按照成绩降序排序,并显示名次,如123

MySQL高级SQL语句

sql语句大全

MySQL高级SQL语句