SQL入门就从这里开始吧! SQL基础概念及相关语法

发布于:2022-12-28 ⋅ 阅读:(290) ⋅ 点赞:(0)

本文廖雪峰老师的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例的最小值

    • 有下面几点值得注意的

      1. m的属性必须为数值型

      2. 查询的结果依旧是二维表

      3. 可以对结果重命名

        SELECT COUNT(*) sum FROM students;
        //结果重命名为sum
        
      4. 语句也添加WHERE

      5. 可以添加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类似,这里就不多说了~

本文含有隐藏内容,请 开通VIP 后查看