【MySQL 数据库 基础】基础sql语句

MySQL基础语法

学习数据库的核心:CRUD 增删查改

C : create 新增

R : retrieve 查找

U : updatee 修改

D : delete 删除

一、数据的操作:

1.1、显示数据库

show databases;

显示数据库,查看当前的MySQL服务器上有多少个数据库。

在这里插入图片描述

上面显示的是数据库自带的,

控制台输入一个命令 = > mysql客服端构造一个请求 = > 请求通过网络被发送给服务器 = > 服务器收到请求,并解析出其中的命令 => 服务器执行命令,完成增删查改操作 => 然后把结果打包成一个响应 => 通过网络把响应发回给客服端 = > 客服端在解析,最终显示到界面上。

所以说MySQL 的客服端 and 服务器 是通过网络来通信的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Nocvj6D-1661082830895)(D:\常用文件夹\资料信息图片\Typora-image\Image\image-20220816214358587.png)]

0.01 sec => 0.01 s

对于人来说很快,但是对于计算机而言0.01s是非常慢的,正因为如此,在一个大型系统中,MySQL经常会成为性能瓶颈。

1.2、创建数据库

create database [if not exists] [数据库名];  -- 注意“;”用英文
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)

出现这种提示说明操作成功,mysql里面新增了一条记录。

在MySQL服务器上,有若干个数据库(视为是一组数据逻辑上的集合)

  • 一个数据库 = > 包含若干个表
  • 一个表 => 包含若干行(若干行记录)
  • 一个行 => 包含若干列(若干个字段)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYans9a5-1661082830895)(D:\常用文件夹\资料信息图片\Typora-image\Image\image-20220816222504436.png)]

[if not exists]  --判断数据库是否存在,如果不存在,就创建;存在,啥也不干。
  • 完整代码:
create database [if not exists] 数据库名   --if not exists 可加可不加
mysql> create database if not exists aaa;
Query OK, 1 row affected (0.00 sec)

mysql> create database if not exists aaa;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> create database aaa;
ERROR 1007 (HY000): Can't create database 'aaa'; database exists

如果数据库的名字已经存在,你再次创建同名数据库,就会出现一个警告 “warning”,但是不会报错;如果你不加 if not exists 就会报错。

1.3、选中数据库

use [数据库名]
mysql> use aaa;
Database changed

选中这个数据库,那么我们接下来就围绕 aaa 这个数据库展开;

1.4、删除数据库

drop database [if exists] [数据库名];
mysql> drop database aaa;
Query OK, 0 rows affected (0.00 sec)
[if exists]  -- 数据库存在就删除,不存在就不删除;
mysql> drop database if exists aaa;
Query OK, 0 rows affected (0.00 sec)

这里的 drop 是删除的数据库表操作,后面还有 delete 是删除一条记录,不可混为一谈。

注意:

在数据库里面删除是危险的操作,在工作中把公司的库删了,数据很可能就恢复不了,你就会有很大的麻烦,极端情况可能要蹲局子。

二、数据类型

整型和浮点型:

数据类型大小说明对应 java 类型
BIT[ (M) ] M指定位数,默认为1二进制数,M范围从1到64, 存储数值范围从0到2^M-1常用Boolean对应BIT,此时默认是1位,即只能存0和1
TINYINT1字节Byte
SMALLINT2字节Short
INT 4字节Integer
BIGINT8字节Long
FLOAT(M, D) 4字节单精度,M指定长度,D指定小数位数。会发生精度丢失Float
DOUBLE(M, D) 8字节Double
DECIMAL(M, D)M/D最大值+2双精度,M指定长度,D表示小数点位数。精确数值BigDecimal
NUMERIC(M, D)M/D最大值+2和DECIMAL一样BigDecimal

1、BIT(M) 表示一个二进制位数的多少次方;

​ > BIT(1) 表示 0,1;

​ > BIT(10) 表示 0~1024;

2、FLOAT(M,D) ,M表示有效数字的长度,D表示小数点后的位数;

​ > FLOAT(3,1) ;

​ > 插入一个45.6 合法;

​ > 插入一个45.6 非法;

​ > 插入一个456 非法;

3、DECIMAL(M, D)

