数据库(mysql)常用命令

一.常见的数据库端口号

Mysql默认端口:3306

oracle 默认端口:1521

Sql server 默认端口:1433

注:Mysql采用 的是C/S(客户端/服务器端)架构

二.sql 语法基础

服务器,数据库,数据表,记录,字段之间的关系:

一台Mysql服务器可以管理多个数据库

一个数据库可以存在多张二维表,

一张表可以存在多条记录,

一条记录由多个字段组成,

字段是最终的元数据.

注:# 为注释,不会被认为sql语句,每一条 sql语句以;(英文分号结尾)

数据库中常用的数据类型

整数:

int 有符号范围(-2147483648 ~2147483647),无符号范围(0 ~ 4294967295),

可以不用设置长度

小数;decimal, decimal(6,2)表示整数部分加小数部分

字符串:

字符串是一个或多个字符的序列,这些字符可以是字母、数字、标点符号等。在数据库中,字符

串通常用于存储文本数据,如姓名、地址、描述等。

在 SQL 语句中,使用引号可以明确告诉数据库该值是一个字符串,而不是其他类型(如整数或

浮点数)。如果不使用引号,某些字符或字符序列可能会被误认为是 SQL 命令或特殊字符,从而导

致错误。引号内的内容会被当作一个整体处理,包括其中的空格和特殊字符。

带引号的数据都是字符串,单引号、双引号都可以:

中文字符串:'文字信息'

英文字符串:'abc'

数字字符串:'123

变长字符串 :varchar 定长字符串 char
区别分析

1.都是用来存储字符串的,只是他们的保存方式不一样,并非是指对字符串长度的限制,字符串

长度的限制通过(数字)来限制长度。

2.char 有固定的长度,而 varchar 属于可变长的字符类型
日期时间 ;datetime
dete 只有日期

扩展知识 :
整数型,tinyint,int

拥有不同长度的整型

支持整数型,但是支持不同大小的整数型。

标准的整型,4 个字节!

支持 1,2,3,4,8 种类型的长度!长度的不同,意味着整型的范围是不相同的!

小数型,

float**,double,**decimal

MySQL 浮点型定点型可以用类型名称后加(M,D)来表示,M 表示该值的总共长度,D 表示

小数点后面的长度,MD****又称为精度和标度。

浮点数

浮点数按小数位数分为:单精度和双精度

float,占用 4 个字节,32bit,数值范围为-3.4E38~3.4E38(7 个有效位)

double,占用 8 个字节,64bit,数值范围-1.7E308~1.7E308(15 个有效位)

定点数

decimal,数字型,128bit,不存在精度损失

MySQL DECIMAL 数据类型用于在数据库中存储精确的数值。我们经常将 DECIMAL 数据类型用于

保留准确精确度的数据,例如货币数据。

sql 语句最常报错原因:

表名重复,字母输错, 中午输入法下输如逗号,该空格的地方没空格,

原因多是由于屏幕取词功能没有开启

创建表

数据库中 列与字段的区别:

实际存在表中的就是列

在运行时创建的,表中实际不存在的就是字段,例如聚合函数的查询结果

表名默认转换成小写,列名(字段)不区分大小写

语法:

create table 表名( 列名 类型(长度) 约束1 约束2 , 列名2 类型(长度) 约束1 约束2, ....... );

常见约束:

primary key (主键约束) :表中唯一的标识符,主键不允许重复,不允许为空,

not null (非空) :此列不允许写空值

auto_increment (自动递增):此列的值会自动递增填充

unsigned 无符号数 :

default 默认值 :当不填写时会使用默认值

unique 唯一:此字段不允许重复

check 检查约束: 确保列中的值满足特定的条件

foreign key ;维护两个表之间的关联关系

comment :备

主键与唯一约束的区别

1.同一张表中只能有一个主键,但可以有多个unique

2.主键的字段值不能为nul,唯一约束的字段值可以为null

  1. 主键字段可以作为其他表的外键,唯一约束不能做其他表的外键

注意:列名里面不能有空格
例 1 :创建学生表 students 字段 1 :姓名 name( 变长字符串,长度为 10) ,并编写备注

create table students ( name varchar(10) comment '姓名') comment '学生表';

例 2:创建学生表 student2,

