数据库笔记

(一)数据库简介


1、概述

  • 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。
  • 数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。
  • 简而言之,数据库就是存储数据的仓库,其本身并不能做任何操作,依赖于DBMS才能处理。

2、数据库管理系统软件(DBMS)

一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS:

  • 它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
  • 用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。
  • 它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
  • 大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
  • 数据库管理系统是数据库系统的核心,是管理数据库的软件。
  • 数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。
  • 有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。
  • 常见的数据库管理软件:甲骨文的oracle,IBM的db2,sql server,Access,Mysql(开源,免费,跨平台).

3、数据库系统 

数据库系统DBS(Data Base System,简称DBS)通常由软件、数据库和数据管理员组成。

  • 其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。
  • 数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。
  • 数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。


(二)mysql


1、mysql的管理 

1.1 安装 

  • linux:
    • yum -y install mariadb mariadb-server
    • yum -y install mysql mysql-server
  • Windows
    • http://dev.mysql.com/downloads/mysql/

1.2 启动 

  • 开启:
    • service mysqld start
    • systemctl start mariadb
  • 设置开机自启:
    • chkconfig mysqld on
    • systemctl enable mariadb

1.3 查看 

  • 查看进程:ps aux |grep mysqld
  • 查看端口:netstat -an |grep 3306

1.4 设置密码 

  • 设置初始密码,初始密码为空,因此-p选项没有用:mysqladmin -uroot password '123' 
  • 修改root用户密码:mysqladmin -u root -p123 password '1234'

1.5 登录 

  • 本地登录,默认用户root,空密码,用户为root@127.0.0.1:mysql
  • 本地登录,指定用户名和密码,用户为root@127.0.0.1: mysql -uroot -p1234
  • 远程登录,用户为root@192.168.31.95:mysql -uroot -p1234 -h 192.168.31.95

1.6 配置文件 

MySQL的配置文件‌:通常位于/etc/mysql/my.cnf/etc/my.cnf(取决于操作系统和MySQL的安装方式) 

1.7 mysqlmysqld

  • mysql是命令行客户端工具,用于与MySQL数据库交互:
    • 主要功能是连接到MySQL数据库服务器,发送SQL查询,显示查询结果,以及管理数据库用户和权限等。
    • 用户可以通过mysql客户端在命令行中输入SQL语句,执行查询并查看结果‌。
  • mysqld是MySQL数据库服务器的核心程序,负责处理数据库相关的请求‌:
    • MySQL数据库服务器的守护进程;
    • 负责处理所有与数据库相关的请求,包括但不限于启动和关闭数据库、接受客户端的连接请求、执行SQL查询和事务管理等。
    • mysqld是MySQL的后台服务,它管理数据库的存储,处理用户请求,并确保数据的一致性和完整性‌。

简而言之,mysql是用户与MySQL数据库进行交互的客户端工具,而mysqld则是实际运行数据库服务的服务器端程序‌

1.8 更新 

在命令行中更新MySQL数据库通常涉及以下步骤:

  1. 检查当前MySQL版本‌:select version();

  2. 备份数据‌:使用mysqldump工具来备份数据,例如:mysqldump -u username -p --all-databases > alldb_backup.sql

  3. 访问MySQL官方网站‌:https://dev.mysql.com/downloads/获取最新版本的MySQL,选择适合操作系统的安装包,并下载。

  4. 停止MySQL服务‌:根据操作系统,使用相应的命令来停止MySQL服务。例如,在Linux上,可以使用systemctlservicemysqld_safe命令。

  5. 卸载旧版本的MySQL‌:根据操作系统,使用适当的命令卸载旧版本的MySQL。例如,在Linux上,可以使用包管理器来卸载MySQL,如apt-getyum等。

  6. 安装新版本的MySQL‌:

    1. 下载完成后,将MySQL安装包解压到一个目录中;

    2. 在命令行中导航到解压后的目录;

    3. 根据操作系统执行适当的安装命令,例如,在Linux上,可以使用dpkgrpm命令来安装新版本的MySQL。

  7. 启动新版本的MySQL服务‌:安装完成后,使用相应的命令来启动新版本的MySQL服务。

  8. 验证更新‌:再次登录到MySQL服务器,并运行select version();命令来验证新版本的MySQL是否已成功安装和运行。

  9. 恢复数据库(如果需要)‌:如果之前备份了数据库,并且在新版本的MySQL中需要恢复数据,可以使用mysql命令来导入备份文件。例如:

    mysql -u username -p < alldb_backup.sql

  10. 测试应用程序‌:确保应用程序与新版本的MySQL兼容,并进行必要的测试。

  11. 注意事项:

    1. 具体的命令和步骤可能会根据你的操作系统和MySQL版本有所不同。

    2. 在执行上述步骤之前,请务必查阅MySQL官方文档或相关社区获取针对环境的详细指导。

    3. 如果是Linux操作系统,并且系统包管理器(如aptyum)提供了MySQL的更新,你通常可以使用包管理器来更新MySQL,而无需手动下载和安装新版本。

    4. 例如:

      1. 在Ubuntu上,使用以下命令来更新MySQL:sudo apt update sudo apt install mysql-server

      2. 将自动处理下载、安装和配置更新的过程。