​ 也是表示小数,但是比float和double表示的小数更精确,在IEEE 754 标准中 float和double都只能表示一个近似的值,

优势:能够更精确的表示小数;

劣势:付出很多的时间和空间的代价;

decimal 表示一个小数,decimal(3,1)有效数字长度为3,小数点后保留1位。

90.1 ; 60 ; 89.1 ; 1.1 ;–> 合法数据

100.0 ; 1.23 ; --> 非法数据

如果我们用来表示的话需要用更精确的类型来表示,那么 decimal 类型再适合不过了。

我们也是可以用int 或者 double 类型代替 decimal,因为钱一般都精确到小数点后两位(分),直接用int也行,那么钱的单位就是 分 了。

2.2、字符串类型

数据类型大小说明对应java类型
VARCHAR (SIZE) 0-65,535字节可变长度字符串String
TEXT 0-65,535字节长文本数据String
MEDIUMTEXT0-16 777 215字节中等长度文本数据String
BLOB0-65,535字节二进制形式的长文本数据byte[]

1、varchar(size) 是SQL里面最常用的类型,可变长度的字符串;(size)表示这个字符串的最大长度,单位是字符。

varchar(20) 表示,此时这个字段里面最大的长度就是20个字符。

汉字算一个字符,但是不算一个字节。

SQL 使用单引号来环绕文本值。如果是数值,请不要使用引号。

按照别的说法来说就是varchar类型(也可以说是String、字符串类型)这一些在数据库语句中使用的时候应该使用单引号,而不是直接使用。

2、text 根据用户插入的数据来动态确定占用的空间;

3、blob 是保存二进制 类型的数据 (前三个都是保存文本类型的数据)

把图片,mp3,视频等格式,都是二进制数据,如果要把这个保存的mysql中就可以使用 blob类型,

2.3、日期类型

数据类型大小说明对应java类型
DATETIME8 字节范围从1000到9999年,不会进行时区的检索及转换。java.util.Date、java.sql.Timestamp
TIMESTAMP4 字节范围从1970到2038年,自动检索当前时区并进行转换。java.util.Date、java.sql.Timestamp

这两个日期类型都是比较常用的类型,表示 年月日时分秒

1、timestamp :时间戳,计算机通过时间戳来表示时间,以1970年1月1日0时0分0秒 为基准的时间,计算机当前时刻和基准时刻的时秒数之差,差值是很大的整数,管这个数字就叫做“时间戳”。

​ 4个字节表示的数据是 -21亿~21亿,现在时间我们的时间戳大概是 16亿,他们两个已经非常接近了,所以到了2038年之后,timestamp类型,就用不了了,尽量用 8个字节的数据类型(datetime)。


小小的总结下常用的类型:

1、整数 :int

2、小数: doubledecimal

3、字符串: varchar

4、时间: datetime


三、数据的操作

1、创建表;
2、查看表;
3、查看表结构;
4、删除表;

3.1 、创建表

创建表之前,首先要选中数据库。

create table 表名(列名 列类型, 列名 列类型);

使用"“()” 把若干个列给包裹起来,每个列里面包含列名和列类型,列和列之间使用 逗号 来分割。

注意一些空格和标点符合的位置和写法,sql的语法格式比较的严格。

取名字的时候,不要与SQL语句的关键字重复了,如果是关键字使用反引号(``)把名字引起来.

3.2、查看当前的数据库有哪些表

show tables;

3.3、查看指定的表结构

需要查看表的列有哪些,以及类型是啥。

desc/describe 表名;

在这里插入图片描述

3.4 、删除表

drop table 表名;
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)

涉及到删除操作的需要谨慎谨慎再谨慎。

3.5、新增数据 (insert)

往一个数据表中 新增数据。

insert into 表名 values (列的值,列的值,列的值.....);

在这里插入图片描述

1、()里面的数据要与表中的列对应,列的数目一致,列的类型一致。

2、在SQL中单引号和双引号都能表示字符串,SQL更习惯用单引号


指定列插入:

直插入某几个列,不全部插入。

insert into 表名([列名], [列名]...) values ([][]...);
insert into student(id, qq_mail) values (2,"123.qq.com");

