SQL的基础知识

    科技2024-05-20  64

    系列文章目录


    提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

    文章目录

    系列文章目录SQL基础操作1 前言2 概述2.1 创建和操纵表2.1.1 创建表语法2.1.2 更新表2.1.3 重命名表2.1.4 删除表 2.2 检索数据2.2.1 检索单列2.2.2 检索多列2.2.3 检索所有列2.2.4 检索不同值2.2.5 限制结果 2.3 数据排序2.4 过滤数据2.4.1 使用**where**子句2.4.2 where子句操作符2.4.3 使用通配符进行过滤 2.5 创建计算字段2.5.1 计算字段2.5.2 拼接字段2.5.3 使用别名 2.6 使用函数处理数据2.7 汇总数据2.8 分组数据2.8.1 创建分组2.8.1 过滤分组 2.9 使用子查询2.10 联接表2.10.1 内连接2.10.2 左连接2.10.3 右连接2.10.4 自连接 2.11 组合查询2.11.1 创建组合查询2.11.2 union与union all2.11.3 组合查询的排序 2.12 插入、更新与删除数据2.12.1 插入数据2.12.2 插入检索出的数据2.12.3 复制表2.12.4 更新数据2.12.5 删除数据 2.13 使用视图2.14 事务2.14.1 什么是事务2.14.2 语法2.14.3 理解事务


    SQL基础操作

    1 前言

    根据某个朋友的情况,针对性地写一篇SQL的基础知识篇,适合是IT入门新手和需要了解点技术的非计算机专业人员.

    其他:

    基础语法的学习网站https://www.w3school.com.cn/sql/sql_where.asp

    针对SQL操作的练习网站推荐: http://sqlfiddle.com/


    2 概述

    SQL主要是针对数据库数据进行一系列操作的语言,基础操作主要是增删改查.针对一些SQL操作,使用的注释格式

    主要是以下两种方式。

    # 注释 //单行注释 /*多行注释 * 嘻嘻嘻 */ //多行注释

    2.1 创建和操纵表

    2.1.1 创建表语法

    create table <表名>( <列名1> <数据类型> <约束条件> <列名2> <数据类型> <约束条件> <列名3> <数据类型> <约束条件> ... );

    创建表的注意事项:

    在定义表时,可以在约束条件中指定该列允许或不允许NULL值。如果指定不允许NULL值,则在插入数据时如果为NULL就会报错。可以在定义表时使用默认值,使用关键词default <值>进行设定,如果在插入数据时没有值插入,则该列会插入默认值。

    2.1.2 更新表

    使用alter table语句

    alter table <表名> add column <列名> <数据类型>; //增加新列 alter table <表名> drop column <列名>; //删除列

    2.1.3 重命名表

    rename table <旧表名> to <新表名>; alter table <旧表名> rename to <新表名>;

    2.1.4 删除表

    drop table <表名>;

    2.2 检索数据

    2.2.1 检索单列

    select <列名> from <表名>;

    2.2.2 检索多列

    select <列名1>,<列名2>,... from <表名>;

    2.2.3 检索所有列

    select * from <表名>;

    2.2.4 检索不同值

    select distinct(<列名>) from <表名>;

    2.2.5 限制结果

    在MYSQL中,限制结果输出的条数,使用**limit <数字>**来表示限制的行数。


    2.3 数据排序

    对检索出来的数据进行排序:

    order by <列名> asc/desc;

    asc为升序排序,也是MYSQL中默认的排序方式;desc表示按照降序排序,也可以对多列进行排序,如下代码所示。

    order by <列名1> <排序方法>,<列名2> <排序方式>...;

    注意事项:

    order by语句通常位于查询语句的最后面。后面会具体介绍查询语句的完整构成。

    2.4 过滤数据

    2.4.1 使用where子句

    在SQL中,我们使用where子句来对查询出的结果进行过滤,得到我们所需要的数据。它的格式如下。

    select <列名> from <表名> where <过滤条件>;

    过滤条件有多个时,可使用and或or来进行多个条件的罗列。当有多个过滤条件是,and的优先级会高于or

    2.4.2 where子句操作符

    操作符描述=等于<>不等于>大于<小于>=大于等于<=小于等于BETWEEN在某个范围内LIKE搜索某种模式

    注意事项:

    在判断某个值是否为空值是,应使用is null或is not null来判断,而不是使用"= null"或"!= null"。

    2.4.3 使用通配符进行过滤

    在用通配符进行过滤时,我们使用like操作符进行。通配符主要包括两个,它们分别为百分号’%‘和下划线’’。其中’%‘表示任意长度的字符串,而下划线’'只表示一个字符。

    注意事项:

    ’%'不仅可以表示一个或多个字符,还可以表示0个字符。

    2.5 创建计算字段

    2.5.1 计算字段

    存储在数据库表中的数据一般不是应用程序所需要的格式,需要直接从数据库中检索出转化、计算或格式化过的数据,而不是检索出数据,然后再在客户机应用改程序或报告程序中重新格式化。只有数据库知道SELECT语句中那些列是实际的表列,哪些列是计算字段。

    2.5.2 拼接字段

    在MYSQL中,使用concat函数对字段进行拼接,格式如下。

    concat(str1, str2, str3......)

    对于字符串中存在的空格,用字符串处理函数**RTRIM()、LTRIM()、TRIM()**来进行处理。

    2.5.3 使用别名

    可以用关键字as来给列起一个别名。

    select <列名> as <别名> from <表名>;

    2.6 使用函数处理数据

    函数的可移植性是很强的,而且使用函数可以很方便的对数据进行处理。

    SQL函数主要有四种

    文本函数 left(s, n) //返回字符串左边的n个字符 right(s, n) //返回字符串右边的n个字符 trim(s) //去掉字符串s的空格 ltrim(s) //去掉字符串左边的空格 rtrim(s) //去掉字符串右边的空格 length(s) //计算字符串的长度 lower(s) //将字符串的所有字符变成小写 upper(s) //将字符串的所有字符变成大写 数值函数 abs(x) //绝对值 cos(x) sin(x) tan(x) acos(x) asin() atan() //三角函数 ceil(x) //返回大于或等于x的最小整数 floor(x) //舍去x的小数部分,只保留整数部分,并且不进行四舍五入 pi() //返回圆周率 sqrt(x) //平方根 pow(x, y) //x的y次方 exp(x) //返回e的x次方 rand() //返回0-1的随机数 round(x, y) //返回x的值小数点后面的第y位,进行四舍五入 truncate(x, y) //返回x的值小数点后面的第y位,不进行四舍五入 日期与时间函数 current_date() //返回当前日期 current_time() //返回当前时间 current_timestamp()/now() //返回当前日期和时间 date() //从日期或日期时间中提取出日期值 year() month() day() hour() minute() date_format(d, f) //以指定格式显示日期 datediff(date1,date2) //返回两个日期相差的天数,大日期在前 timediff(datetime1,datetime2) //返回形式为时:分:秒,大日期在前 timestampdiff(interval,timeSQL1,time2) //返回两个日期之差,大日期在后。精确到什么单位取决于第一个参数interval,可以为年---秒 系统函数

    2.7 汇总数据

    聚合函数:聚合函数就是用来数据汇总的一类函数。它们通常和分组数据进行结合使用。

    avg()min()max()count()sum()

    需要注意的是,聚合函数均不会处理NULL值。


    2.8 分组数据

    2.8.1 创建分组

    创建分组使用group by子句

    select <列名> from <表名> where <过滤条件> group by <列名> having <过滤条件> order by <列名> <排序方式>

    上面的格式也是select语句完整的SQL格式。

    2.8.1 过滤分组

    过滤分组使用having,where是行级过滤,having是组级过滤。


    2.9 使用子查询

    子查询也就是select语句的嵌套,有了子查询就可以进行复杂的查询。子查询返回的一张表,所以其位置也比较灵活,可以位于from后面,也可以位于where后面。子查询也可以说是一个一次性的视图。在执行顺序上,先执行子查询,再执行外层的查询。

    注意事项:

    where子句中不能使用聚合函数。

    2.10 联接表

    SQL表的连接主要分为以下几种。

    内连接外连接(左连接、右连接)自连接

    2.10.1 内连接

    语法格式如下:

    SELECT 查询字段 FROM1 [as] 别名 [INNER] JOIN2 [as] 别名 ON1.关系字段 =2.关系字段

    内连接就是得出两个表的交集部分。

    2.10.2 左连接

    语法格式如下:

    SELECT 查询字段 FROM1 [as] 别名 LEFT JOIN2 [as] 别名 ON1.关系字段 =2.关系字段

    左连接就是左边表的记录要全部显示出来,右表只有和左表匹配到的记录才进行显示。

    2.10.3 右连接

    和左连接相反。

    2.10.4 自连接

    把一张表看成两张表进行自连接,往往是一张表的某些列间存在逻辑关系。


    2.11 组合查询

    2.11.1 创建组合查询

    创建组合查询时我们使用UNION将两个或多个select语句查询出的结果组合在一起形成一个表。

    需要不同的select语句返回相同数量的列且对应列的数据类型相同,事实上应该是意义都一样才合理。

    2.11.2 union与union all

    对于组合查询出的结果,如果使用union,则会自动对结果进行去重。如果不想去重则使用union all。

    2.11.3 组合查询的排序

    对于组合查询结果的排序只需要使用一个order by子句,放在最后一个select语句的后面即可。


    2.12 插入、更新与删除数据

    2.12.1 插入数据

    insert into <表名>(列名1,列名2,...) values (数据...);

    虽然表名后面的列名表不是严格要求的,但是这样会更安全。如果不写出列名,则需要严格按照表的定义插入数据。如果我们只需要插入一行中的部分列,那么列出列名就变得必须了。

    2.12.2 插入检索出的数据

    使用insert…select语句进行。

    insert into <表名>(列名表) select <列名表> from <表名>;

    2.12.3 复制表

    create table copytable as select * from <表名>;

    2.12.4 更新数据

    update <表名> set <列名> = ... where <过滤条件>;SQL

    不要忘了过滤条件,否则将会对所有行的数据进行更新。

    2.12.5 删除数据

    delete from <表名> where <过滤条件>;

    如果要删除某行中某列的元素,可以将其值更新为NULL。


    2.13 使用视图

    视图是一张虚表,它并不存储实际的数据,存储的只是select语句。

    使用视图有如下的优点

    提高sql语句的重用性保证了数据的安全性SQL大大简化了SQL语句

    创建视图

    create view <视图名> as <select语句>;

    删除视图

    drop view <视图名>;

    2.14 事务

    2.14.1 什么是事务

    需要在同一个处理单元中执行的一系列更新处理的集合.

    2.14.2 语法

    start transaction; DML语句1; DML语句2; DML语句3... ROLLBACK/COMMIT;

    2.14.3 理解事务

    事务其实很好理解,它将一系列操作放在一个块中形成一个代码块,这个代码块要执行就全部执行,要么就不执行。拿银行转账举例,转账的过程为,我的账户金额减少——>对方账户金额增加——>交易完毕。如果我的账户金额减少后出现了故障导致对方账户金额没有增加,那么这肯定是不被允许的。所以这个转账过程中的每一步都必须完整的执行。rollback就是在操作执行出现故障时,来使得数据库回滚到执行操作前的状态。而commit则是所有操作正确执行后才执行,告诉系统这个事务正常完成了,系统可以进入下一个新的状态了。

    Processed: 0.028, SQL: 8