SQL学习笔记廖雪峰SQL教程
〇、简介
教程链接:
现代程序离不开关系数据库,要使⽤关系数据库就必须掌握SQL。
⼀种最流⾏的开源数据库MySQL
nullsroyale破解版
NoSQL数据库,也就是⾮SQL的数据库,包括MongoDB、Cassandra、Dynamo等等,它们都不是关系数据库。NoSQL数据库作为SQL数据库的补充,两者不再是⼆选⼀的问题,⽽是主从关系。
1. 关系数据库概述
数据库作为⼀种专门管理数据的软件
数据模型
层次模型(类似树)
⽹状模型(类似图)
关系模型(excel表)
数据类型
REAL可写成FLOAT(24)
常⽤:BIGINT, VARCHAR(N)
主流关系数据库
商⽤数据库,例如:Oracle,SQL Server,DB2等;
开源数据库,例如:MySQL,PostgreSQL等;
桌⾯数据库,以微软Access为代表,适合桌⾯应⽤程序使⽤;
嵌⼊式数据库,以Sqlite为代表,适合⼿机应⽤和桌⾯程序。
SQL语⾔
SQL是结构化查询语⾔的缩写,⽤来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进⾏管理和维护操作。不同的数据库,都⽀持SQL,这样,我们通过学习SQL这⼀种语⾔,就可以操作各种不同的数据库。
DDL:Data Definition Language
DDL允许⽤户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执⾏。
DML:Data Manipulation Language
DML为⽤户提供添加、删除、更新 数据的能⼒,这些是应⽤程序对数据库的⽇常操作。
DQL:Data Query Language
DQL允许⽤户 查询数据,这也是通常最频繁的数据库⽇常操作。
SQL关键字总是⼤写,以⽰突出,表名和列名均使⽤⼩写。
使⽤MySQL时,不同的表还可以使⽤不同的数据库引擎。如果你不知道应该采⽤哪种引擎,记住总是选择InnoDB就好了。
安装MySQL
输⼊exit退出MySQL命令⾏。注意,MySQL服务器仍在后台运⾏。
⼀、关系模型
关系模型本质上就是若⼲个存储数据的⼆维表,可以把它们看作很多Excel表。
表的每⼀⾏称为记录(Record),记录是⼀个逻辑意义上的数据。
表的每⼀列称为字段(Column),同⼀个表的每⼀⾏记录都拥有相同的若⼲字段。
字段定义了数据类型(整型、浮点型、字符串、⽇期等),以及是否允许为NULL。注意NULL表⽰字段数据不存在。⼀个整型字段如果为NULL不表⽰它的值为0,同样的,⼀个字符串型字段为NULL也不表⽰它的值为空串’’。
通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应⽤程序读取数据后⽆需判断是否为NULL。
和Excel表有所不同的是,关系数据库的表和表之间需要建⽴ “⼀对多”,“多对⼀”和“⼀对⼀” 的关系,这样才能够按照应⽤程序的逻辑来组织和存储数据。
每⼀⾏对应着⼀个班级,⽽⼀个班级对应着多个学⽣,所以班级表和学⽣表的关系就是**“⼀对多”**
⼀对多:⼀个表⾥的⼀⾏数据对应另⼀个表⾥的多⾏数据
⼀对⼀:⼀个表⾥的⼀⾏数据对应另⼀个表⾥的⼀⾏数据
在关系数据库中,关系是通过主键和外键来维护的。
1. 主键(唯⼀标识)
关系表,任意两条记录不能重复。
够通过某个字段唯⼀区分出不同的记录,这个字段被称为主键。
主键不允许有NULL。
c语言sizeof计算方法主键⼀般不随意更改,因为它是⽤来唯⼀定位记录的,通过主键我们能索引到⼀个记录,⽽且是唯⼀的。
主键选取的原则:
不适⽤任何业务相关的字段作为主键
此外,名字可以重复,邮箱,⼿机号等数字后续要能随时更改,所以都不能作为主键
⼀般把主键字段命名为id
1. ⾃增整数类型(BIGINT⾃增):数据库会在插⼊数据时⾃动为每⼀条记录分配⼀个⾃增整数,这样我们就完全不⽤担⼼主键重复,也
不⽤⾃⼰预先⽣成主键;
2. 全局唯⼀GUID类型:使⽤⼀种全局唯⼀的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8
abc2f57。GUID算法通过⽹
卡MAC地址、时间戳和随机数保证任意计算机在任意时间⽣成的字符串都是不同的,⼤部分编程语⾔都内置了GUID算法,可以⾃⼰预算出主键。
联合主键(尽量不使⽤)
多个字段唯⼀标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。
对于联合主键,允许⼀列有重复,只要不是所有主键列都重复即可
例如,学⽣姓名 和 学⽣学号 虽然性别会重复,但是两者组合起来就不会有重复。
edge浏览器2. 外键
在students表中,增加class_id字段,这个字段映射到classes表的主键;通过class_id的字段,可以把数据与另⼀张表关联起来,这种列称为外键。
外键既可以通过数据库来约束,也可以不设置约束,仅依靠应⽤程序的逻辑来保证。
外键并不是通过列名实现的,⽽是通过定义外键约束实现的:
ALTER TABLE students #声明
ADD CONSTRAINT fk_class_id #增加约束,名称可以任意
FOREIGN KEY (class_id) #外键的名称
手机mysql安装配置教程REFERENCES classes (id); #映射另⼀个表的主键servererror翻译
通过定义外键约束,关系数据库可以保证⽆法插⼊⽆效的数据。即如果classes表不存在id=99的记录,students表就⽆法插⼊
class_id=99的记录。
外键约束会降低数据库的性能。
删除⼀个外键约束:
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
多对多
⽼师和班级的对应就是多对多
多对多关系实际上是通过两个⼀对多关系实现的,即通过⼀个中间表,关联两个⼀对多关系,就形成了多对多关系
teachers表:id和⽼师name
classes表:id和班级name
teacher_class表:id,teacher_id, class_id 关联上⾯两个表
⼀对⼀暗黑不朽 air splitter
⼀对⼀关系是指,⼀个表的记录对应到另⼀个表的唯⼀⼀个记录。
简单来说,⽐如⼀个豪华版的学⽣信息表,⾥⾯有每个学⽣的各种各样的信息,然后我们把⼿机号那⼀列单独拿出来做成⼀个表,表中有id, student_id, mobile这样可以提⾼查询速度,不搜索不需要的信息。
3. 索引
索引是关系数据库中对某⼀列或多个列的值进⾏预排序的数据结构。通过使⽤索引,可以让数据库系统不必扫描整个表,⽽是直接定位到符合条件的记录,这样就⼤⼤加快了查询速度。
创建索引
ALTER TABLE students
ADD INDEX idx_score (score) #创建⼀个名称为idx_score,使⽤score列的索引
ADD INDEX idx_name_score (name, score); #创建多列的索引
索引效率:该列的值重复率越低,索引效率越⾼
优点:提⾼查询效率,⼀个表可以创建多个索引
缺点:在插⼊、更新和删除记录时,需要同时修改索引。因此,索引越多,插⼊、更新和删除记录的速度就越慢。
主键索引:主键⾃带索引,效率最⾼,唯⼀索引
唯⼀索引
主键是唯⼀索引,但是唯⼀索引不⼀定是主键(例如⾝份证号那些,具有唯⼀性约束)
创建唯⼀索引:并且让name不能有重复
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
添加唯⼀约束,不添加唯⼀索引(该列不含索引)
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
索引的存在与否不影响数据库的运⾏,只是创建了索引,查的时候会⽐较快⼆、在线SQL
只能执⾏SELECT/UPDATE/DELETE/INSERT这些常⽤SQL
三、查询数据 SELECT
1. 基本查询
查询数据库表的数据:得到⼀个⼆维表
获取⼀个表的所有数据
SELECT * FROM students #students是表名, *表⽰所有列
SELECT语句可以不接FROM
测试数据库的连接:
SELECT 1;
计算100+200
SELECT 100+200;
2. 条件查询 WHERE
查询分数在80分或以上的学⽣
SELECT * FROM 表名 WHERE 条件表达式
SELECT * FROM students WHERE score >= 80;
多条件查询 NOT <> AND OR
SELECT * FROM students WHERE score >= 80 AND gender = 'M'
SELECT * FROM students WHERE score >= 80 OR gender = 'M';
不是2班的学⽣
SELECT * FROM students WHERE NOT class_id = 2
SELECT * FROM students WHERE class_id <> 2
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';
符号优先级:如果不加括号,条件运算按照NOT、AND、OR的优先级进⾏BETWEEN在A与B之间(包含AB)
SELECT * FROM students WHERE score BETWEEN 60 AND 90;
使⽤LIKE判断相似
SELECT * FROM students WHERE name LIKE 'ab%' #或%ab  %ab%, %表⽰匹配任意字符3. 投影查询
返回指定列的数据,⽽不是所有列的数据
SELECT 列1, 列2 FROM ......
重命名:可以更改返回的新表中的列的名称(新名称只作⽤于新表,原表不变)
SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...
SELECT id, score score1, name name1 FROM students;
4. 排序 ORDER BY
普通SELECT查询的结果是通过id排序的
ORDER BY 默认升序 ASC
SELECT id, name,gender,score FROM students ORDER BY score;
ORDER BY……DESC 降序排列
SELECT id, name, gender, score FROM students ORDER BY score DESC;
多条件排序
如果score列有相同的数据,排列后再把相同的数据按gender排列,逗号隔开SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
带条件查询的排序
SELECT id, name, gender, score FROM students WHERE class_id = 1 ORDER BY score DESC;
5. 分页查询——查询结果分页显⽰
对查询出来的⼤量数据进⾏分页显⽰
分页实际上就是从结果集中“截取”出第M~N条记录
获取第⼀页的数据,每页最多3条记录,索引从编号0开始(0, 1,2)
SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFEST 0;获取第⼆页的数据,每页最多3条记录,索引从编号3开始
SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFEST 3; SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3, 3;
OFFEST = LIMIT * (pageIndex - 1) #pageIndex表⽰第⼏页
随着OFFEST的增⼤,查询效率不断降低
6. 聚合查询:统计⾏数——聚合函数
COUNT(*)
SELECT COUNT(*) FROM students;
得到的结果是⼀个⼆维表(⼀⾏⼀列),列名是COUNT(*)
设置新表的别名
SELECT COUNT(*) num FROM students;
SELECT COUNT(*) num FROM students WHERE score >= 80;
常⽤聚合函数:
SUM 计算某⼀列的和, 必须是数值的列
AVG 计算某⼀列的平均值, 必须是数值的列
MAX 计算某⼀列的最⼤值
MIN 计算某⼀列的最⼩值
SELECT AVG(score) average FROM students WHERE gender = 'M';

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。