字段 1:id(整数类型,不能有符号、主键、自动递增),

字段 2:姓名 name(变长字符串长度为 20、默认值为刘德华),

-字段 3:年龄 age(整数类型、不能有符号、默认值为 20),

字段 4:身高 high(小数类型,一共 5 位数字,保留小数点后两位)

create table student2(

id int unsigned primary key auto_increment,

name varchar(20) default '刘德华',

age int unsigned default 20,

high decimal(5,2)

);

字段都已经限制是 int 了,有必要还搞一个 unsigned 吗?

如果只限制 int,那么是可以输入、保存负数的

如果是 int+unsigned,那么只能输入、保存 正整数。

插入一列

alter table 表名 add 列名 类型(长度) 约束 1 约束 2
例:给表 students 增加一列地址 address ,类型:变长字符串,长度 20

alter table students add address varchar(20);

关于反引号(``)的使用:

反引号在 mysql 中是为了区分 mysql 中的保留字符与普通字符而引入的符号,例如在出现字段

名与 SQL 关键字相同、标识中含空格等情况下就需要使用,否则可能出错,但反引号不是必须的,

在确保不会导致歧义发生的情况下可以省略掉。

删除一列

alter table 表名 drop 列名

例:删除表 students 中的地址列 address

alter table students drop address ;

删除表

  1. drop table 表名 若表不存在,报错,停止执行

2.drop table if exists 表名 若表不存在,不报错继续执行
一次性删除多张表,用逗号隔开表名即可

添加行信息

一.添加多行信息

insert into 表名 values (值 1, 值2 ,....),(值 1, 值2 ,....),...;

二.跨行添加信息

insert into 表名 (列名1,列名2,列名3) values(值1,值2,值3);
例:在 student3 表中,新增一行,添加几个单元格的信息:姓名 name :王五;性别 sex :男
insert into student3 (name ,sex )values('王五','男');

删除行数据

delete from 表名 where 列名 =列值 ;
例 1 :删除 student3 表中 id 为 6 的行数据

delete from student3 where id=6

注意:仅执行delete from 表名; 将会删除表格中的所有行信息

update 修改数据

update 是对已经存在的数据进行修改

修改一列的值

格式:

update 表名 set列名=新值

例:给表 student 增加一列 idcord,类型:整数,然后,设置 idcord列的值为3

alter table student add idcord int;

update student set idcord =3;

修改行中多个单元格的值

格式:

update 表名 set 列1=值1,列2=值2 ....where 列名=列值;
例:将表 student 中, id 为 5 的学生,姓名 name 修改为 狄仁杰,年龄 age 修改为 20

update student set name='狄仁杰',age=20 where id=5;

将一列值增加

格式:

update 表名 set 列名=列名+i;
例: 将 student 表中,年龄列都增加 1
update student set age=age+1;

select 查询语句

查询表格全部信息

格式:

select * from 表名

查询某一列的信息

格式:

select 列名 from 表名

查询某几列的内容

格式:

select 列1 ,列2 from 表名

**where ●**难点

当需要缩小范围、限制条件的时候,可以通过 where......语句实现。

每条语句只能有一条where语句
查询行信息

在表名之后,使用 where 对表中的数据筛选,符合条件的数据会出现在结果中

语法:

select * from 表名 where 列名=列值

where 后面支持多种运算符,对条件进行处理

小于等于 <=

大于等于 >=

不是 xx 的所有结果 !=

比较运算、逻辑运算、模糊查询、范围查询、空判断

别名 as (多表联查经常使用)

给表名起一个别名 ,不会实质性修改表的内容,目的是为了使语句写起来更加简单

select * from 表名 as 别名

注意:别名可以为中文,为中文时,加不加引号都可以,仅在这一次查询中起作用

在等值连接,子查询中表名一旦起了别名,除了起别名的地方,其他地方,都只能使用别名

一旦使用原名,就会保存

distinct 消除重复行(结果展示一个)

在 select 后面 列名 前使用distinct 可以消除重复的行

语法:

select distinct 列名 from 表名

例:查询 student 表中,学生家乡 hometown 分布情况,结果去除重复

select distinct hometown form student ;

比较运算符

等于 =
大于 >
大于等于 >=
小于 <
小于等于 <=
不等于 != 或 <>

