数据库(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

相关推荐
Python私教8 分钟前
model中能定义字段声明不存储到数据库吗
数据库·oracle
mqiqe3 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
工业甲酰苯胺3 小时前
MySQL 主从复制之多线程复制
android·mysql·adb
BestandW1shEs3 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师3 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球3 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...3 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00013 小时前
MySQL的权限管理机制--授权表
数据库
wqq_9922502773 小时前
ssm旅游推荐系统的设计与开发
数据库·旅游