1.9 忘记密码 

(1)启动mysql时,跳过授权表 
[root@controller ~]# service mysqld stop
[root@controller ~]# mysqld_safe --skip-grant-table &
[root@controller ~]# mysql
mysql> select user,host,password from mysql.user;
+----------+-----------------------+-------------------------------------------+
| user     | host                  | password                                  |
+----------+-----------------------+-------------------------------------------+
| root     | localhost             | *A4B6157319038724E3560894F7F932C8886EBFCF |
| root     | localhost.localdomain |                                           |
| root     | 127.0.0.1             |                                           |
| root     | ::1                   |                                           |
|          | localhost             |                                           |
|          | localhost.localdomain |                                           |
| root     | %                     | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+----------+-----------------------+-------------------------------------------+
mysql> update mysql.user set password=password("123") where user="root" and host="localhost";
mysql> flush privileges;
mysql> exit
[root@controller ~]# service mysqld restart
[root@controller ~]# mysql -uroot -p123
(2)删库
--删除与权限相关的库mysql,所有的授权信息都丢失,主要用于测试数据库或者刚刚建库不久没有授权数据的情况(从删库到跑路)
[root@controller ~]# rm -rf /var/lib/mysql/mysql
[root@controller ~]# service mysqld restart
[root@controller ~]# mysql

2、mysql的常用命令 

2.1 检查MySQL是否已正确安装‌ 

  • Linux终端(取决于哪个Linux发行版)
    • 尝试登陆:mysql -u root -p命令
    • 查看MySQL的版本信息:mysql --versionmysql -V命令
    • 系统检查服务(检查MySQL服务状态):
      • sudo systemctl status mysql命令(现代标准)
      • sudo service mysql status命令(更老的版本)
    • 包管理器检查‌(针对通过包管理器安装的MySQL):
      • rpm -q mysql或rpm -qa | grep mysql(RedHat/CentOS系)
      • dpkg -l | grep mysql (Debian/Ubuntu系)
  • windows:
    • 打开cmd输入mysql -u root -p尝试登陆
    • 打开“服务”管理器(运行services.msc),查找名为“MySQL”的服务
    • 检查MySQL安装目录:一般情况下是C:\Program Files\MySQL\MySQL Server x.x(x.x代表版本号)

