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


    MySQL基础语法

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

    C : create 新增

    R : retrieve 查找

    U : updatee 修改

    D : delete 删除

    一、数据的操作:

    1.1、显示数据库

    show databases;
    
    • 1

    显示数据库,查看当前的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] [数据库名];  -- 注意“;”用英文
    
    • 1
    mysql> create database aaa;
    Query OK, 1 row affected (0.00 sec)
    
    • 1
    • 2

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

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

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

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

    [if not exists]  --判断数据库是否存在,如果不存在,就创建;存在,啥也不干。
    
    • 1
    • 完整代码:
    create database [if not exists] 数据库名   --if not exists 可加可不加
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    1.3、选中数据库

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

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

    1.4、删除数据库

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

    这里的 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、删除表;
    
    • 1
    • 2
    • 3
    • 4

    3.1 、创建表

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

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

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

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

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

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

    show tables;
    
    • 1

    3.3、查看指定的表结构

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

    desc/describe 表名;
    
    • 1

    在这里插入图片描述

    3.4 、删除表

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

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

    3.5、新增数据 (insert)

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

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

    在这里插入图片描述

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

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


    指定列插入:

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

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

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

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


    一次多行插入

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

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

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

    3.6、去重查询 (distinct)

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

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

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

    在这里插入图片描述

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

    四、查询语句 (select) ☆

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

    4.1、全列查询

    select * from 表名;
    
    • 1

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

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

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

    4.2、指定列查询

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

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

    mysql> select name from exam_result;
    +-----------+
    | name      |
    +-----------+
    | xxx       |
    | xxx       |
    | xxx       |
    | xxx       |
    +-----------+
    7 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    4.3、查询字段为表达式

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

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

    select [列名], [列名+列名+列名...] from [表名];
    
    • 1
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    select [列名], [列名] , 常量 from [表名];
    
    • 1
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    select name, math+10 from exam_result;
    
    • 1
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    虽然能算出结果,但是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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

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

    4.4、排序

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

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

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    降序需要在 最后 加上 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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不支持使用别名。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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]之间的人。这种写法优化好一点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    瑞吉外卖项目:移动端导入用户地址簿与菜品展示功能实现
    clang llc llvm-link llvm-config 应用示例
    数据库-数据库-MySQL(12)- 事务
    linux下的动态静态库
    一步步指导 AI 画一幅中国山水画
    zabbix配置钉钉告警(附含钉钉告警脚本 · 实战亲测无任何问题)
    Windows系统管理二:基本命令
    Google Earth Engine(GEE)—— NDVI的CannyEdgeDetector边缘检测适用性分析
    Antv/G2 自定义折线图线条样式及tootip提示信息样式
    高防CDN:游戏应用抵御DDoS攻击的坚固堡垒
  • 原文地址:https://blog.csdn.net/qq_54219272/article/details/126454616