SQL学习笔记

    技术2022-07-10  136

    F9执行 表的每一行称为记录(Record),记录是一个逻辑意义上的数据。 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。

    简介

    为什么需要数据库?

    如果要保存学校所有班级的信息,可以写入另一个CSV文件。

    但是,随着应用程序的功能越来越复杂,数据量越来越大,如何管理这些数据就成了大问题:

    读写文件并解析出数据需要大量重复代码;从成千上万的数据中快速查询出指定数据需要复杂的逻辑。

    如果每个应用程序都各自写自己的读写数据的代码,一方面效率低,容易出错,另一方面,每个应用程序访问数据的接口都不相同,数据难以复用。

    所以,数据库作为一种专门管理数据的软件就出现了。应用程序不需要自己管理数据,而是通过数据库软件提供的接口来读写数据。至于数据本身如何存储到文件,那是数据库软件的事情,应用程序自己并不关心。

    数据模型

    数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:

    层次模型网状模型关系模型

    随着时间的推移和市场竞争,最终,基于关系模型的关系数据库获得了绝对市场份额。

    主流关系数据库

    目前,主流的关系数据库主要分为以下几类:

    商用数据库,例如:Oracle,SQL Server,DB2等;开源数据库,例如:MySQL,PostgreSQL等;桌面数据库,以微软Access为代表,适合桌面应用程序使用;嵌入式数据库,以Sqlite为代表,适合手机应用和桌面程序。

    SQL

    什么是SQL?SQL是结构化查询语言的缩写,用来访问和操作数据库系统。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,这样,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。

    虽然SQL已经被ANSI组织定义为标准,不幸地是,各个不同的数据库对标准的SQL支持不太一致。并且,大部分数据库都在标准的SQL上做了扩展。也就是说,如果只使用标准SQL,理论上所有数据库都可以支持,但如果使用某个特定数据库的扩展SQL,换一个数据库就不能执行了。例如,Oracle把自己扩展的SQL称为PL/SQL,Microsoft把自己扩展的SQL称为T-SQL。

    现实情况是,如果我们只使用标准SQL的核心功能,那么所有数据库通常都可以执行。不常用的SQL功能,不同的数据库支持的程度都不一样。而各个数据库支持的各自扩展的功能,通常我们把它们称之为“方言”。

    总的来说,SQL语言定义了这么几种操作数据库的能力:

    DDL:Data Definition Language

    DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。

    DML:Data Manipulation Language

    DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。

    DQL:Data Query Language

    DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。

    语法特点

    SQL语言关键字不区分大小写!!!但是,针对不同的数据库,对于表名和列名,有的数据库区分大小写,有的数据库不区分大小写。同一个数据库,有的在Linux上区分大小写,有的在Windows上不区分大小写。

    数据类型

    名称类型说明INT整型4字节整数类型,范围约+/-21亿BIGINT长整型8字节整数类型,范围约+/-922亿亿REAL浮点型4字节浮点数,范围约+/-1038DOUBLE浮点型8字节浮点数,范围约+/-10308DECIMAL(M,N)高精度小数由用户指定精度的小数,例如,DECIMAL(20,10)表示一共20位,其中小数10位,通常用于财务计算CHAR(N)定长字符串存储指定长度的字符串,例如,CHAR(100)总是存储100个字符的字符串VARCHAR(N)变长字符串存储可变长度的字符串,例如,VARCHAR(100)可以存储0~100个字符的字符串BOOLEAN布尔类型存储True或者FalseDATE日期类型存储日期,例如,2018-06-22TIME时间类型存储时间,例如,12:20:59DATETIME日期和时间类型存储日期+时间,例如,2018-06-22 12:20:59

    主键

    用来唯一定位记录的 选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。 对于大部分应用来说,通常自增类型的主键就能满足需求。 如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。

    联合主键 关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。 对于联合主键,允许一列有重复,只要不是所有主键列都重复即可。

    主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。

    可以使用多个列作为联合主键,但联合主键并不常用。

    外键

    把数据与另一张表关联起来,这种列称为外键。 外键并不是通过列名实现的,而是通过定义外键约束实现的:

    ALTER TABLE students ADD CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES classes (id);

    其中,ALTER TABLE students 更改表students,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。

    通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

    由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

    要删除一个外键约束,也是通过ALTER TABLE实现的:

    ALTER TABLE students DROP FOREIGN KEY fk_class_id;

    关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。

    索引

    索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。批注:排序。

    可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。

    增加唯一索引

    ALTER TABLE students ADD UNIQUE INDEX uni_name (name);

    批注:增加唯一索引的作用大概是让数据库帮忙检查错误吧。

    查询

    基本查询

    SELECT * FROM <表名> SELECT * FROM students

    SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询

    SELECT语句其实并不要求一定要有FROM子句。 不带FROM子句的SELECT语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1;来测试数据库连接。

    条件查询

    SELECT * FROM 会查询整张表,但有时候我们只想查找特定条件的数据:

    SELECT * FROM <表名> WHERE <条件表达式> SELECT * FROM students WHERE score >= 80;

    可以使用NOT、AND、OR编写条件 如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级:

    SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';

    常用的条件表达式

    条件表达式举例1 表达式举例2说明使用=判断相等score = 80 name = 'abc'字符串需要用单引号括起来使用>判断大于score > 80 name > 'abc'字符串比较根据ASCII码,中文字符比较根据数据库设置使用>=判断大于或相等score >= 80 name >= 'abc'无使用<判断小于score < 80 name <= 'abc'无使用<=判断小于或相等score <= 80 name <= 'abc'无使用<>判断不相等score <> 80 name <> 'abc'无使用LIKE判断相似name LIKE 'ab%' name LIKE '
    转载请注明原文地址:https://ipadbbs.8miu.com/read-4797.html
    最新回复(0)