当前位置: 首页 > news >正文

mysql表操作与查询

01.表的操作

1.1表操作概览

在这里插入图片描述


1.2创建表

语法: 语句以;结尾。

#  []表示里面内容可选,使用时不带[]本身
CREATE TABLE [IF NOT EXISTS] table_name (column1 datatype [constraints],column2 datatype [constraints],...[table_constraints]
) [ENGINE=storage_engine] [DEFAULT CHARSET=charset];
  • 数据类型:

    • 数值类型:INT、BIGINT、FLOAT、DOUBLE、DECIMAL(10,2)
    • 字符串类型:VARCHAR(255)、TEXT、CHAR(10)
    • 日期时间:DATE、TIME、DATETIME、TIMESTAMP
    • 其他类型
      • BOOLEAN
      • ENUM (’ opt1’,’ opt2’)只能存储定义时指定的值之一,单选
      • SET (’ opt1’,’ opt2’,’ opt3’),多选
  • 列约束:

    • NOT NULL`:该字段不能为空
    • UNIQUE:该字段值必须唯一
    • DEFAULT:设置默认值
    • AUTO_INCREMENT:自增主键(通常用于 ID 字段)
  • 表约束: 主外键

    PRIMARY KEY (1, ...),
    FOREIGN KEY (字段名) REFERENCES 主表(),
    

    创建主表: 主键时表的身份证,唯一,可由多个字段组成。

    create table myclass(id int primary key,name varchar(30)not null comment'班级名'
    );
    

    创建从表: 外键是与其他表的关系纽带。

    create table stu(id int primary key,name varchar(30) not nu1l comment'学生名',class_id int ,foreign key(class_id) references myclass(id));   #插入数据过程省略
    

    在这里插入图片描述


创建表代码示例:

-- 1:创建数据库
CREATE DATABASE sql_stu;
-- 2:使用数据库
USE sql_stu;
-- 3:创建表
CREATE TABLE IF NOT EXISTS table_stu (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,age INT DEFAULT 18,create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 使用 DESCRIBE 表名 或 SHOW CREATE TABLE 表名 查看表
DESCRIBE table_name;-- 或简写为:DESC table_name;

在这里插入图片描述


1.3修改表

语法:

ALTER TABLE 表名操作1,...;

修改表的操作:

ALTER TABLE employees 
#添加列
ADD COLUMN 列名 数据类型 AFTER 某个列;
#修改列数据类型与重命名
MODIFY COLUMN 列名 数据类型;
CHANGE COLUMN 老列名 新列名 数据类型;
#删除列
DROP COLUMN 列名;
#添加约束
ADD PRIMARY KEY (emp_id);
---
外键?
#删约束
DROP FOREIGN KEY 外键名;
DROP PRIMARY KEY;

1.4复制表

#仅复制结构
CREATE TABLE 新表 LIKE 源表;
#复制结构+数据
CREATE TABLE 新表 AS 
SELECT * FROM 源表;
#选择复制结构+数据
CREATE TABLE 新表 AS 
SELECT1,列2,列3 
FROM 源表
WHERE 条件;

-- 创建表
CREATE TABLE stuinfo (stuid INT PRIMARY KEY,stuname VARCHAR(20) UNIQUE NOT NULL,stugender CHAR(1) DEFAULT '男',email VARCHAR(20) NOT NULL,age INT,majorid INT,CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES major(id)
);-- 修改表结构
ALTER TABLE stuinfo RENAME TO stuinfo1;  -- 重命名表
ALTER TABLE stuinfo1 ADD COLUMN borndate TIMESTAMP NOT NULL;  -- 添加列
ALTER TABLE stuinfo1 CHANGE COLUMN borndate birthday DATETIME;  -- 修改列名
ALTER TABLE stuinfo1 MODIFY COLUMN birthday DATE;  -- 修改数据类型
ALTER TABLE stuinfo1 DROP COLUMN age;  -- 删除列-- 复制表
CREATE TABLE newTable LIKE stuinfo;  -- 仅复制结构
CREATE TABLE emp_copy SELECT * FROM employees;  -- 复制结构和数据

02.基本查询操作

基础结构:

SELECT [DISTINCT]1,2, ...  --选择需要显示的列
FROM 表名    				     --首先确定数据来源
[WHERE 条件]     	 		      --对原始数据进行筛选
[GROUP BY 分组列]   			 --对筛选后的数据分组
[HAVING 分组条件]   		    --对分组后的数据进行筛选
[ORDER BY 排序列 [ASC|DESC]]     --对结果进行排序
[LIMIT [偏移量,] 行数];          --限制返回结果数量

执行顺序FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT

2.1 SELECT选择列

-- 查询所有列
SELECT * FROM users;-- 查询指定列
SELECT id, ... FROM users;-- 列别名
SELECT id AS user_id, username AS name FROM users;--(AS可省略)-- 去重查询(DISTINCT)
SELECT DISTINCT country FROM customers;
-- 连接字段 CONCAT
SELECT CONCAT(last_name, first_name) AS 姓名 FROM employees;

2.2 FROM指定表

-- 单表查询
SELECT * FROM products;-- 多表连接查询(内连接)
SELECT * 
FROM orders
INNER JOIN users ON orders.user_id = users.id;
SELECT IFNULL(commission_pct, 0.00) AS 奖金, commission_pct
FROM employees;

2.3 WHERE条件过滤

–> 在分组前过滤行

2.3.1 基本条件表达式
/* 语法结构:SELECT 查询列表FROM 表名WHERE 筛选条件   */-- 比较运算符:> < = != <> >= <=
SELECT * FROM employees WHERE salary > 12000;-- 逻辑运算符:AND OR NOT
SELECT last_name, salary
FROM employees
WHERE salary >= 10000 AND salary <= 20000;-- 范围查询 BETWEEN AND,或者使用 salary > 10000 AND salary < 20000
SELECT * 
FROM employees
WHERE salary BETWEEN 10000 AND 20000;

2.3.2 特殊条件查询
-- IN 查询,IN ()任意一个返回TRUE(1)
SELECT last_name, job_id
FROM employees
WHERE job_id IN ('AD_PRES', 'IT_PROG', 'PU_CLERK');-- 是 NULL 值判断
SELECT last_name, commission_pct
FROM employees
WHERE commission_pct IS NULL;  -- IS NOT NULL-- 安全等于 <=> (可判断NULL和普通值)
SELECT last_name, commission_pct
FROM employees
WHERE commission_pct <=> NULL;

2.3.3 模糊查询 LIKE

使用% 匹配任意个字符, _ 匹配单个字符,使用 \ 转义。

-- 基本通配符:% 匹配任意个字符, _ 匹配单个字符
SELECT last_name
FROM employees
WHERE last_name LIKE '_a_%' ESCAPE 'a';  -- 第二个字符为_-- 使用 \ 转义
...同上
WHERE last_name LIKE '_\_%';  -- 使用 \ 转义

2.4 GROUP BY分组

-- 统计每个部门的员工数
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;-- 分组后过滤(HAVING)
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
HAVING avg_price > 200;  -- 只返回平均价格>200的分组

2.5 ORDER BY排序

-- 基本排序
SELECT * FROM employees ORDER BY salary DESC;  --ASC 升序(默认), DESC (drop降序)-- 多字段排序
SELECT *
FROM employees
ORDER BY salary DESC, employee_id ASC;-- 按表达式和函数结果多字段排序
SELECT LENGTH(last_name)  字符长度,  salary * 12 * (1 + IFNULL(commission_pct, 0))  年薪
FROM employees
ORDER BY 年薪 DESC, 字符长度 DESC;  -- 按年薪和字符长度排序

2.6 HAVING 分组后过滤

–> 分组后过滤组

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 6000;

2.7 LIMIT分页

-- 提取第2页,每页10条           偏移量 每页行数SELECT  *  FROM  products LIMIT 10  ,  10;  -- 等价于 OFFSET 10 LIMIT 10-- 带排序的分页
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 20, 10;  -- 第3页

03. 函数

3.1 聚合函数

函数描述
SUM(expr)求和
AVG(expr)平均值
MAX(expr)最大值
MIN(expr)最小值
COUNT(expr)计数

3.2 日期函数

SQL 标准函数

在这里插入图片描述


3.3 字符串函数

语法功能描述
CHARSET(str)返回字符串的字符集
CONCAT(str1, str2, ...)连接多个字符串
INSTR(str, substr)返回子串在字符串中的位置(从1开始),未找到返回0
UCASE(str)UPPER(str)串转换为大写
LCASE(str)LOWER(str)串转换为小写
LEFT(str, length)从字符串左侧截取指定长度的子串
LENGTH(str)返回字符串的字节长度(非字符数)
REPLACE(str, from_str, to_str)替换字符串中的指定子串
STRCMP(str1, str2)逐字符比较两字符串大小(返回-1,0,1
SUBSTRING(str, pos, len)从指定位置截取子串(pos1开始)
TRIM(str) LTRIM(str) RTRIM(str)去除字符串前或后面空格

3.4 数学函数

在这里插入图片描述


04.复合查询

笛卡尔积: 将两个表穷举的结果

在这里插入图片描述

4.1 多表查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。

在这里插入图片描述

通过将两个表直接笛卡尔积组成一个新表,但是引入了许多无关数据,这时对其进行去除不正确数据后再筛选即可得到

显示部门号为10的部门名,员工名和工资

select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno andDEPT.deptno = 10;

4.2 自连接

自连接是指在同一张表连接查询

在这里插入图片描述


4.3 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

4.3.1 单行子查询

案例: 查询和SMITH的部门和岗位完全相同的所有雇员。下面这个案例返回了多行,视情况而定

在这里插入图片描述


4.3.2 多行子查询
  • IN/NOT IN 检查值是否在于子查询结果中
  • ANY 与子查询返回的任一值比较
  • ALL 与子查询返回的所有值比较
  • EXISTS 检查存在性

示例:

SELECT *
FROM products
WHERE (category, price) IN (SELECT category, price FROM products WHERE category = 'Electronics');

4.3.3 FROM子句子查询

-- from子查询 (返回临时表)
SELECT dep_ag.department_id, dep_ag.ag, j.grade_level
FROM (SELECT AVG(salary) ag, department_idFROM employeesGROUP BY department_id
) AS dep_ag
INNER JOIN job_grades j ON dep_ag.ag BETWEEN j.lowest_sal AND j.highest_sal;

4.3.4 合并查询

联合查询 :

  • UNION :并集<-- 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
  • UNION ALL :该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
-- 基本联合
SELECT employee_id FROM employees WHERE salary > 15000
UNION
SELECT employee_id FROM employees WHERE commission_pct > 0.2;-- UNION ALL (保留重复记录)
SELECT department_id FROM employees
UNION ALL
SELECT department_id FROM departments;

05. 内外连接

5.1内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选。

在这里插入图片描述

语法:

select 字段 from1 inner join2 on 连接条件 and 其他条件;

示例:

--用前面的写法
select ename,dname from EMP, DEPT where EMp.deptno=DEPT.deptno andename='SMITH'
--用标准的内连接写法
select ename, dname from EMp inner join DEPT on EMP.deptno=DEPT.deptno andename='SMITH':

5.2 外连接

保留左侧表或者右侧表数据

在这里插入图片描述

多表内连接耶可以


http://www.lryc.cn/news/576023.html

相关文章:

  • RJ45 以太网与 5G 的原理解析及区别
  • 成都芯谷金融中心·文化科技产业园:绘就区域腾飞新篇章
  • 如何在安卓设备上发送长视频:6 种可行的解决方案
  • day49-硬件学习之I2C(续)
  • 数据结构之顺序表(C语言版本)
  • MongoDB 和 Redis的区别
  • Tomcat Maven 插件
  • iOS 远程调试与离线排查实战:构建非现场问题复现机制
  • K8s port、targetPort和nodePort区别
  • GitHub Actions与AWS OIDC实现安全的ECR/ECS自动化部署
  • TCP/IP协议简要概述
  • 国产鸿蒙系统开放应用侧载,能威胁到Windows地位吗?
  • 工作台-01.需求分析与设计
  • qq邮箱 新版 怎么去掉个性签名?
  • Java 大视界 -- Java 大数据在智能教育学习社群知识共享与协同学习促进中的应用(326)
  • 参考nlohmann json设计Cereal宏 一行声明序列化函数
  • vscode把less文件生成css文件配置,设置生成自定义文件名称和路径
  • ​​Git提交代码Commit消息企业级规范
  • 自动驾驶nuPlan数据集-入门使用和可视化操作
  • 【NodeJs】【npm】npm安装electron报错
  • 智能体记忆原理-prompt设计
  • [Ethernet in CANoe]1--SOME/IP arxml文件格式的区别
  • 基于Spring Cloud Alibaba构建微服务架构的实践探索
  • Ubuntu 部署 ResilioSync3.0 指南
  • IBM RAG 挑战赛 挑战赛 冠军 RAG_Challenge 系统性理解
  • 微调大语言模型(生成任务),怎么评估它到底“变好”了?
  • dp进阶,树形背包(dfs+01)
  • 自动对焦技术助力TGV检测 半导体检测精度大突破
  • 本地部署 WordPress 博客完整指南(基于 XAMPP)
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 侧边栏导航(Offcanvas) 语法知识点及案例(26)