逻辑运算符

在 sql语句中:当需要 缩小范围,限制条件时,首先考虑使用where,如果sql 语句中已经有了

where ,则使用 and ,where 只能有一个,and可以有多个

having 只能用于group by 之后, 对内容进行 进一步的过滤

and (并且):

显示结果是多个条件(多个and)必须同时满足的结果
例 1 : 在 student 表中,查询 2 班的男同学的信息

select * from student where class='2班'and sex='男';

or 或者:

多个条件中,哪个条件能满足,就显示他的查询结果,

如果都满足,都显示
在 student 表中,查询 studentno 是 5 ,或 名字为王昭君的学生信息
select * from student where name=5 or studentno='王昭君';

Not 取反

效果跟 != 一样
例: 在 student 表中,查询家乡不是天津的学生信息
select * from student where not hometown='天津';

模糊查询 like

% 表示任意多个字符,或 什么字符都没有, 主要适用字数不限制的场景

_表示一个任意字符,适用字数限制的场景

% 表示任意多个字符

like '李%' 模糊查询以 百字开头的内容

like '% 飞'模糊查询以飞字结尾的内容

like'%白%'表示内容中包含白的内容(无论第几个字)

like_表示 一个 任意字符,'李_'表示内容有 2 个字,第一个字是李

like'_亮'表示内容有 2 个字,内容第二个字是亮

like''表示内容是 3 个字,中间的字是尚

范围查询 in

in : 在一个 非连续范围内的值,跟or效果一样
格式:
select * from 表名 where 列名 in (值1,值2,......);
not in 表示不在这个范围之中

between...and....在一个连续则范围中

只适用于连续的范围内的数字

效果等同于 >= xx and <== xx

格式:

select * from 表名 where 列名 between 值1 and 值2

空判断

注意:null 与''''是不同的

null 是没有任何数据的''''是空字符串
判空 is null
例 1 :在 students 表中,查询没有填写 card 信息的学生信息
select * from students where card is null

order by 排序

语法:

升序 (从小到大): select * from 表名 order by 列名 asc (asc 可省略)

降序 (从大到小):select * from 表名 order by 列名 desc:
将行数据按照列 1 进行排序,如果某些行列 1 的值相同时,按照列 2 排序,以此类推
语法:
select * from 表名 order by 列1 asc/desc ,列2 asc/desc,......
排序语法一般放 sql 语句的最后面,当表的范围已经确定,已经过滤了之后,最后排序
例 2 :在 students 表中,查询所有学生信息,年龄从大到小排序,年龄相同时,按学号升序排序
select * from student order by age desc,sno asc;

聚合函数

为了快速得到统计数据,常会用到聚合函数,常在select之后使用,from之前使用

注意:聚合函数不能在where中使用,常在group by中使用

注意:使用聚合函数查询时,不能编辑代码并显示其他的列名,行信息是不对应的

分组+聚合 除外

count(*) 统计表格的行数

格式:

select count(*) from 表名

**max()**最大值

格式:

select max(列名) from 表名

说明:聚合函数从此处开始,括号内的内容是筛选数据范围的列名,含义与 count(*)不同。

例:在 students 表中,查询女生的最大年龄

select max(age) from students

**min()**最小值

格式:

select min(列名) from 表名

例:在 students 表中,查询 1 班学生的最小年龄

select min(age) from students

**sum()**求此列的和

注意:使用 sum(列)时,不能编辑代码并列显示其它的列名,行信息是不对应的,分组 + 聚合

除外。

格式:

select sum(列名) from 表名

例:查询北京学生的年龄总和

select sum(age) from students where hometown='北京'

**avg()**求此列的平均值

注意:使用 avg(列)时,不能编辑代码并列显示其它的列名,行信息是不对应的,分组 + 聚合除

格式:

select avg(列名) from 表名

例:查询女生的平均年龄

select avg(age) from students where sex='女'

等值连接,内连接,左连接,右连接查询

当查询结果的列来源于多张表时,要将多张表连接成一个大的数据集,选择合适的列返回

等值连接查询和内连接查询: 查询的结果为连个表匹配的到的数据

左连接查询:查询结果为两个表匹配得到的数据加左表特有的数据

,于右表的数据用null填充

