mySql 基础语法

news/2024/5/18 20:34:46

几个关键字

like


1%:是一个通配符,代表零个、一个或多个字符a. 查找,以特定字符串开头的值:SELECT * FROM 表名 WHERE 列名 LIKE '前缀%';b. 查找,以特定字符串结尾的值:SELECT * FROM 表名 WHERE 列名 LIKE '%后缀';c. 查找,包含特定字符串的值:SELECT * FROM 表名 WHERE 列名 LIKE '%子字符串%';2、_:是一个通配符,代表一个单一字符a. 查找特定模式的值(例如,长度为 5 的字符串,其中第二个字符是 'a'),如下:SELECT * FROM 表名 WHERE 列名 LIKE '_a___';

MAX

	使用MAX(),可以找到,指定列的最大值。SELECT MAX(列名) FROM 表名;

MIN

使用MIN(),可以找到,指定列的最小值。SELECT MIN(列名) FROM 表名;

AVG

使用AVG(),可以计算,指定列的平均值。SELECT AVG(列名) FROM 表名;

SUM

使用SUM(),可以计算,指定列的总和。SELECT SUM(列名) FROM 表名;



主外键

主键:用来,唯一标识表中每一行数据的列,或列组合主键的值,必须是唯一且非空的,用于确保表中的每一行都可以被唯一标识主键,通常用于索引表中的数据,加快数据检索的速度在SQL中,主键约束,可以通过'Primary Key'关键字定义外键:用来建立,表与表之间关系的一种约束,它定义了一个表中的列或者列组合,这些列的值,必须是另一个表的主键或唯一键的值。外键用于维护表与表之间的关联关系,确保数据的一致性和完整性在SQL中,外键约束可以通过'FOREIGN KEY'关键字来定义,通常与另一个表中的主键或者唯一键关联起来在数据库设计中,主键和外键的正确使用,可以帮助建立表与表之间的关联关系,确保数据的完整性和一致性
举例
首先,有一个'students'表,包含以下列:student_id:主键,用于唯一标识每个学生,student_name:学生的姓名,age:学生的年龄,此时,'student_id列'被定义为主键,确保每个学生都有一个唯一的学生ID。然后,有一个'courses'表,其中包含以下列:course_id:主键,用于唯一标识每门课程,course_name:课程的名称,student_id:外键,关联到'students表'的student_id列。此时,'student_id'列被定义为外键,确保每门课程关联到'students表'中存在的学生。解释一下:'students表'中的'student_id列'被定义为主键,并且,'courses表'中的'student_id'列被定义为外键,那么,这两个表中的'student_id'值是相关联的,换句话说,'courses表'中的'student_id值',必须是'students表中存在的student_id值',以确保每门课程都关联到一个已存在的学生。
举例
CREATE TABLE products (  product_id INT PRIMARY KEY,  * 主键,用于唯一标识每个产品product_name VARCHAR(100) NOT NULL, price DECIMAL(10, 2) NOT NULL,stock_quantity INT NOT NULL,category VARCHAR(50) NOT NULL,  supplier_id INT,FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id));product_id列,被定义为主键,用于唯一标识每个产品;product_name、price、stock_quantity、category列,分别表示产品的名称、价格、库存数量、类别信息;supplier_id列,用于存储供应商的ID;但是,表定义中,并没有直接指定该列为外键;但是,在最后一行,通过 FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id)这一语句,将'supplier_id列'设置为外键,并且,将其关联到suppliers表中的supplier_id列。CREATE TABLE suppliers (  supplier_id INT PRIMARY KEY,supplier_name VARCHAR(100) NOT NULL,contact_name VARCHAR(100) NOT NULL,contact_email VARCHAR(100),phone_number VARCHAR(20),address VARCHAR(255));supplier_id列,被定义为主键,用于唯一标识每个供应商;supplier_name、contact_name、contact_email、phone_number、address列,分别表示,供应商名称、联系人姓名、联系人邮箱、联系电话、地址;通过,在'products表'中定义'supplier_id列'为外键,并且,将其关联到'suppliers表'中的'supplier_id列',确保了,'产品表(products)中'的supplier_id值,必须是,'供应商表(suppliers)中'已存在的supplier_id值,从而建立了产品表和供应商表之间的关联关系;