2.2 启动mysql服务

  • Linux:
    • 使用systemctl命令‌(大多数现代Linux发行版):
      • sudo systemctl start mysql命令(现代Linux发行版的标准服务管理器命令)
      • 如果MySQL服务名称不是mysql,则需要替换为实际的服务名称,如mysqld等‌。
    • 使用service命令或init.d脚本(较老的Linux发行版或特定情况‌:
      • /etc/init.d/mysql start命令
      • 如果权限不够,前面加个sudo
      • sudo service mysql start命令
  • windows:
    • 使用命令提示符‌:
      • 以管理员身份运行命令提示符cmd;
      • 输入net start mysql命令
      • 注意,如果MySQL服务名称不是默认的mysql,则需要替换为实际的服务名称,如mysql80等‌。
    • 使用服务管理器‌:
      • 按下Win + R键,输入services.msc,按Enter键打开服务管理器;
      • 在服务列表中找到名为“MySQL”的服务;
      • 右键点击并选择“启动”选项即可‌。
    • 直接运行mysqld.exe‌:
      • 找到MySQL安装目录下的bin文件夹;
      • 双击运行mysqld.exe文件
      • 不常用‌

 2.3 停止mysql服务

  • Linux:
    • 使用systemctl命令‌(大多数现代Linux发行版):
      • sudo systemctl stop mysql命令(现代Linux发行版的标准服务管理器命令)
      • 如果MySQL服务名称不是mysql,则需要替换为实际的服务名称,如mysqld等‌。
    • 使用service命令或init.d脚本(较老的Linux发行版或特定情况‌:
      • /etc/init.d/mysql stop命令
      • 如果权限不够,前面加个sudo
      • sudo service mysql stop命令
    • 以上方法都无效,强制停止MySQL服务:
      • sudo killall -9 mysqld命令
      • 可能会导致数据丢失或损坏,应谨慎使用‌
  • windows:
    • 使用命令提示符‌:
      • 以管理员身份运行命令提示符cmd;
      • 输入net stop mysql命令
      • 注意,如果MySQL服务名称不是默认的mysql,则需要替换为实际的服务名称,如mysql80等‌。
    • 使用服务管理器‌:
      • 按下Win + R键,输入services.msc,按Enter键打开服务管理器;
      • 在服务列表中找到名为“MySQL”的服务;
      • 右键点击并选择“停止”选项即可‌。

2.4 检查 MySQL 服务是否正在运行 

  • Linux终端(取决于哪个Linux发行版)
    • 系统检查服务(检查MySQL服务状态):
      • sudo systemctl status mysql命令,如果服务正在运行,提示Active: active (running)
      • sudo service mysql status命令(更老的版本)
      • sudo /etc/init.d/mysql status命令(某些版本)
    • 查看进程:
      • ps aux | grep mysql命令
      • 看是否有MySQL的进程正在运行
  • windows:
    • 命令提示符cmd:
      • 输入net start | findstr "MySQL"命令
      • 会列出当前正在运行的服务中包含"MySQL"的服务名称
    • 打开“服务”管理器(运行services.msc),查找名为“MySQL”的服务,看状态是否为“正在运行”‌

2.5 登录mysql

  • Linux:
    • 使用命令:mysql -h 服务器IP -P 端口号 -u  用户名 -p 密码 --prompt 命令提示符  ---delimiter 指定分隔符
      • 如果是本地登录,服务器IP默认是127.0.0.1,端口号是3306,可以不用写,或写-h localhost,如果是远程登录,要写上;
      • -p必须写,密码可以回车后输入,更安全(显示密文)
      • prompt 命令提示符:
        • 命令行界面中显示的文本,默认提示符通常是 mysql>,这表示用户可以在此处输入SQL语句
        • 设置prompt:
          • 登录命令中指定--prompt选项
          • 可以进入mysql命令行后,使用 \P 新命令提示符 命令
      • delimiter 指定分隔符:
        • MySQL命令行客户端识别SQL语句结束的默认分隔符(默认是分号 ;)
        • 设置delimiter:
          • 登陆命令中指定--delimiter选项
          • 可以进入mysql命令行后使用 delimiter 新分割符 命令
          • 只影响MySQL命令行客户端和与之类似的工具(如MySQL Workbench的SQL编辑器)。
          • 如果在其他环境中(如PHP脚本、Java程序等)执行SQL语句,通常不需要(也不能)使用DELIMITER命令。
  • windows:
    • 命令提示符:输入mysql -h 服务器IP -P 端口号 -u  用户名 -p 密码
      • 如果是本地登录,服务器IP默认是127.0.0.1,端口号是3306,可以不用写,或写-h localhost,如果是远程登录,要写上;
      • -p必须写,密码可以回车后输入,更安全(显示密文)
    • 使用MySQL自带的命令行客户端:
      • 在开始菜单中找到“MySQL”文件夹;
      • 点击“MySQL X.X Command Line Client”(X.X代表版本号)进行登录;
      • 这种方式通常仅限于root用户或其他具有相应权限的用户‌

2.6 退出mysql 

windows和Linux一样:在MySQL命令行提示符( mysql>)下,输入 exit、 quit或\q命令,然后按回车键即可退出MySQL‌

2.7 显示MySQL服务器的状态信息 

  • mysql命令行中‌输入 \s 命令‌:
    • 在某些情况下可能需要加上分号 \s;表示语句结束,但通常不是必需的
    • MySQL会返回一系列关于服务器状态的信息,包括版本、连接信息、线程信息、查询统计、内存使用等。
  • mysql命令行中输入 show status; 命令‌:
    • 显示一个结果集,其中包含大量的服务器状态变量和它们的值。
    • 这些状态变量提供了关于服务器性能的详细信息,比如查询次数、连接数、缓存使用情况等。
    • 如果只对某个特定的状态变量感兴趣,可以使用类似 show status like 'variable_name'; 的命令来查询。
    • 例如:show status like 'Threads_connected'; 会返回当前连接到服务器的线程数。
  • 查询information_schema.global_status表和information_schema.session_status表:
    • MySQL 5.1及更高版本;
    • 获取全局和会话级别的状态信息;
    • 提供了与 show status; 命令相同的信息,但是以表的形式呈现,可以使用标准的SQL查询来筛选和排序结果。
  • 注意事项:
    • \s 命令是一个快捷命令,它实际上执行了一系列查询来收集服务器的状态信息,并将结果以易于阅读的格式显示出来。
    • 而 show status; 命令则提供了更详细、更原始的数据,适合需要进一步分析或处理的场景。

2.8 显示当前系统的日期和时间 

  • 使用内置的 now() 函数或者current_timestamp函数,显示当前系统的日期和时间,格式通常为 YYYY-MM-DD HH:MM:SS:
  • 使用内置的 curdate() 函数,只显示当前系统的日期,格式通常为 YYYY-MM-DD:
  • 使用内置的 curtime() 函数,只显示当前系统的时间,格式通常为 HH:MM:SS:
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-02-02 16:12:06 |
+---------------------+
1 row in set (0.00 sec)

mysql> select current_timestamp;
+---------------------+
| current_timestamp   |
+---------------------+
| 2024-02-02 16:13:16 |
+---------------------+
1 row in set (0.00 sec)

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2024-02-02 |
+------------+
1 row in set (0.00 sec)

mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 16:21:47  |
+-----------+
1 row in set (0.00 sec)

2.9 批量导入和导出数据库 

用于数据备份、迁移、数据分析等目的:

  • 批量导入‌:
    • 将大量数据一次性地导入到数据库中。
    • 与逐条插入数据相比,批量导入能够显著提高数据导入的效率,特别是在处理大规模数据时。
  • 批量导出‌:将数据库中的数据导出为文件或其他格式,以便进行备份、迁移或数据分析等操作。
(1)常用方法
  1. 使用数据库管理工具‌:

    • 大多数数据库管理工具(如MySQL Workbench、SQL Server Management Studio等)都提供了数据导入和导出功能,可以通过图形化界面方便地完成操作。
  2. 使用命令行工具‌:

    • 数据库系统通常也提供了命令行工具,用于执行导入和导出操作。例如,MySQL的mysqlimportmysqldump命令,SQL Server的bcp命令等。
  3. 使用脚本语言编写脚本‌:

    • 可以使用脚本语言(如Python、Java、C#等)编写脚本来实现数据的批量导入和导出。这种方法通常具有更高的灵活性和可定制性。
  4. 使用ETL工具‌:

    • ETL(Extract, Transform, Load)工具专门用于数据集成和转换。它们可以从各种数据源提取数据,进行清洗和转换,然后加载到目标数据库中。常见的ETL工具有Talend、Pentaho、Informatica等。

 

(2)示例 
--MySQL批量导出示例:
# 导出整个数据库
mysqldump -u root -p mydatabase > mydatabase_backup.sql
# 导出特定表
mysqldump -u root -p mydatabase mytable > mytable_backup.sql
--MySQL批量导入示例:
# 导入整个数据库
mysql -u root -p mydatabase < mydatabase_backup.sql

# 导入特定表(需要先创建表结构)
mysql -u root -p mydatabase < mytable_backup.sql
--如果SQL文件中包含创建数据库的语句,可以省略数据库名:
mysql -u root -p < mydatabase_backup.sql
(3)注意事项 
  • 在进行批量导入和导出操作时,应确保数据的一致性和完整性。
  • 对于大规模数据的导入和导出,应考虑性能优化和错误处理。
  • 在生产环境中进行此类操作时,应选择在系统负载较低的时段进行,以减少对业务的影响。
  • 确保只有授权用户才能执行导入和导出操作,以保障数据的安全性。

 2.10 mysql随记

连接数据库:sudo  mysql -u root -p 密码
如果登陆出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)错误,先运行命令/etc/init.d/mysql start,再重新登陆
退出:exit/quit/ctrl+d
查看所有数据库列表:show databases;
显示当前数据库时间:select now();
显示数据库版本:select version();
创建数据库:create database 数据库名;(默认编码格式latin1)
创建数据库(指定编码格式):create database 数据库名 charset=utf8;
查看创建数据库的语句:show create database 创建的数据库名;
删除数据库:drop database 数据库名;
让包含‘-’的字符串成为整体:`字符串`
查看当前数据库:select database();
使用数据库:use 数据库名;
--数据表的操作:
查看当前数据库所有表:show tables;
创建数据表:create table 表名(字段名 类型名 约束[,字段名 类型名 约束]);
无符号整型:int unsigned
枚举类型:enum 下标从1开始,插入值时可写入对应下标
约束:主键:primary key
          不为空:not null
          默认值:default
          自动增长:auto_increment
查看数据表结构:desc 数据表名;
SQL中注释:-- 注释内容
更改数据表结构:
增加字段:alter table 数据表名 add 增加的字段 类型及约束;
修改字段(不重命名):alter table 数据表名 modify 列名 新的类型及约束;
修改字段(重命名):alter table 数据表名 change 原列名 新列名 新的类型及约束;
删除字段:alter table 数据表名 drop 列名;
删除数据表:drop table 数据表名;
查看数据表的创建语句:show create table 创建的数据表名;
往数据表中插入数据(方式1):insert into 数据表名 values(对应字段数据以逗号分隔);
往数据表中插入数据(方式1多行插入):insert into 数据表名 values(对应字段数据以逗号分隔)[,(对应字段数据以逗号分隔)];
往数据表中插入数据(方式2):insert into 数据表名(字段1[,字段2,...]) values(字段1值[,字段2值,...]);
往数据表中插入数据(方式2多行插入):insert into 数据表名(字段1[,字段2,...]) values(字段1值[,字段2值,...])[,(字段1值[,字段2值,...])];
修改数据表中数据:update 数据表名 set 字段1=值1[,字段2=值2,...][ where 条件];
查看数据表所有数据:select * from 数据表名;
按照条件查询数据:select * from 数据表名 where 条件;
只查询部分列:select 字段1 as 别名1[,字段2 as 别名2,...] from 数据表名 [where 条件];
--物理删除,不推荐
删除数据表中所有数据:delete from 数据表名;
按照条件删除数据表中的数据:delete from 数据表名 where 条件;
--逻辑删除:增加有效列(二进制bit),update 数据表名 set 有效标志字段=值1 where 删除条件;

--模糊查询:
like:% 替换任意个字符
        _   替换1个
rlike:正则表达式:
          ^ 开头
          $ 结尾
           . 任意一个字符(\n除外)
           * 前一个字符出现0到多次
           + 前一个字符至少出现一次
--范围查询:
不连续范围in not in
连续范围 between……and……
	not between……and……
-- 判断空:is null/ is not null
-- 排序:order by 字段 asc(升序)/desc(降序) 缺省默认:升序

-- 聚合函数
	--总数:count()
	--最大值:max()
	--最小值:min()
	--求和:sum()
	--平均值:avg()
	--四舍五入:round(值, 保留小数点位数)
-- 分组
	--group by 字段名
	--grop_concat(字段名列表) 获取同一分组中的该字段对应数据
	--having 选择符合条件的分组

	--where和having区别:where对原表筛选,having对查询出来的结果筛选
-- 分页
	--limit 限制查询出来的数据行数
	--limit 查询起始下标(从0开始),限制查询出来的数据行数
	--limit (第N页-1)*每页数据行数,每页数据行数
	--limit写在语句最后
--连接查询
	--内连接:select ... from 表A inner join 表B on 表A.字段=表B.字段;

(三)SQL规范


SQL,全称Structured Query Language,即结构化查询语言,是一种专门用来与关系型数据库进行通信、查询、更新和管理数据库数据的编程语言。它允许用户通过编写查询语句来访问和操作数据库中的数据,这些操作包括数据的插入、查询、更新和删除等。

1、SQL特点 

  1. 综合性‌:SQL不仅是一个查询语言(DQL,如SELECT语句),它还包含了数据定义(DDL,如CREATE、ALTER、DROP语句)、数据操作(DML,如INSERT、UPDATE、DELETE语句)、数据控制(DCL,如GRANT、REVOKE语句)以及事务控制(TCL,如COMMIT、ROLLBACK语句)等多个方面的功能。

  2. 高度非过程化‌:用户在使用SQL时,无需指定具体的存取路径,只需描述想要执行的操作和条件,数据库管理系统(DBMS)会自动完成数据的存取和优化工作。

  3. 面向集合的操作方式‌:SQL采用集合操作方式,如并、交、差及笛卡尔积等,这使得SQL能够一次性处理多个数据行,大大提高了数据处理的效率。

  4. 以同一种语法结构提供多种使用方式‌:SQL既能够作为独立的交互式查询语言使用,也能够嵌入到其他语言(如C、C++、Java等)中作为数据库操作的部分。

  5. 语言简洁,易学易用‌:SQL的语法结构相对简单,且其设计贴近英语语法,使得用户能够更容易地学习和掌握。

在实际应用中,SQL被广泛应用于各种关系型数据库管理系统(如MySQL、PostgreSQL、Oracle、SQL Server等)中,成为数据库管理和数据分析领域不可或缺的工具。

2、书写规范

SQL语句的书写规范对于提高代码的可读性、可维护性和性能至关重要。以下是一些常见的SQL语句书写规范:

  1. 关键字大小写‌:

    • SQL语句不区分大小写,但字符串常量区分大小写,为了提高代码的可读性,通常约定关键字大写,库名、表名、列名等小写。
  2. 语句格式‌:

    • SQL语句可以写在一行,但为了提高可读性,一般建议每个关键字或逻辑部分(子句)单独占一行。
    • 关键词不能跨多行或简写。
    • 使用空格、缩进、换行等格式化符号来提高代码的可读性。
      SELECT * 
      FROM tb_table
      WHERE NAME="YUAN";
  3. 语句结束‌:

    • SQL语句以分号结尾,表示语句的结束。
  4. 注释‌:

    • SQL语句可以使用注释,单行注释以"--“开头,多行注释以”/*“开始,以”*/"结束。
    • 对较为复杂的SQL语句加上注释,说明算法、功能。
  5. 标识符命名‌:

    • SQL语句中的关键字、表名、列名等标识符要符合数据库的命名规范,一般建议使用英文字符和下划线,避免使用特殊字符或中文。
  6. 字符串和日期‌:

    • SQL语句中的字符串要用单引号或双引号括起来,数字和日期等类型不需要。
  7. 条件表达式‌:

    • SQL语句中的条件表达式要用括号括起来,以明确逻辑顺序。
  8. ‌避免使用SELECT *:

    • 编写SQL语句时,不要习惯性编写SELECT *,只返回自己想要的字段。
  9. 表别名‌:

    • 连接多表时使用表的别名并在每个字段前面加上别名,以减少解析时间并避免字段歧义引起的语法错误。
  10. 索引使用‌:

    • 查询语句时尽量使用索引,以提高查询性能。
  11. 避免复杂查询‌:

    • 应避免写非常复杂的SQL语句,以减少解析和执行时间。
  12. 避免全表扫描‌:

    • SQL语句应避免对大表的全表扫描操作,对大表的操作应尽量使用索引。
  13. 减少排序‌:

    • SQL语句应避免不必要的排序,以减少CPU和内存的使用。
  14. 变量绑定‌:

    • 应使用变量绑定实现SQL语句共享,避免使用硬编码:
      • 硬编码:将具体的值直接写入SQL语句中,缺乏灵活性和可维护性,可能增加SQL注入的风险
      • 变量绑定:即参数化查询,在SQL语句中定义占位符,然后在执行时将这些占位符替换为实际的变量值,因为变量值在传递给数据库之前会被适当地处理和转义,可以防止SQL注入攻击,也能增强性能和可维护性,促进代码重用。
        # 变量绑定例子:使用python的sqlite3与SQLite数据库交互
        import sqlite3
        # 连接到数据库
        conn = sqlite3.connect('example.db')
        cursor = conn.cursor()
        # 定义一个带参数的SQL查询
        sql_query = "SELECT * FROM users WHERE username = ?"
        # 定义要绑定的变量值
        username = "john_doe"
        # 执行查询并绑定变量
        cursor.execute(sql_query, (username,))
        # 获取查询结果
        results = cursor.fetchall()
        # 处理结果...
        for row in results:
            print(row)
        # 关闭连接
        cursor.close()
        conn.close()
  15. 事务处理‌:

    • 应按照业务需要使用事务,同时应保持事务简短,避免大事务。
  16. 正确使用SQL函数:
    • 不同的数据库管理系统(例如MySQL、PostgreSQL、SQL Server等)可能会提供各自特有的函数,并且某些函数的名称和用法也可能存在差异。
    • 在实际应用中,应参考所使用数据库的官方文档来获取最准确的信息。
  17. SQL操作符:
    • 用于查询、操作和控制数据库数据的符号和命令。
  18. SQL语句执行顺序:
    • 与书写顺序并不完全相同
    • 书写SQL语句时,我们通常按照逻辑上的顺序来编写,如先指定要查询的字段(SELECT),再指定数据来源(FROM),然后添加筛选条件(WHERE)等。
    • 执行SQL语句时,数据库引擎会遵循一个固定的顺序来处理这些子句,以确保查询的准确性和效率。
  19. sql语句的五种分类:
    • DQL、DDL、DML、DCL和TCL,各自有不同的功能和应用场景,但又相互关联,共同构成了SQL语言的完整体系,使得用户能够灵活地对数据库进行各种操作和管理。

2.1 常见SQL操作符 

SQL操作符用于查询、操作和控制数据库数据的符号和命令,广泛应用于数据检索、过滤、排序和计算等任务中 

(1)算术操作符
  • +‌:加法:
    • 常用于查询和更新操作中,计算字段值之和,如累计销售额、计算总分等
    • 如果一个操作数是NULL,则结果也是NULL。为了避免这种情况,可以使用ISNULL函数或COALESCE函数将NULL值替换为其他值。
    • SELECT ISNULL(amount, 0) + ISNULL(tax, 0) AS total_amount 
      FROM sales;
      --或:
      SELECT COALESCE(amount, 0) + COALESCE(tax, 0) AS total_amount 
      FROM sales;
      
  • -‌:减法:
    • 常用于计算字段值之差,如计算折扣后的价格、剩余库存等
    • 如果减法运算中的一个操作数是NULL,则结果也是NULL。为了避免这种情况,可以使用ISNULL函数或COALESCE函数将NULL值替换为其他值。例如:
      SELECT ISNULL(original_price, 0) - ISNULL(discount, 0) AS discounted_price 
      FROM products;
      --或:
      SELECT COALESCE(original_price, 0) - COALESCE(discount, 0) AS discounted_price 
      FROM products;
  • *:乘法:
    • 常用于计算字段值之间的乘积,如计算总价、折扣价等。
    • 适用于除datetimesmalldatetime数据类型之外的任何数值数据类型,包括整数、浮点数等‌
    • 如果运算数中包含非数值类型,SQL会尝试将其转换为数值类型进行计算。如果转换失败,则通常按0计算‌
  • /‌:除法:
    • 常用于计算比例、平均值或进行单位转换等。
    • 除数为零会导致错误。为了避免这种情况,可以使用CASE语句、NULLIF函数或其他逻辑来检查除数是否为零。例如:
      SELECT 
          CASE 
              WHEN number_of_sales = 0 THEN NULL 
              ELSE total_sales / number_of_sales 
          END AS average_sales 
      FROM sales;
      --或:
      SELECT total_sales / NULLIF(number_of_sales, 0) AS average_sales 
      FROM sales;  
      --NULLIF(number_of_sales, 0)会在number_of_sales为零时返回NULL,从而避免零除错误
  • %‌:取模(求余数):
    • 检查数值是否能被另一个数值整除,或者用于生成循环序列等场景。
    • 谨慎处理可能的结果为零值,然后作为除数,导致的除零情况。
mysql> SELECT 10 + 5 AS sum;
+-----+
| sum |
+-----+
|  15 |
+-----+
1 row in set (0.01 sec)

mysql> SELECT 10 - 5 AS difference;
+------------+
| difference |
+------------+
|          5 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT 10 * 5 AS product;
+---------+
| product |
+---------+
|      50 |
+---------+
1 row in set (0.01 sec)

mysql> SELECT 10 / 5 AS quotient;
+----------+
| quotient |
+----------&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值