MySql
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
RDBMS:关系型数据库管理系统(Ralational Database Management Sysytem)。
RDBMS术语
数据库:数据库是一些关联表的集合。
主键:主键是唯一的,一个数据只能包含一个主键。
外键;外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可以快速访问数据表中的特定信息,索引是对数据表中一列或多列的值进行排序的一种结构。类似于数据的目录。
参照完整性:参照的完整性要求关系中不允许引用不存在的实体,与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
管理mysql的命令
USE 数据库名:选择要操作的Mysql数据库,使用该命令后所有的msyql命令都只针对于该数据库。
SHOW DATABASES:列出Mysql数据库管理系统的数据库列表。
SHOW TABLES:显示数据库的所有表,使用该命令前需要使用USE 命令选择要执行的数据库。
SHOW COLUMNS FROM 数据表:显示数据表的属性,属性类型,主键信息,是否为null,默认值等其他信息。
SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)
Mysql操作数据库
create database 数据库名;
drop database 数据库名;
数据类型
日期和时间类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lCzrPRQ-1640586145651)(E:\Typroa笔记\MySql.assets\image-20210917214714061.png)]
字符串类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6xtGUtG-1640586145653)(E:\Typroa笔记\MySql.assets\image-20210917214847463.png)]
CHAR和VARCHAR类型相似,但他们的保存和检索方式不同:
区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节
Mysql创建数据表
CREATE TABLE table_name (column_name column_type);
创建数据表示例
CREATE TABLE IF NOT EXISTS
nowcoder_tbl
(
nowcoder_id
INT UNSIGNED AUTO_INCREMENT,
nowcoder_title
VARCHAR(100) NOT NULL,
nowcoder_author
VARCHAR(40) NOT NULL,
submission_date
DATE,
PRIMARY KEY (nowcoder_id
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
删除数据表
drop table table_name
MySQL插入数据
INSERT INTO table_name ( field1, field2,…fieldN )
VALUES
( value1, value2,…valueN );MySQL查询数据
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[ LIMIT N][ OFFSET M]
- 你可以使用 LIMIT 属性来设定返回的记录数。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
Mysql where子句
SELECT field1, field2,…fieldN FROM table_name1, table_name2…
[WHERE condition1 [AND [OR]] condition2…
- 查询语句中你可以使用一个或者多个表,表之间使用逗号**,** 分割,并使用WHERE语句来设定查询条件。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以使用 AND 或者 OR 指定一个或多个条件。
- WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
- WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
Mysql update 更新
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- 你可以同时更新一个或多个字段。
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在一个单独表中同时更新数据。
Mysql delete 语句
DELETE FROM table_name [WHERE Clause]
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
- 您可以在单个表中一次性删除记录。
Mysql link子句
SELECT field1, field2,…fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = ‘somevalue’
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在 WHERE 子句中使用LIKE子句。
- 你可以使用LIKE子句代替等号 =。
- LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
- 你可以使用 AND 或者 OR 指定一个或多个条件。
- 你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件
获取字段中以com结尾的所有记录
select * from nowcoder_tbl where nowcoder_author like '%COM';
Mysql union 操作符
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];
- expression1, expression2, … expression_n: 要检索的列。
- tables: 要检索的数据表。
- WHERE conditions: 可选, 检索条件。
- DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
- ALL: 可选,返回所有结果集,包含重复数据。
UNION 操作示例
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country; 示例二 SELECT country, name FROM Websites WHERE country='CN' UNION ALL SELECT country, app_name FROM apps WHERE country='CN' ORDER BY country;
SQL语句的执行顺序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAKIDHp3-1640586145654)(E:\Typroa笔记\MySql.assets\image-20211010171048099.png)]
连接
1. 什么是连接
表和表之间通过某一列或者多列产生关系的,这在SQL里叫做连接。连接(join):是通过表和表之间的关系将两个表合并在一起的操作。常用的连接有4种类型,分别是:交叉连接、内连接、左连接、全连接。
交叉连接:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elFfbO1d-1640586145656)(E:\Typroa笔记\MySql.assets\image-20211010164938933.png)]
**内连接(inner join):**返回的是所有匹配的记录
内连接,如果用学生id来连接,就是找出同时存在于两张表中的学生id,然后就可以选择性地展示这些学生id后面的数据。
行数据:通过where语句来筛选要展示的行
类数据:通过select来选择要展示的字段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPXnsTNe-1640586145657)(E:\Typroa笔记\MySql.assets\image-20211010165806772.png)]
不同写法的内连接: SELECT * FROM USER,relevance WHERE user.`userId`=relevance.`userId`; SELECT * FROM USER CROSS JOIN relevance ON user.`userId`=relevance.`userId`; SELECT * FROM USER INNER JOIN relevance ON user.`userId`=relevance.`userId`; SELECT * FROM USER AS a INNER JOIN relevance AS b ON a.`userId`=b.`userId`;
左连接(left join)和右连接(right join):返回的是所有匹配的记录 外加 每行主键外键值为null的一条记录 辅表所有列为null的值
左连接会将数据左侧表中的数据全部取出来,不管右侧是否存在能关联上的数据
下图结构是学生表信息加上中间阴影部分信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e131ez3O-1640586145658)(E:\Typroa笔记\MySql.assets\image-20211010170031464.png)]
left join:左连接
SELECT
a.userId AS 'id',
a.papertype AS '证件类型',
a.orgnizationid AS '证件号',
b.signId AS '签章id'
FROM USER AS a
LEFT JOIN relevance b
ON a.userId=b.userId;
带in关键字的子查询
使用带in关键字可以将 原表中特定列的值 与子句查询返回的结果集中的值 进行比较
‘id’,
a.papertype AS ‘证件类型’,
a.orgnizationid AS ‘证件号’,
b.signId AS ‘签章id’
FROM USER AS a
LEFT JOIN relevance b
ON a.userId=b.userId;
**带in关键字的子查询**
> 使用带in关键字可以将 **原表中特定列的值** 与==子句查询返回的结果集中的值== 进行比较