创建一张表

CREATE TABLE `my_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`pwd` varchar(255) DEFAULT NULL,`plone` varchar(11) NOT NULL,`reg_time` datetime NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

插入

插入完整的行

当给`表的每一列`都提供一个值时,不需要在 INSERT INTO 语句中指定列名,但是,必须为每一列提供一个值,并且,这些值的顺序必须与表中的列顺序相对应语法:INSERT INTO 表名 VALUES (1,2,3, ...);如:INSERT INTO my_user VALUES (NULL, '张三', 'password123', '123456789012345678', NOW());因为,'id列是自动增长的',所以,使用 NULL 来让数据库自动为它分配一个值,NOW()函数,用于获取当前的日期和时间,并自动填充到reg_time列。

插入指定的列

`只为表中的某些列`提供值时,需要在 INSERT INTO 语句中明确的指定这些列名。INSERT INTO 表名 (1,2,3, ...) VALUES (1,2,3, ...);如:INSERT INTO my_user (name, pwd, plone, reg_time) VALUES ('李四', 'password456', '15866669995', '2023-01-01 10:00:00');这里,只为 name、pwd、plone、reg_time 列提供了值,而'id列由数据库自动填充'

插入多行


INSERT INTO 表名 (1,2,3, ...) VALUES
(1a,2a,3a, ...),  
(1b,2b,3b, ...),  
...;如:INSERT INTO my_user (name, pwd, plone, reg_time) VALUES('王五', 'pwd789', '15866669996', '2023-01-02 15:30:00'),('赵六', 'pwd111', '15866669997', '2023-01-03 09:15:00');

注意点:


1、如果,某列有默认值,或允许NULL值,你可以省略该列的值,但是,在插入多行数据时,每一行的列数和数据类型必须与指定的列匹配。2、对于自动增长的列(如 id),通常不需要在插入数据时提供值,数据库会自动为其分配一个唯一的值。3、使用 NOW()函数可以自动插入当前的日期和时间,如果,需要更精细的控制,也可以使用 CURDATE()(仅日期)或 CURTIME()(仅时间)函数。



修改

语法

UPDATE 表名  SET1 =1,2 =2, ...  WHERE 条件;WHERE:关键字,后面跟条件表达式,用于指定哪些记录应该被更新,如果省略 WHERE 子句,将更新表中的所有记录,这可是大bug

修改指定列的值

将用户名为"张三"的用户的密码修改为"newpassword123"UPDATE my_user SET pwd = 'newpassword123' WHERE name = '张三';

修改多个列的值

	将用户名为"张三"的用户的密码修改为"newpassword123",phone修改为"12345678910"UPDATE my_user SET pwd = 'updatedpassword', plone = '12345678910' WHERE name = '张三';

根据条件修改

将所有在2022年注册的用户的状态更新为"old_user"UPDATE my_user SET status = 'old_user' WHERE YEAR(reg_time) = 2022;

与limit字句配合

	MySQL允许在 UPDATE 语句中,使用 LIMIT 子句来限制更新的记录数。如:UPDATE my_user  SET pwd = 'new_password' WHERE name LIKE '张%' LIMIT 1;这条语句,将只更新 name 列以"张"开头的第一条记录的pwd列的值。

注意

1WHERE 子句是 UPDATE 语句中非常重要的部分,因为它决定了哪些记录会被更新,如果,没有正确地指定 WHERE 子句,或者,完全省略了它,那么,所有的记录都会被更新,这是一个严重的bug。2、始终确保 SET 子句中的列名和值,与数据库中的实际情况相匹配。



删除

语法

语法:DELETE FROM 表名 WHERE 条件;解释:DELETE FROM:表示要从哪个表中删除记录WHERE:这是一个可选的子句,用于指定哪些记录应该被删除,如果省略 WHERE 子句,将删除表中的所有记录举例:删除"my_user"表中,名为"张三"的用户记录,DELETE FROM my_user WHERE name = '张三';

删除所有记录但不删除表

语法:TRUNCATE TABLE 表名;举例:TRUNCATE TABLE my_user;这条语句,会删除"my_user表"中的所有记录,但表结构本身及其定义(如列、索引等)会保留下来。



查询

基本语法

语法:SELECT1,2, ...FROM 表名WHERE 条件;解释:SELECT:表示要执行查询操作;列1,2, ...:指定要从表中检索的列的名称;如果要选择所有列,可以使用 "*"通配符;FROM:关键字,后面跟要查询数据的表的名称;WHERE:关键字,后面跟条件表达式,用于过滤记录,WHERE 子句是可选的;举例:查询,所有用户的,姓名和电话号码:SELECT name, plone FROM my_user;如果,只想查询名为"张三"的用户的信息:SELECT * FROM my_user WHERE name = '张三';



order by

  ORDER BY:用于对查询结果进行排序。LIMIT:用于限制返回的记录数。查询,my_user表中,前10个用户的姓名,并按姓名升序排序SELECT nameFROM my_userORDER BY name ASCLIMIT 10;



GROUP BY having


GROUP BY:用于将结果集按一个或多个列进行分组。HAVING:与 GROUP BY 一起使用,用于过滤分组后的结果。解释:GROUP BYSQL 语言中的一个子句,用于,将'查询结果'按照一个或多个列进行分组,在每个分组内,你可以使用聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN() 等)来计算每个组的统计信息。having,用于,在分组之后过滤数据举例:返回staff表中,员工数量大于3的城市及其员工数量SELECT city, count(*) as numFROM staffGROUP BY cityHAVING num > 3;



join-内连接

1、内连接,会返回,两个表中满足连接条件的行。2、内连接,通过'在ON子句中指定连接条件',来将两个表中的行连接起来,只有当连接条件满足时,内连接才会返回匹配的行,如果某个表中的行,在另一个表中没有匹配的行,则这些行不会出现在内连接的结果中。语法:SELECT *FROM TableAINNER JOIN TableBON TableA.column_name = TableB.column_name; -- column_name:列名举例:Students表:| student_id | student_name | course_id ||------------|--------------|-----------|| 1          | Alice        | 101       || 2          | Bob          | 102       || 3          | Charlie      | 103       |Courses表:| course_id | course_name ||-----------|-------------|| 101       | Math        || 102       | Science     || 104       | History     |通过内连接,查询学生的姓名和所选课程的名称:select Students.student_name, Courses.course_namefrom Studentsinner join Courseson Students.course_id = Courses.course_id执行结果为:| student_name | course_name ||--------------|-------------|| Alice        | Math        || Bob          | Science     |



join-左连接

1、左连接(Left Join),它会返回,左表中的所有行,以及右表中满足连接条件的行,如果右表中没有匹配的行,那么结果集中将会包含 NULL 值。2、左连接,常用于,需要保留左表中所有行的情况,即使,右表中没有匹配的行也要显示左表中的数据语法:SELECT *FROM TableALEFT JOIN TableBON TableA.column_name = TableB.column_name;'LEFT JOIN'表示进行左连接操作,'ON TableA.column_name = TableB.column_name'表示连接条件,左连接,将返回左表TableA中的所有行,以及右表TableB中满足连接条件的行,如果,右表中没有匹配的行,对应的列将会显示 NULL 值。举例:Employees表:| employee_id | employee_name | department_id ||-------------|---------------|--------------|| 1           | Alice         | 101          || 2           | Bob           | 102          || 3           | Charlie       | 103          || 4           | David         | 102          |Departments表:| department_id | department_name ||---------------|-----------------|| 101           | HR              || 102           | Marketing       || 104           | Finance         |通过,左连接,查询员工的姓名和所属部门的名称:select Employees.employee_name, Departments.department_namefrom Employeesleft join Departmentson Employees.department_id = Departments.department_id执行结果为:| employee_name | department_name ||---------------|-----------------|| Alice         | HR              || Bob           | Marketing       || Charlie       | NULL            || David         | Marketing       |解释:Alice属于HR部门,Bob和David都属于Marketing部门,而,Charlie的部门在Departments表中找不到对应的记录,因此在左连接的结果中显示为NULL,左连接操作保留了Employees表中的所有员工信息,并将其与Departments表中匹配的部门信息进行连接。



join-右连接

1、右连接(Right Join),它会返回右表中的所有行,以及左表中满足连接条件的行,如果,左表中没有匹配的行,那么结果集中将会包含 NULL 值。2、右连接与左连接相反,右连接,用于需要保留右表中所有数据的情况,即使,左表中没有匹配的数据也要显示右表中的数据语法:SELECT *FROM TableARIGHT JOIN TableBON TableA.column_name = TableB.column_name;'RIGHT JOIN'表示进行右连接操作,'ON TableA.column_name = TableB.column_name'表示连接条件。举例:Students表:| student_id | student_name | course_id ||------------|--------------|-----------|| 1          | Alice        | 101       || 2          | Bob          | 102       || 3          | Charlie      | 103       || 4          | David        | NULL      |Courses表:| course_id | course_name ||-----------|-------------|| 101       | Math        || 102       | English     || 104       | History     |通过,右连接,查询学生的姓名和所选课程的名称:select Students.student_name, Courses.course_namefrom Studentsright join Courseson Students.course_id = Courses.course_id执行结果为:| student_name | course_name ||--------------|-------------|| Alice        | Math        || Bob          | English     || Charlie      | NULL        || NULL         | History     |解释:Alice选择了Math课程,Bob选择了English课程,Charlie的课程在Courses表中找不到对应的记录,而,David在Students表中的course_id为NULL,因此,在右连接的结果中显示为NULL,右连接操作保留了Courses表中的所有课程信息,并将其与Students表中匹配的学生信息进行连接



join-全连接

1、全连接(Full Join),它会返回,左表和右表中的所有行,同时,将满足连接条件的行,进行连接,如果,某个表中没有匹配的行,对应的列将会显示 NULL 值。2、全连接,会返回左表和右表中的所有数据,无论是否有匹配的行,如果,左表或右表中的某些行,在另一张表中没有匹配的行,那么对应的列将会显示 NULL 值。语法:SELECT *FROM TableAFULL JOIN TableBON TableA.column_name = TableB.column_name;'FULL JOIN'表示进行全连接操作,'ON TableA.column_name = TableB.column_name'表示连接条件,全连接,将返回左表TableA和右表TableB中的所有行,并将满足连接条件的行进行连接,如果,某个表中没有匹配的行,对应的列将会显示 NULL 值。举例:Employees表:| employee_id | employee_name | department_id ||-------------|---------------|---------------|| 1           | Alice         | 101           || 2           | Bob           | 102           || 3           | Charlie       | 103           || 4           | David         | NULL          |Departments表:| department_id | department_name ||---------------|-----------------|| 101           | HR              || 102           | Finance         || 104           | Marketing       |通过全连接,查询员工的姓名和所属部门的名称,即使有些员工的部门在Departments表中找不到对应的记录,或者有些部门没有员工。select Employees.employee_name, Departments.department_namefrom Employeesfull join Departmentson Employees.department_id = Departments.department_id执行结果:| employee_name | department_name ||---------------|-----------------|| Alice         | HR              || Bob           | Finance         || Charlie       | NULL            || David         | NULL            || NULL          | Marketing       |解释:Alice属于HR部门,Bob属于Finance部门,Charlie和David的部门,在Departments表中找不到对应的记录,而,Marketing部门没有员工,全连接操作,保留了Employees表 和 Departments表中的所有数据,并将其进行连接。



子查询

	1、子查询是指,在'SQL查询语句中嵌套另一个查询',内部查询的结果,作为外部查询的条件之一,子查询可以用于过滤数据、进行计算、比较值等各种操作。举例:Employees表:| employee_id | employee_name | department_id | salary ||-------------|---------------|---------------|--------|| 1           | Alice         | 101           | 60000  || 2           | Bob           | 102           | 70000  || 3           | Charlie       | 101           | 55000  || 4           | David         | 103           | 75000  |Departments表:| department_id | department_name ||---------------|-----------------|| 101           | Sales           || 102           | Marketing       || 103           | Finance         |查询每个部门的平均工资,并找出,工资高于部门平均工资的员工select Employees.salary, Employees.employee_name, Departments.department_namefrom Employees ejoin Departments don e.department_id = d.department_idwhere e.salary > (select AVG(salary)from Employees e2where e2.department_id = e.department_id)| salary | employee_name | department_name ||--------|---------------|-------------  --|| 60000  | Alice         | Sales           || 70000  | Bob           | Marketing       |

例子

学生表Students:| student_id | student_name | age       ||------------|--------------|-----------|| 1          | Alice        | 20        || 2          | Bob          | 21        || 3          | Charlie      | 19        |成绩表Scores:| student_id | subject      | score     ||------------|--------------|-----------|| 1          | Math         | 85        || 1          | Science      | 90        || 2          | Math         | 75        || 2          | Science      | 80        || 3          | Math         | 95        || 3          | Science      | 88        |找出每个学生的平均分,并列出高于平均分的学生及其成绩:select Students.student_id, Students.student_name, Scores.subject, Scores.scorefrom Students stujoin Scores son stu.student_id = s.student_idwhere Scores.score > (select AVG(score)from Scoreswhere student_id = s.student_id)

http://www.mrgr.cn/p/23177350

相关文章

Cisco Firepower FTD生成troubleshooting File

在出现故障时,需要采集信息 FMC上需要采集对应FTD设备的troubleshooting file system -->health -->monitor 选择相应的FTD,右侧点 generate Generate 4 右上角小红点点开 选择里面的task,就可以看到进度,差不多要10分钟以上 5 完成后…

锂电池SOH预测 | 基于CNN-GRU的锂电池SOH预测(matlab)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

ServiceNow 研究:通过RAG减少结构化输出中的幻觉

论文地址:https://arxiv.org/pdf/2404.08189 原文地址:rag-hallucination-structure-research-by-servicenow 在灾难性遗忘和模型漂移中,幻觉仍然是一个挑战。 2024 年 4 月 18 日 灾难性遗忘: 这是在序列学习或连续学习环境中出现…

机器学习理论基础—集成学习(1)

机器学习理论基础—集成学习 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务,有时也称为多分类系统等。 分类: 根据集成学习中的个体学习器的不同可以分为同质集成(集成的学习器相同例如全部是决策树)&#xff0c…

nginx变量自定义日志收集

内置变量 $remote_addr;存放了客户端的地址,注意是客户端的公网IP,也就是一家人访问一个网站,则会显示为路由器的公网IP。 $args;变量中存放了URL中的指令 [rootlocalhost conf.d]# cat pc.conf server {listen 80;se…

神经网络中多层卷积的作用

在神经网络中采用多层卷积的目的是为了逐步提取和组合图像的抽象特征,从而更有效地学习数据的表示并执行复杂的任务。不同层的卷积具有不同的作用,从较低层次的特征(例如边缘、纹理)到较高层次的抽象特征(例如物体部件…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名? 2、为什么使用域名? 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存? 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】

【基于MAX98357的Minimax(百度)长文本语音合成TTS 接入教程】 1. 前言2. 先决条件2.1 硬件准备2.2 软件准备2.3 接线 3. 核心代码3.1 驱动实现3.2 代码解析 4. 播放文本5. 结论 视频地址: SeeedXIAO ESP32S3 Sense【基于MAX98357的Minimax&am…

《Fundamentals of Power Electronics》——升压隔离型变换器、SEPIC隔离型变换器

以下是升压型隔离变换器的相关知识点: 升压型隔离变换器可以通过互换降压型隔离变换器的电源与负载的位置得到。升压型隔离变换器有许多种结构,此处简短的讨论两种情况。这些转换器主要使用在高压电源和低谐波整流器中。 图6.36所示是一种全桥型电路结…

【AI工具声音克隆】——OpenVoice一键部署modelScope一键使用

一、声音/音色克隆简介 声音或音色克隆的原理实现步骤主要基于深度学习技术,特别是语音合成和生成模型。以下是声音/音色克隆的大致实现步骤: 数据收集: 收集语音数据,作为模型的训练样本。数据应尽可能多样化,包括不…

论文笔记:(Security 22) 关于“二进制函数相似性检测”的调研

个人博客链接 注:部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研(个人阅读笔记) 论文:《How Machine Learning Is Solving the Binary Function Similarity Problem》(Usenix Securi…

Vitis HLS 学习笔记--IDE软件高效操作指引

目录 1. 简介 2. 实用软件操作 2.1 C/RTL Cosimulation 选项 2.2 Do not show this dialog again 2.3 New Solution 2.4 对比 Solution 2.5 以命令行方式运行(windows) 2.6 文本缩放快捷键 2.7 查看和修改快捷键 2.8 将Vitis HLS RTL 导入 Viv…

iBarcoder for Mac:一站式条形码生成软件

在数字化时代,条形码的应用越来越广泛。iBarcoder for Mac作为一款专业的条形码生成软件,为用户提供了一站式的解决方案。无论是零售、出版还是物流等行业,iBarcoder都能轻松应对,助力用户实现高效管理。 iBarcoder for Mac v3.14…

IDEA 多模块项目报错 Cannot Save Settings 问题

IDEA 多模块项目报错 Cannot Save Settings 问题 Cannot Save Settings: Module "spring_cloud_sentinel_demo" must not contain source root "D:\java_test\Intesij_idea\spring_cloud_sentinel_demo\order_service_rest\src\main\resources"…

深入浅出DBus-C++:Linux下的高效IPC通信

目录标题 1. DBus简介2. DBus-C的优势3. 安装DBus-C4. 使用DBus-C初始化和连接到DBus定义接口和方法发送和接收信号 5. dbus-cpp 0.9.0 的安装6. 创建一个 DBus 服务7. 客户端的实现8. 编译和运行你的应用9. 瑞芯微(Rockchip)的 Linux 系统通常会自带 db…

如何使用提示测试为LLMs构建单元测试?

原文地址:how-to-build-unit-tests-for-llms-using-prompt-testing 确保您的人工智能交付:快速测试完美生成应用程序的基本指南 2024 年 4 月 26 日 如果你曾经编写过软件,你就会知道测试是开发过程中必不可少的一部分。特别是单元测试&#…

WebAssembly 入门教程 c++、python编译wasm

WebAssembly 入门 了解 wasm 使用场景,复杂对象传递和经验法则。 简介 WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行。它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并…

Linux网络-ssh远程连接协议

SSH基础 1.ssh协议概述SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能; SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令; SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输…

Java中接口的默认方法

为什么要使用默认方法 当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦 写另一个接口 让需要的实…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发? 敏捷开发是一种软件开发方法论,旨在通过迭代、自组织的团队和持续反馈,快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型,敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…