右连接查询:查询结果为两个表匹配得到的数据加右表特有的数据

,于左表的数据用null填充

等值连接:

等值连接语法:

select * form 表1,表2 where 表1.列名=表2.列名

(等值连接是通过值相等,来连接的,列名不同,也可以等值连接)

多表联查时,表示某一列时:要以表名.列名的格式来表示

3表联查的等值连接语法:

sleect * form 表1,表2 where 表1.列名=表2.列名 and 表2.列名=表3.列名

内链接

语法:

select * from 表1 inner join 表2 on 表1.列=表2.列

3表联查

select * form 表1 inner join 表2 on 表1.相同列=表2.相同列

inner join 表3 on 表2.相同列=表3.相同列

(inner join 语法中,inner 可以省略)

左连接

语法:(注:左表是主表,主表的名字放在 left join 的左边)

select* form表1 left join 表2 on 表1.列=表2.列

三表联查

select * from 表1 left join 表2 on 表1.相同列=表2.相同列

left join 表3 on 表2.相同列=表3.相同列

右连接

语法:

select* from表1 right join 表2 on 表1.相同列=表2.相同列

三表联查

select * from 表1 right join 表2 on 表1.相同列=表2.相同列

right join 表3 on 表2.相同列=表3.相同列

on和using的区别

多表联查,也可以试用using,结果有一定的区别

使用 using 进行多表联查的语法:

select * from 表 1 join 表 2 using(列名)

using ,是通过列名将表格连接到一起的,列名必须一致

区别 1. 语法不一样

2.使用on,结果会显示2个字段,使用using,结果只会显示1个字段

3.使用on,字段名称可以不一样,是通过等值进行的连接,使用using

字段名必须一致

union联合查询

union all

连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录

union

连接数据集关键字,可以把两个查询结果拼接为一个,会过滤掉相同的记录
例:
( students 的 studentno 列是主键,不允许重复,未设置自动递增,需手动指定值)

select name,age,class from student3

union

select name,age,class from students;

相同的查询记录会被过滤掉,只显示一次

select name,age,class from student3

union all

select name,age,class from students;

相同的查询记录不会被过滤掉,有多少条记录,就显示多少条记录

group by 分组

按照字段分组显示,此字段相同的数据会被放到分组后的一个组中,显示的结果是组名

,并不意味着该组中只有一行数据

分组之后可以利用having+聚合函数进行过滤

分组(group by )依据的列名,要出现在select之后,from之前的位置,否则逻辑错误,

查询可以成功,但是查询的结果并非一一对应

格式:

select 列 from 表名 group by 列

例:在student表中查询 按照 家乡分组

select hometown from student where hometown

having 使用

关于 where ,and having的使用方法:

当要缩小范围,限制条件,首先要考虑where ,如果SQL语句中已经有了where 了

那就使用and ,一条SQL语句只能有一个where ,可以有多个and,

having 只用 在group by 的 分组后的结果进行筛选,having后面的运算条件

跟 where 的相同

分组并统计

格式select列 from 表名 group by 列 having count(*) ......

例:统计student 表中,生源地学生的数量大于1的生源地名称

select hometown form student group by hometown having count(*)>1

分组,聚合运算

子查询中如果括号中select语句中出现分组+聚合函数,必须在括号里的select之后,from之前的聚合函数名称字后起别名 ,以供括号外的select语句调用,如果不起别名,命令就会保存!
如果括号外的 select 语句无需调用该聚合函数列的话,则不用起别名。

语法:

select 列,聚合 ...from 表名 group by 列

扩展)使用第一个分组条件分组后,再使用第二个分组条件进行分组

语法:

select 条件 1,条件 2 from 表名 group by 条件 1,条件 2

例:在 students 表中,统计每个班的每种性别的人数

select class ,sex count(*) from student group by class sex

limit 获取部分行

语法:

select * from 表名 limit x, y

x 表示 从第?行开始,y表示一共显示的行数 ,x为零时

可以省略

计算机的索引从0开始

子查询

在一个select语句中,嵌入另外一个select 语句,那么被嵌入的select

语句称之为子查询

主查询和子查询的关系:

子查询前后加括号,嵌入到主查询中,子查询是辅助主查询的,要么充当条件(值),要么充当