1、只插入了两列,name的列还没有插入,那么name这一列就是默认值,默认值就是NULL。

2、列名要与定义的表相同,名字也要匹配。


一次多行插入

values 后面带有多个 (),()和()之间用 逗号 分割。

insert into student values (3,'zhangsan','234.qq.com'),(4,'李四','345.qq.com');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

这种一次多行插入效率会比 sql 一条一条语句插入高。

3.6、去重查询 (distinct)

针对指定的列,把相同的值的记录给去重

select distinct [列名],[列名]... from [表名];
  • 单个去重:
select distinct [列名] from [表名];
  • 多个去重:
select distinct [列名],[列名]... from [表名];

针对多个列去重,要求这些列都相同的时候,才视为是一个重复的记录

在这里插入图片描述

两条记录没有相同,上图就没有触发去重。

四、查询语句 (select) ☆

查询语句在SQL中是最复杂的环节,查询使用的方法和技巧样式多样,复杂程度远比 增删改 要高。

4.1、全列查询

select * from 表名;

查找表中的所有数据(所有列和行)

select 的查询,只是一个“临时表”,这个“临时表”仅仅在内存里存了一下,然后打印出来给我们看,之后就没了,不会持久化存储。

在生产环境中,全列查询你就需要多注意,全列查询是会返回所有的数据,如果这个表非常的庞大,那么可能会把服务器的网络带宽给吃满,导致服务器无法正常的工作了。

4.2、指定列查询

select [列名], [列名]... from [表名];

根据列的名字,来决定查列写列。

mysql> select name from exam_result;
+-----------+
| name      |
+-----------+
| xxx       |
| xxx       |
| xxx       |
| xxx       |
+-----------+
7 rows in set (0.00 sec)

查询的列名根据查询的表对应,表里面没有的列名,会报错。

4.3、查询字段为表达式

可以通过表达式,来对查询结果进行一些计算。

计算是列与列之间计算,和行无关

select [列名], [列名+列名+列名...] from [表名];
mysql> select name, chinese+math+english from exam_result;
+-----------+----------------------+
| name      | chinese+math+english |
+-----------+----------------------+
| xxx       |                221.0 |
| xxx       |                242.5 |
| xxx       |                276.5 |
| xxx       |                233.0 |
+-----------+----------------------+
7 rows in set (0.00 sec)

如果给某个列指定一个常量,此时常量会作为表达式,在每一行中出现。

select [列名], [列名] , 常量 from [表名];
mysql> select name, id , 10 from exam_result;
+-----------+------+----+
| name      | id   | 10 |
+-----------+------+----+
| xxx       |    1 | 10 |
| xxx       |    2 | 10 |
| xxx       |    3 | 10 |
| xxx       |    4 | 10 |
+-----------+------+----+
7 rows in set (0.00 sec)

如果给一列做四则运算也是可以的

select name, math+10 from exam_result;
mysql> select name, math+10 from exam_result;
+-----------+---------+
| name      | math+10 |
+-----------+---------+
| xxx       |   108.0 |
| xxx       |    88.0 |
| xxx       |   108.5 |
+-----------+---------+
7 rows in set (0.00 sec)

虽然能算出结果,但是select的查询,生成的一张“临时表”,不会对MySQL 服务器的硬盘上的数据做出任何修改。

查询字段表达式还可以给表达式去一个别名

mysql> select name, chinese+math+english as totle from exam_result;
+-----------+-------+
| name      | totle |
+-----------+-------+
| xxx       | 221.0 |
| xxx       | 242.5 |
| xxx       | 276.5 |
+-----------+-------+
7 rows in set (0.00 sec)

通过 as 这个关键字 就可以 给表达式去一个别名。

我们一个可以把关键字 as 给去掉,也是没问题的

select name, chinese+math+english totle from exam_result;

4.4、排序

排序都会有两种规则:1、升序排序(从小到大); 2、降序排序(从大到小);

通常跟 查询操作 搭配使用;

select * from [表名] order by [列名];

order by 是指定顺序,默认是升序。

