本文廖雪峰老师的sql教程学习笔记,仅供参考交流,推荐大家去廖雪峰老师的个人网站学习,里面的资源都总结得相当不错。
学校还没开学,趁这个机会又学了一点sql语法,继续朝着前端努力~
文章目录
概念:
SQL(结构化查询语言)是访问和处理关系数据库的计算机标准语言。
NoSQL数据库:即非关系数据库。
数据库是一种专门管理数据的软件,提供接口给应用程序读写数据,使应用程序不用处理数据的存储。
数据模型:
数据库按照数据结构来组织、存储和管理数据,分为三种模型。
层次模型: 结构像树,每个节点只有一个父节点(根节点除外)
网状模型:每个节点都可以与其他许多节点连接,像网络。
关系模型:将数据看作表格,可以通过行号和列号对应数据。
数据类型:
INT 整型 4字节整数类型
BIGINT 长整型 8字节整数类型
REAL 浮点型 4字节浮点数 还可写成FLOAT(24)
DOUBLE 浮点型 8字节浮点数
DECIMAL(M,N) 高精度小数 用户指定精度的小数 DECIMAL(20,10)表示含十位小数的二十位数
CHAR(N) 定长字符 存储指定长度的字符串,即长度必须为N位
VARCHAR(N) 变长字符 存储可变长度的字符串
BOOLEAN 布尔类型 存储True或者False
DATE 日期类型 存储日期,格式如2022-08-29
TIME 时间类型 存储时间,格式如16:47:45
DATETIME 日期和时间类型 存储日期加时间,格式如2022-08-29 16:48:22
操作数据库:
DDL:Data Definition Language 数据定义语言
创建表、删除表、修改表结构之类的操作,由数据库管理员执行。
DML:Data Manipulation Language 数据管理语言
添加、删除、更新数据,为应用程序对数据库的日常操作。
DQL: Data Query Language 数据查询语言
用户查询数据,也是数据库的日常操作。
运行MySQL:
在命令行程序内输入mysql -u root -p
再输入口令,即自动连接到MySQL服务器,输入exit
可退出MySQL命令行,但此时MySQL服务器还在后台运行,输入cd c:\mysql\bin;mysqladmin -uroot shutdown
可关闭服务器。
关系模型:
品牌 | CPU | 显卡 | 价格 |
---|---|---|---|
联想 | i5 | 3050 | 5999 |
宏碁 | i7 | 3060 | 6999 |
关系数据库中,一张表的每一行数据被称为一条记录,每一列称为一个字段,一条记录由多个字段组成。
在关系表中任意两条记录不能重复:指能通过某个字段区分出不同的记录,这个字段称作主键,记录插入表中之后,主键最好不要更改,否则可能会造成很大的影响。
选取主键
应该以不取用任何业务相关的字段为原则
一般将主键字段命名为id
比较常见的命名方法如下:
1.自增整数类型:即给每一个记录分配一个自增整数。
2.全局唯一的GUID类型:使用GUID算法预算出一个唯一的字符串作为id。
联合主键
- 通过多个字段唯一标识记录,将两个或以上记录设置为主键,称为联合主键。
允许有一列重复,但尽量不要使用,这会使复杂度上升。
外键
- 在一张表中,通过某个字段,将数据与另一张表关联起来,这种列称为外键。
ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);
外键需通过定义外键约束来实现。
上例中 FOREIGN KEY(class_id)用于指定class_id作为外键
ALTER TABLE指定操作的表名
ADD CONSTRAINT是增加约束
REFERENCES用于将这个外键关联到class表中id列,其为class表的主键
可以通过中间表实现多对多的关系
索引
- 索引是关系数据库中对某一列或多列的值进行预排序的数据结构,使用索引可以快速定位到符合条件的记录,而不必搜索整个表,提高了效率。
创建索引
ALTER TABLE students
ADD INDEX idx_score (score);
上例为创建索引的语句,idx_score为索引名称,括号内为创建索引使用的列(可以添加多个)。
但是我们需要注意的是,当我们对表中记录进行增删改时,表中的列会发生变化,所以我们必须在此同时修改索引,这会消耗一些时间,这也是索引的一个缺点
唯一索引
- 关系数据表中,有些是唯一的列,但是其可能与业务相关,不能作为主键,我们可以
将其作为索引,由于其具有唯一的特性,称作唯一索引。
数据的查询操作
1.基本查询
SELECT * FROM students;
上述语句中,SELECT表示执行一个查询,* 表示所有列,FROM表示从哪开始查询后面跟着表名。
要注意的是,查询结果是一个二维表,并且SELECT还可以用于计算表达式
SELECT 100+200; //300
SELECT 1 FROM students; //在students表中随机抽取一列,常用于测试数据库连接
2.条件查询
- sql可以利用WHERE、AND、OR、NOT、和括号完成一系列条件查询。
SELECT * FROM students WHERE score >= 80;
SELECT * FROM students WHERE score >= 80 AND gender ='M'
SELECT * FROM students WHERE score >= 80 OR gender ='M'
SELECT * FROM students WHERE NOT class_id = 2;
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';
SELECT * FROM students WHERE score <> 80; //输出score不等于80的
SELECT * FROM students WHERE name LIKE ‘a’; //输出类似结果 如name='abc' name='aed'
上例都比较容易理解,就不多解释了hhh。
3.投影查询
只返回需要例的数据而不是所有,让结果只包含指定例,称为投影查询
SELECT id, score grade, name FROM students;
值得注意的是,在查询过程中我们可以对例名进行重命名, 如上例中score就改为了grade
4.查询中的排序
在查询的结果集中,通常是按照id(即主键)进行排序的,如果想要按照其他条件排序我们可以加上
ORDER BY
子句,后面加上字段和ASC
(升序,默认为此,可省略)或DESC
(降序)。SELECT id, name, gender, score FROM students ORDER BY score DESC, gender
ORDER BY
后面可以跟多个字段,会依次进行排序,如上例当score值相等时,会按照gender从小到大顺序排列。
5.分页查询
这种查询方式可以在数据十分大的时候使用,可以将结果集中的数据分成很多页来查看。
LIMIT X OFFSET M
将结果集按每页最多X条记录的方式分页,从第M + 1号记录开始查看。M是从0开始索引的,如果想查看第2页那么M = X * (2 - 1).
6.聚合查询
用于统计表表中的数据,如表中的记录数,学生的平均值。
COUNT(*): 查询所有列的行数
SUM(m): 计算m列的合计值
AVG(m): 计算m列的最大值
MIN(m): 计算m例的最小值
有下面几点值得注意的
m的属性必须为数值型
查询的结果依旧是二维表
可以对结果重命名
SELECT COUNT(*) sum FROM students; //结果重命名为sum
语句也添加WHERE
可以添加
GROUP BY 字段
语句实现分组聚合的功能SELECT COUNT(*) FROM students GROUP BY class_id; //按照class_id分别计算总数
7.多表查询(笛卡尔积查询)
同时从多张表查询数据,查询的结果集的列数是两表之和,行数是两表之积。
SELLECT * FROM students, classes;
格式如上例,从学生表和课堂表查询
查询结果集可以对属性进行重命名,也可添加条件查询语句。
8.连接查询
选一个表作为主表,将其他表的行选择性连接到主表上
可以将连接查询分为外连接和内连接
内连接查询的数据是所有表中都存在的数据,不会有null出现
SELECT students.id, students.name, students.gender, students.class_id FROM students INNRE JOIN classes ON class_id = classes.id;
外连接又可分为左外连接、右外连接和全外连接,区别在于查询的结果集
如果是左外连接即结果集只包括两表中左表存在的记录(左表即JION左边的表)
例子如下
SELECT students.id, students.name, students.class_id, classes.name class_name, students.gender, students.score FROM students LEFT OUTER JOIN classes ON students.class_id = classes.id;
如果students表中存在一个记录而classes表中无相应记录与之对照,即左表中有一个学生的数据,但是classes表中没有这个学生和其对应的班级,则在左外连接查询中该条记录会出现在表中但其class_name为null,这就是指包括左表中存在的记录的含义,同理可自推右外连接和全外连接
修改数据
INSERT
即插入记录的操作
例子如下
INSERT INTO students (class_id, gender, score, name)
VALUE (2, 'M', '100', '小贝');
/*有三点需要注意
1.我们没必要插入id字段,它是自增主键可以自动更新
2.字段顺序没必要和表中顺序一致
如我们还可以这样插入INSERT INTO students(class_id, gender, name, score)
3.可以一次性添加多条记录
*/
UPDATE
更新数据表的记录
例子如下
UPDATE students SET name='贝贝剑', score=99 WHERE class_id=1;
上述语句将把class_id=1的所有记录name,score分别改为设置值
WHERE后面的条件可以按需修改,但如果没有条件,所有的记录都将修改,如果匹配不到记录将没有任何改变
DELETE
删除表中的记录
例子如下
DELETE FROM students WHERE class_id=1;
注意事项和UPDATE类似,这里就不多说了~