(一)数据库简介
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 mysql和mysqld
- mysql是命令行客户端工具,用于与MySQL数据库交互:
- 主要功能是连接到MySQL数据库服务器,发送SQL查询,显示查询结果,以及管理数据库用户和权限等。
- 用户可以通过mysql客户端在命令行中输入SQL语句,执行查询并查看结果。
- mysqld是MySQL数据库服务器的核心程序,负责处理数据库相关的请求:
- MySQL数据库服务器的守护进程;
- 负责处理所有与数据库相关的请求,包括但不限于启动和关闭数据库、接受客户端的连接请求、执行SQL查询和事务管理等。
- mysqld是MySQL的后台服务,它管理数据库的存储,处理用户请求,并确保数据的一致性和完整性。
简而言之,mysql是用户与MySQL数据库进行交互的客户端工具,而mysqld则是实际运行数据库服务的服务器端程序
1.8 更新
在命令行中更新MySQL数据库通常涉及以下步骤:
检查当前MySQL版本:
select version();
备份数据:使用
mysqldump
工具来备份数据,例如:mysqldump -u username -p --all-databases > alldb_backup.sql
访问MySQL官方网站:https://dev.mysql.com/downloads/获取最新版本的MySQL,选择适合操作系统的安装包,并下载。
停止MySQL服务:根据操作系统,使用相应的命令来停止MySQL服务。例如,在Linux上,可以使用
systemctl
、service
或mysqld_safe
命令。卸载旧版本的MySQL:根据操作系统,使用适当的命令卸载旧版本的MySQL。例如,在Linux上,可以使用包管理器来卸载MySQL,如
apt-get
、yum
等。安装新版本的MySQL:
下载完成后,将MySQL安装包解压到一个目录中;
在命令行中导航到解压后的目录;
根据操作系统执行适当的安装命令,例如,在Linux上,可以使用
dpkg
或rpm
命令来安装新版本的MySQL。启动新版本的MySQL服务:安装完成后,使用相应的命令来启动新版本的MySQL服务。
验证更新:再次登录到MySQL服务器,并运行
select version();
命令来验证新版本的MySQL是否已成功安装和运行。恢复数据库(如果需要):如果之前备份了数据库,并且在新版本的MySQL中需要恢复数据,可以使用
mysql
命令来导入备份文件。例如:
mysql -u username -p < alldb_backup.sql
测试应用程序:确保应用程序与新版本的MySQL兼容,并进行必要的测试。
注意事项:
具体的命令和步骤可能会根据你的操作系统和MySQL版本有所不同。
在执行上述步骤之前,请务必查阅MySQL官方文档或相关社区获取针对环境的详细指导。
如果是Linux操作系统,并且系统包管理器(如
apt
或yum
)提供了MySQL的更新,你通常可以使用包管理器来更新MySQL,而无需手动下载和安装新版本。例如:
在Ubuntu上,使用以下命令来更新MySQL:
sudo apt update sudo apt install mysql-server
将自动处理下载、安装和配置更新的过程。
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 --version
或mysql -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)常用方法
使用数据库管理工具:
- 大多数数据库管理工具(如MySQL Workbench、SQL Server Management Studio等)都提供了数据导入和导出功能,可以通过图形化界面方便地完成操作。
使用命令行工具:
- 数据库系统通常也提供了命令行工具,用于执行导入和导出操作。例如,MySQL的
mysqlimport
、mysqldump
命令,SQL Server的bcp
命令等。使用脚本语言编写脚本:
- 可以使用脚本语言(如Python、Java、C#等)编写脚本来实现数据的批量导入和导出。这种方法通常具有更高的灵活性和可定制性。
使用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特点
综合性:SQL不仅是一个查询语言(DQL,如SELECT语句),它还包含了数据定义(DDL,如CREATE、ALTER、DROP语句)、数据操作(DML,如INSERT、UPDATE、DELETE语句)、数据控制(DCL,如GRANT、REVOKE语句)以及事务控制(TCL,如COMMIT、ROLLBACK语句)等多个方面的功能。
高度非过程化:用户在使用SQL时,无需指定具体的存取路径,只需描述想要执行的操作和条件,数据库管理系统(DBMS)会自动完成数据的存取和优化工作。
面向集合的操作方式:SQL采用集合操作方式,如并、交、差及笛卡尔积等,这使得SQL能够一次性处理多个数据行,大大提高了数据处理的效率。
以同一种语法结构提供多种使用方式:SQL既能够作为独立的交互式查询语言使用,也能够嵌入到其他语言(如C、C++、Java等)中作为数据库操作的部分。
语言简洁,易学易用:SQL的语法结构相对简单,且其设计贴近英语语法,使得用户能够更容易地学习和掌握。
在实际应用中,SQL被广泛应用于各种关系型数据库管理系统(如MySQL、PostgreSQL、Oracle、SQL Server等)中,成为数据库管理和数据分析领域不可或缺的工具。
2、书写规范
SQL语句的书写规范对于提高代码的可读性、可维护性和性能至关重要。以下是一些常见的SQL语句书写规范:
关键字大小写:
- SQL语句不区分大小写,但字符串常量区分大小写,为了提高代码的可读性,通常约定关键字大写,库名、表名、列名等小写。
语句格式:
- SQL语句可以写在一行,但为了提高可读性,一般建议每个关键字或逻辑部分(子句)单独占一行。
- 关键词不能跨多行或简写。
- 使用空格、缩进、换行等格式化符号来提高代码的可读性。
SELECT * FROM tb_table WHERE NAME="YUAN";
语句结束:
- SQL语句以分号结尾,表示语句的结束。
注释:
- SQL语句可以使用注释,单行注释以"--“开头,多行注释以”/*“开始,以”*/"结束。
- 对较为复杂的SQL语句加上注释,说明算法、功能。
标识符命名:
- SQL语句中的关键字、表名、列名等标识符要符合数据库的命名规范,一般建议使用英文字符和下划线,避免使用特殊字符或中文。
字符串和日期:
- SQL语句中的字符串要用单引号或双引号括起来,数字和日期等类型不需要。
条件表达式:
- SQL语句中的条件表达式要用括号括起来,以明确逻辑顺序。
避免使用SELECT *:
- 编写SQL语句时,不要习惯性编写
SELECT *
,只返回自己想要的字段。表别名:
- 连接多表时使用表的别名并在每个字段前面加上别名,以减少解析时间并避免字段歧义引起的语法错误。
索引使用:
- 查询语句时尽量使用索引,以提高查询性能。
避免复杂查询:
- 应避免写非常复杂的SQL语句,以减少解析和执行时间。
避免全表扫描:
- SQL语句应避免对大表的全表扫描操作,对大表的操作应尽量使用索引。
减少排序:
- SQL语句应避免不必要的排序,以减少CPU和内存的使用。
变量绑定:
- 应使用变量绑定实现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()
事务处理:
- 应按照业务需要使用事务,同时应保持事务简短,避免大事务。
- 正确使用SQL函数:
- 不同的数据库管理系统(例如MySQL、PostgreSQL、SQL Server等)可能会提供各自特有的函数,并且某些函数的名称和用法也可能存在差异。
- 在实际应用中,应参考所使用数据库的官方文档来获取最准确的信息。
- SQL操作符:
- 用于查询、操作和控制数据库数据的符号和命令。
- SQL语句执行顺序:
- 与书写顺序并不完全相同
- 书写SQL语句时,我们通常按照逻辑上的顺序来编写,如先指定要查询的字段(
SELECT
),再指定数据来源(FROM
),然后添加筛选条件(WHERE
)等。- 执行SQL语句时,数据库引擎会遵循一个固定的顺序来处理这些子句,以确保查询的准确性和效率。
- 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;
- *:乘法:
- 常用于计算字段值之间的乘积,如计算总价、折扣价等。
- 适用于除
datetime
和smalldatetime
数据类型之外的任何数值数据类型,包括整数、浮点数等- 如果运算数中包含非数值类型,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 |
+----------&