MySQL基础语法
文章目录
学习数据库的核心:CRUD 增删查改
C : create 新增
R : retrieve 查找
U : updatee 修改
D : delete 删除
一、数据库的操作:
1.1、显示数据库
show databases;
显示数据库,查看当前的MySQL服务器上有多少个数据库。
上面显示的是数据库自带的,
控制台输入一个命令 = > mysql客服端构造一个请求 = > 请求通过网络被发送给服务器 = > 服务器收到请求,并解析出其中的命令 => 服务器执行命令,完成增删查改操作 => 然后把结果打包成一个响应 => 通过网络把响应发回给客服端 = > 客服端在解析,最终显示到界面上。
所以说MySQL 的客服端 and 服务器 是通过网络来通信的。
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服务器上,有若干个数据库(视为是一组数据逻辑上的集合)
- 一个数据库 = > 包含若干个表
- 一个表 => 包含若干行(若干行记录)
- 一个行 => 包含若干列(若干个字段)
[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 |
TINYINT | 1字节 | Byte | |
SMALLINT | 2字节 | Short | |
INT | 4字节 | Integer | |
BIGINT | 8字节 | 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 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 | String |
BLOB | 0-65,535字节 | 二进制形式的长文本数据 | byte[] |
1、varchar(size) 是SQL里面最常用的类型,可变长度的字符串;(size)表示这个字符串的最大长度,单位是字符。
varchar(20) 表示,此时这个字段里面最大的长度就是20个字符。
汉字算一个字符,但是不算一个字节。
SQL 使用单引号来环绕文本值。如果是数值,请不要使用引号。
按照别的说法来说就是varchar类型(也可以说是String、字符串类型)这一些在数据库语句中使用的时候应该使用单引号,而不是直接使用。
2、text 根据用户插入的数据来动态确定占用的空间;
3、blob 是保存二进制 类型的数据 (前三个都是保存文本类型的数据)
把图片,mp3,视频等格式,都是二进制数据,如果要把这个保存的mysql中就可以使用 blob类型,
2.3、日期类型
数据类型 | 大小 | 说明 | 对应java类型 |
---|---|---|---|
DATETIME | 8 字节 | 范围从1000到9999年,不会进行时区的检索及转换。 | java.util.Date、java.sql.Timestamp |
TIMESTAMP | 4 字节 | 范围从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、小数: double
,decimal
;
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]之间的人。这种写法优化好一点
铁汁们,觉得笔者写的不错的可以点个赞哟❤🧡💛💚💙💜🤎🖤🤍💟,收藏关注呗,你们支持就是我写博客最大的动力。