记录的是基础用法,有很多细节省略了,详细请看课件或者完整笔记
MySQL的SQL语句分为以下三类
create
,alter
,drop
,source
,show
insert
,select
,delete
,update
grant
,revoke
,commit
有两种方式:
指明端口
不指明端口,使用默认的
-p的作用是不显式地输入密码,我并没有设置root账户的密码,直接按回车即可 -u和root之间可以有空格可以没有
注意mysql语句要用分号结尾
或者“如果这个库不存在的话,就创建”(创建表的时候也一样):
注意,关于库、表的名称,最好使用反引号`` `括起来,这个符号是电脑esc键下面的键,半角状态打出
也可以不括起来,但是如果名称和mysql内部一些名称冲突的话,会报错
严格来说也不是退出,而是返回到最初的库
当然,是没有必要退出的,因为在其他数据库的时候,还是可以使用show databases;
命令查看所有数据库,并使用use 数据库名;
直接进入其他数据库
create table 表名 (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
最下面一行后面的内容可以省略
省略长横线:
在SC表中的Cno列后面新增一列Grade
查看一下表结构,发现列信息被加入进去了:
由于一般新增列的时候,默认该列的数据都为空NULL,但是有些场景需要指定默认数据
创建新列时设置默认填充数据:
主键用于标定一张表中一条数据的唯一性的的列。主键不为空、数据值不能重复,因此可以标定一条数据的唯一性。
一张表中只能有一个主键,但是主键可以是由一列构成,也可以由多列复合而成(复合主键),只要复合主键中并不是每一列的数据都是相同的,那么这个数据就是唯一的。
一般选择int类型字段作为主键(比如ID之类)
方法一:在设置字段的时候设置上主键
方法二:在最后设置主键
not null
前提是表中没有主键
不能用第一种方式创建
会报错“定义了重复主键”
此前表中没有主键
关于主键、默认值(default)、唯一键、外键等SQL字段约束相关知识,在慕雪的寒舍-SQL字段约束
将SC表中的Sno的数据类型由int(11)改为int(20)
查看一下表结构:
说明修改表的某一列是用新的列覆盖掉旧的列
将表SC的Grade列改名为NianJi
注意,在改列名的时候,必须还要重新指定该列的数据类型,可以保留原来的,也可以修改,但必须都要写出。 这里我顺便修改成新的数据类型,还可以加注释。 所以说修改列名是包含了修改修改数据类型的 修改列名使用change而不是rename
查看一下表结构:
凡是涉及到删除的操作,都要慎重 如果表中只剩下一列,不能删除列了,只能删除整张表
https://blog.musnow.top/posts/2109090510/
$ mysqldump [-P端口号] -u用户名 -p密码 [-B] 数据库名 > 备份后的名称.bak.sql
[ ]内的是可以省略的 -u和用户名、-p和密码之间可以加空格,可以不加 -B和数据库名之间必须有空格(如果-B没有省略的话) 端口号可能是3306,取决于数据库有没有指定端口 备份后的文件要具体到路径,否则认为当前工作路径(同其他shell命令一样)
eg1:mysqldump -uroot -p0295 test2 > ../test2.bak.sql
备份到了父目录
eg2:mysqldump -P3306 -uroot -p0295 test2 > test2.bak.sql
备份到了当前目录
可以多个数据库同时备份
$ mysqldump [-P端口号] -u用户名 -p密码 [-B] 数据库1 数据库2 > 备份后的名称.bak.sql
eg:mysqldump -uroot -p0295 -B test2 test_mysql > test.back.sql
两个数据库备份到了一个备份文件上
也可以只进行数据库中表的备份
$ mysqldump [-P端口号] -u用户名 -p密码 数据库名 表1 表2 > 备份后的名称.bak.sql
备份表的时候不能加-B,因为-B是专用于数据库的,否则会把表名当成数据库名
eg:mysqldump -uroot -p0295 test2 test2_table1 > test_table1.back.sql
其他知识点详见置顶链接
mysql> source 备份文件路径
eg:source /yj/test2.bak.sql
数据库中的内容和原来数据库中的内容是相同的
mysql备份的时候,会将里面的语句智能化简
eg:mysql> system clear
执行清理屏幕功能
table
固定写法比如alter
, drop
等等,后面都需要加table
, 然后才能跟表名
而下面的DML在指定表名的时候不需要写table
, 直接用表名就可以
这是因为DDL是操作表的
而DML是操作数据的
Sno、Sname等字段可以不写,如果不写的话就默认为数据为空(前提是该字段允许为空,或已设置defalut值)
如果字段名全部省略,就默认为所有的数据都要填上,所有数据都要填充,且要按照表中字段顺序填入
同单行插入一样,字段名可以省略(但是数据插入要按字段顺序); 部分字段名可以不写,默认为空(前提是该字段允许为空,或者有default值)
如果要插入的数据,其主键或唯一键,与表中现存数据重合,则插入数据失败。此时我们可以选择更新现有数据。
在test表中插入数据Sno、Sage(Sno必填,因为是主键),如果填入的内容与主键发生重复冲突,则更新
update
语句后面指定字段中的内容 示例中是,如果发生主键/唯一键冲突,则将该主键/唯一键对应的数据中Sno字段数据改为21
与更新update不同,更新是只更新数据中原有的部分字段,替换replace则是先删除原数据(所有字段),然后根据要填入的value再插入。
要插入的数据的主键/唯一键与现有数据冲突时,replace将现有数据所有字段删除,将要插入的数据重新插入。即replace在遇到冲突时,是先删除,后插入。
从这里可以看出,数据是先删除后插入
基本写法
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
*
为通配符
查看Student所有数据:
查看Course所有数据:
查询指定字段的数据,并汇聚成一张表呈现出来
所以可以看出来,select到from之间的这部分,实际上就是规定了查询结果的字段。而MySQL支持将查询结果通过表达式进行展示
这样可以增强查询结果的可读性
有些使用场景下可能需要用到去重,比如上面,只是想知道总体上都是有哪几种总分,因此可以对结果进行去重。
注意去重只是去掉所有字段都重复的数据,所以结果中,就算有一个字段存在重复的数据,但是其他字段不重复,该数据也不会被去掉
基本用法就是在表名后加where
,后面是查询条件
where语句支持比较运算符和逻辑运算符
比较运算符 | 说明 |
---|---|
>, >=, <, <= | |
= | 等于,NULL 不安全,NULL=NULL 的结果是 NULL |
<=> | 等于,NULL 安全,NULL<=>NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a AND b | 范围匹配,闭区间,如果 a <= value <= b 返回 TRUE(1) |
IN (option, ..., ...) | 如果是 option 中的任意一个,则返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配,% 表示任意多个(包括 0 个)字符;_表示任意一个字符; |
逻辑运算符 | 说明 |
---|---|
AND | 与,相当于 cpp 中的 &&,全真为 1,有假为 0 |
OR | 或,相当于 cpp 中的 ` |
NOT | 逻辑取反,条件为 TRUE(1) 的时候结果为 FALSE(0) |
需要注意的是,where只是进行条件筛选,起别名的工作并不是通过where语句完成的,而是select本身
并且起别名本质是在表示结果的时候更换一下结果表的字段名,并不影响查询过程,所以where是不认识别名的
使用where
时设置条件的字段,可以与select查询要获取的结果集字段无关,而是可以根据原有表中任意字段进行筛选
DESC
】 显示降序在字段后加EDSC
按照书写先后确定排序优先级
先按照数学将序排序,相等时,就再参考语文的升序,如果还是相等,参考英语的升序
排序的时候可以使用别名,说明排序只是对于查询后的结果表进行排序,而不同于where(在查询时按条件筛选)
where
+ order by
查询语文成绩大于70分的学生的id、姓名、数学成绩 并将查询结果按照语文成绩,降序排列