MySQL学习笔记
前言
由于笔者不是专业人士,所以对数据库的学习就仅存在与基础使用。本篇学习笔记为梳理这一个星期的学习。
首先让我们了解一下什么是mysql数据库,现在数据库基础学习主要为三种数据库:大型数据库Oracle,中型数据库SQLsever,小型数据库mysql,前两种笔者在几年前也曾学习过,所以拥有一些数据库的基础。
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
RDBMS 术语
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
安装
现在mysql已经在Windows平台上提供了可视化的安装,非常简单。在这里稍微要注意的是mysql的版本问题,由于mysql的版本号变化很大,我所选用还是老版本5.7 ,不是8.0,虽然只差一代╮(╯▽╰)╭
语法
虽然现在在Windows平台上提供了大量的可视化管理软件,但对于sql语法,作为一个学生,还是要学会基础,不说别的,代码的逼格不是鼠标能比的_
创建数据库
CREATE DATABASE 数据库名;
删除数据库
DROP DATABASE 数据库名;
选择数据库
USE 数据库名;
创建数据表
CREATE TABLE table_name (column_name column_type);
约束
NULL / NOT NULL
空值约束
PRIMARY KEY
主键约束
FOREIGN KEY
外键约束,初学者不推荐使用,在操作数据库时sql语句会变得臃肿复杂,测试数据极为不方便
AUTO_INCREMENT
定义列为自增的属性,一般用于主键,数值会自动加1。
CHARSET
设置编码。
删除数据表
DROP TABLE table_name ;
插入数据
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
***注意***
插入或修改数据时一定要严格按照数据类型
例如:
UTF-8:一个汉字=3个字节
GBK:一个汉字=2个字节
varchar(n) 表示 n 个字符,无论汉字和英文,Mysql 都能存入 n 个字符,仅是实际字节长度有所区别
MySQL 检查数据长度语句
select LENGTH(fieldname) from tablename
查询数据
通用语法
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
where子句(条件查询):按照“条件表达式”指定的条件进行查询。
group by子句(分组):按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。
having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。
order by子句(排序):按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。
limit(限制结果集): 取出查询结果的条数或位置。
***注意***
where和having的区别:
作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 子句不能包含聚集函数
HAVING 子句总是包含聚集函数
进阶查询(关系型数据库核心
)
- 多表连接查询
-
内连接 (
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值
)select * from book as a,stu as b where a.sutid = b.stuid
-
外连接 (
以一种表为基表,基表的所有行、列都会显示,外表如果和条件不匹配则所有的外表列值都为NULL
)-
左连接(
以左表为基准
)select * from book as a left join stu as b on a.sutid = b.stuid
-
右连接(
以右表为基准
)select * from book as a right join stu as b on a.sutid = b.stuid
-
全外连接 (
完整外部联接返回左表和右表中的所有行
)select * from book as a full outer join stu as b on a.sutid = b.stuid
-
-
交叉连接 (
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积
)select * from book as a cross join stu as b order by a.id
-
- 子查询 / 嵌套查询 (
把内层查询结果当作外层查询的比较条件
)- 相关子查询 (
内部查询的执行依赖于外部查询的数据
)
select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);
- 非相关子查询 (
内部查询的执行独立于外部查询
)
select * from score as a where a.cou_id=1 and a.score>(select avg(b.score)from score as b where b.cou_id=1);
- 相关子查询 (
模糊查询
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
通配符
_
匹配一个字符%
匹配多个字符
正则表达式
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 REGEXP 'somevalue'
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^
也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$
也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
.
匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象'[.\n]'
的模式。
[...]
字符集合。匹配所包含的任意一个字符。例如,'[abc]'
可以匹配 “plain” 中的 ‘a’。
[^...]
负值字符集合。匹配未包含的任意字符。例如,'[^abc]'
可以匹配 “plain” 中的’p’。
p1|p2|p3
匹配 p1 或 p2 或 p3。例如,'z|food'
能匹配 “z” 或 “food”。'(z|f)ood'
则匹配 “zood” 或 “food”。
*
匹配前面的子表达式零次或多次。例如,zo*
能匹配 “z” 以及 “zoo”。* 等价于{0,}
。
+
匹配前面的子表达式一次或多次。例如,'zo+'
能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于{1,}
。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}'
不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
更新数据
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
注意执行时一定要看清where子句,否则可能会更新整个表
删除数据
DELETE FROM table_name [WHERE Clause]
注意执行时一定要看清where子句,否则可能会删除整个表
修改
alter table table_name [ DROP | ADD | MODIFY | CHANGE | DEFAULT] [some]
总结
上述为mysql最为基础增删改查等操作的sql语法,及一些注意事项,对于每一个数据库来说其sql都不尽相同,所以使用时还是要查询操作手册
。
这周算是把sql语句复习了一遍,顺便了解学习了mysql的操作。