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)语句:
- 数据定义语言这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括
create
、drop
、alter
、rename
、truncate
DML(Data Manipulation Language)语句:
- 数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括
insert
、delete
、update
等
DCL(Data Control Language)语句:
- 数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括
grant
、revoke
等
DQL(Data Query Language)语句:
- 数据查询语句,用于从一个或多个表中检索信息。主要的语句关键字包括
select
MySQL中如何求帮助
通过官方文档查看:软件安装下载说明
通过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 | 查询某个数据表记录 |
编码格式:
latin1 | MySQL数据库默认的编码格式是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 from
与truncate
区别:
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类型,但是在数据库设计原则中,不是越大越好,而是正好满足条件即可。否则浪费磁盘空间
整数类型 | 存储字节 | 范围 |
---|---|---|
tinyint | 1 | -281 ~ 127 |
tinyint unsigned | 1 | 0 ~ 255 |
smallint | 2 | -32768 ~ 32767 |
smallint unsigned | 2 | 0 ~ 65535 |
mediumint | 3 | -8388608 ~ 8388607 |
mediumint unsigned | 3 | 0 ~ 16777215 |
int | 4 | -2147483648 ~ 2147483647 |
int unsigned | 4 | 0 ~ 4294967295 |
bigint | 8 | -2^63 ~ 2^63-1 |
bigint unsigned | 8 | 0 ~ 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;
小数类型(浮点类型、定点类型)
浮点类型(近似值)
float 和 double:
- 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在存储数据时,需要填充特殊的空格.
字符串类型 | 存储字节 | 储存空间 | 特点 |
---|---|---|---|
char | M字节,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字节使用两个字节来表示长度)。
字符串类型 | 存储字节 | 储存空间 | 特点 |
---|---|---|---|
varchar | M字节 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
类型:类似char
和varchar
;保存字节字符串,而不是字符字符串,这意味着它们没有字符集(即保存的字符与存储的编码格式有关)
日期时间 类型
时间类型的选择比较简单,主要看你需要的时间格式,是年月日、小时分钟秒等等
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语句的主要内容,如果未能解决你的问题,请参考以下文章