数据源,子查询是可以独立存在的语句,是一条完整的 select 语句

子查询分类:

标量子查询、列级子查询、行级子查询、表级子查询

标量子查询

标量子查询的定义:

子查询返回的结果是表中1个单元格的数据,供外部查询语句查询

例1:查询班级学生的平均年龄

select avg(age)from student

例2,查询学生表中年龄大于平均年龄的学生信息

select * from student where age>(select avg(age) from studetnt)

列级子查询

子查询的结果是一列(一列多行) ,供外 外部查询语句查询
假如子查询的结果是一列一行,由于数据外边有括号,外部查询语句仍然可以通过 in 来调用。

例 1: 根据18岁学生的学号,查询其成绩

学生表中查询18岁的学生的学号

select studentno form students where age=18

通过学号查询查成绩

select * from scores where studentno in('002','006');

通过列级子查询一部到位:

select * from scores where studentno in(select studentno form students where age=18)

行级子查询

行级子查询定义:

返回的结果是一行(一行多列),供外部查询语句其中的几个数据进行匹配

注意:

行级子查询,只能使用 = ,若使用!=连接,查询结果不准确,想要用!=的场景需要使用标量子查

询,使用 and 连接。

例 1:查询与百里玄策同性别、同班的学生信息

标量子查询:

select * from students where sex =

(select sex from students where name = '百里玄策')

and class =

(select class from students where name = '百里玄策')

行级子查询:

select * from students where (sex,class) =

(select sex,class from students where name = '百里玄策')

例 2:查询与百里玄策性别、班级都不相同的学生信息

只能使用标量子查询

select * from students where sex != (select sex from students where name = '百里玄策') and

class != (select class from students where name = '百里玄策')

表级子查询

表级子查询的定义:

内部查询结果是两行两列以上 (就可以理解为是一张表),供外部查询语句使用

当使用 select * from 表 1 a,(表级子查询) b where a.列名 = b.列名 这个表级子查询语法时,

必须给第二张表起别名,否则会报错。

子查询中的聚合函数查询结果,如果需要被主查询调用时,需要给聚合函数起别名,否则报错。

例 1:查询每个班级中比自己班级平均年龄低的学生的姓名、年龄、班级

(2 表联查,表级子查询)

第一步,按照班级分组,查询每个班级的平均年龄,得到一张表

select class,avg(age) from students group by class

第二步,2 表联查,表级子查询,限制条件

select * from

students a,(select class,avg(age) b1 from students group by class) b

where a.class = b.class and a.age < b.b1

子查询中特定关键字使用

in : (相当于多个 and)

主查询 where 条件 in (列子查询)

any | some : (相当于多个 or)

主查询 where 列 = any (列子查询)在条件查询的结果中匹配任意一个即可,

all:

主查询 where 列 = all(列子查询) : 等于里面所有格式,等价于 in

主查询 where 列 <>all(列子查询) : 不等于其中所有,等价于 not in

相关推荐
小诸葛的博客6 分钟前
pg入门12—pg中的subscriptions是什么
数据库·oracle
青云交7 分钟前
大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略
大数据·数据库·elasticsearch·搜索引擎·数据分析·高效搜索·可扩展性·电商平台、新闻媒体、企业内部
Flying_Fish_roe8 分钟前
Flyway 数据库差异处理
数据库·oracle
知行合一。。。16 分钟前
MySQL调优--11--分批插入/更新数据 ---案例
数据库·windows·mysql
江凡心39 分钟前
Qt 每日面试题 -2
开发语言·数据库·qt·面试
炬火初现1 小时前
Mysql进阶——1
数据库·mysql
代码吐槽菌1 小时前
基于SpringBoot的在线点餐系统【附源码】
java·开发语言·spring boot·后端·mysql·计算机专业
罗小罗同学1 小时前
困扰霍金和蔡磊等人的渐冻症,能否在医学AI领域寻找到下一个解决方案?|个人观点·24-09-22
数据库·人工智能·医学图像处理·医学人工智能·渐冻症
TTBIGDATA1 小时前
【ranger编译报错】cloudera-manager-api-swaggerjar7.0.3 not found
java·大数据·数据库·hadoop·oracle·ambari·cloudera
Idiot_20181 小时前
centos 安装配置mysql
mysql·adb·centos