mysql> select * from exam_result order by english;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    7 | xxx       |    75.0 | 65.0 |    30.0 |
|    5 | xxx       |    55.5 | 85.0 |    45.0 |
|    1 | xxx       |    67.0 | 98.0 |    56.0 |
|    4 | xxx       |    82.0 | 84.0 |    67.0 |
|    2 | xxx       |    87.5 | 78.0 |    77.0 |
|    6 | xxx       |    70.0 | 73.0 |    78.5 |
|    3 | xxx       |    88.0 | 98.5 |    90.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)

降序需要在 最后 加上 desc(descending)。

mysql> select * from exam_result order by english desc;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    3 | xxx       |    88.0 | 98.5 |    90.0 |
|    6 | xxx       |    70.0 | 73.0 |    78.5 |
|    2 | xxx       |    87.5 | 78.0 |    77.0 |
|    4 | xxx       |    82.0 | 84.0 |    67.0 |
|    1 | xxx       |    67.0 | 98.0 |    56.0 |
|    5 | xxx       |    55.5 | 85.0 |    45.0 |
|    7 | xxx       |    75.0 | 65.0 |    30.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)

排序也可以针对多个列来排序;

select * from [表名] order by [列名1] desc/asc, [列名2] desc/asc...;

1、在多列排序中 ,先排序 列名1 ,如果 列名1相同,再 列名2 排序,写在前面的列更重要。

2、针对每个列后,都可以 加 desc/asc 来控制正序还是降序。

在这里插入图片描述

3、排序的时候,如果某个值是NULL,则视为最小值。

mysql> select * from exam_result order by math, english desc;
+------+-----------+---------+------+---------+
| id   | name      | chinese | math | english |
+------+-----------+---------+------+---------+
|    8 | yuanye    |    NULL | NULL |    NULL |
|    7 | xxx       |    75.0 | 65.0 |    30.0 |
|    6 | xxx       |    70.0 | 73.0 |    78.5 |
|    2 | xxx       |    87.5 | 78.0 |    77.0 |
|    4 | xxx       |    82.0 | 84.0 |    67.0 |
|    5 | xxx       |    55.5 | 85.0 |    45.0 |
|    3 | xxx       |    88.0 | 98.0 |    90.0 |
|    1 | xxx       |    67.0 | 98.0 |    56.0 |
+------+-----------+---------+------+---------+
8 rows in set (0.00 sec)

4.5 条件查询(where)★

where字句来制定一个条件,where后面会跟上条件表达式,类似于Excel中的"筛选操作",把符合条件的巨鹿保留下来,不符合条件的记录给淘汰出去。

既然要表达是就会用到运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>不等于
BETWEEN a0 AND a1范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, …)如果是 option 中的任意一个,返回 TRUE(1) ;判断值是否在()的若干个选项中存在。
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

1、<=>:比较相等,与 “=”有明显区别,和NULL的比较结果有区别;

​ NULL = NULL => 表达式的值仍然是NULL,相当于false;

​ NULL <=> NULL => 表达式的值就是true ;

2、=:在sql中是 比较相等 ,也可以是 赋值,不同sql语句不同的作用。

  • 基本用法
select * from exam_result where english<60; -- 筛选出英语大于60分

select name, chinese, english from exam_result where english<chinese; -- 筛选出英语成绩比语文成绩好的学生

select name, chinese+english+math as totle from exam_result where chinese+english+math<200; -- 筛选出总分数大于200的人;切记where不支持使用别名。

select 所反映的结果是一张==“临时表”==,表里面的任何操作都不会影响磁盘上的数据。

逻辑运算符:

运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT条件为 TRUE(1),结果为 FALSE(0)
select name, chinese, english from exam_result where chinese > 80 and english>80; -- 筛选出语文成绩大于80且英语大于80的人。

select name, chinese, english from exam_result where chinese > 80 or english > 80;-- 筛选出语文成绩大于80 或者 英语大于80的人。

select * from exam_result where chinese>=80 and chinese <= 90; -- 中文成绩 [80,90]之间的人。

select * from exam_result where chinese between 80 and 90; -- 中文成绩 [80,90]之间的人。这种写法优化好一点

铁汁们,觉得笔者写的不错的可以点个赞哟❤🧡💛💚💙💜🤎🖤🤍💟,收藏关注呗,你们支持就是我写博客最大的动力。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸢也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值