MySQL基础笔记(1) - 数据库基础概念&基础查询,条件查询
数据库基础概念&基础查询,条件查询
前言
- 本文为MySQL基础入门相关笔记,同时参考了尚硅谷的BV1xW411u7ax网课和《MySQL必知必会》两者,主要用于个人记录与分享,如有错误欢迎留言指出
- 本文所使用的大部分表都来自于《MySQL必知必会》官网上提供的脚本,可以前往http://www.forta.com/books/0672327120/下载(在网页的最底下)
1. 数据库基础概念
-
数据库相关简写
- DB:数据库,保存一组有组织的数据的容器
- DBMS:数据库管理系统,又称为数据库软件,用于管理DB中的数据
- SQL:结构化查询语言,用于和DBMS通信的语言
-
数据库相关术语
-
表(table)是某种特定类型数据的结构化清单。存储数据时,先将数据放到表中,表再放到库中。
-
一个数据库中可以有多个表,每个表都有一个名字用来标识自己。表名具有唯一性
-
表具有一些特性,这些特性定义了数据在表中如何存储。描述表的这组信息就是模式(schema),模式可以用来描述数据库中特定的表以及整个数据库。
-
表由列(column)组成,列又称为字段。所有表都是由一个或多个列组成的,每一列类似于Java中的属性
-
行(row)是表中的一个记录。表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
-
主键(primary key)是一列(或一组列),其值能唯一区分表中每个行。
表中的任何列都可以作为主键,只要满足以下两个条件:1.任意两行都不具有相同的主键值 2.每个行都必须具有一个主键值(主键列不允许为NULL值)
主键也不一定是单独的一个列,也可以使用多个列组合作为主键,只要所有列值的组合都是唯一的。
主键的设置准则:
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值
-
-
MySQL常见指令
- 查看当前所有数据库:show databases;
- 打开指定的库:use [库名]
- 查看当前库的所有表:show tables;
- 查看其它库的所有表:show tables from [库名];
- 创建表:create table 表名([列名] [列类型] , [...])
- 查看表结构:desc 表名
-
MySQL语法规范
-
不区分大小写,但建议关键字大写,表名,列名小写
-
每条指令最好用分号结尾
-
注释:
# 单行注释 -- 单行注释 /* 多行注释 */
-
2. 查询操作
2.1 基础查询
语法:select [查询列表] from [表名]
查询列表的结果可以是:表中的字段,常量值,表达式,函数;查询的结果是一个虚拟的表格
#1.查询表中的单个字段
SELECT prod_name
FROM products;
#2.查询表中的多个字段
SELECT prod_id,prod_name,prod_price
FROM products;
#如果字段名称与关键词重复,可以使用''指明该词语是字段;如,'name'
#3.查询表中的所有字段
SELECT *
FROM products;
#使用通配符只能按照默认的顺序显示所有表格
#4.别名
#别名是一个字段或值的替换名;如果要查询的字段有重名的情况,可以使用别名区分开来
SELECT CONCAT(vend_name,'(',vend_country,')') AS vend_title
FROM vendors
ORDER BY vend_name;
#5.去重
#可以让输出的列去掉内部重复的元素
SELECT DISTINCT vend_id
FROM products;
#无法同时对两个不同的列去重,如果这样做会默认把所有的列显示出来
#9.连接
#查询生产商名称和国籍,并连接成一个字段
SELECT CONCAT(vend_name,'(',vend_country,')')
FROM vendors
ORDER BY vend_name;
/*与Java不同,mysql中的'+'号只有运算符功能:
select 100+90; 两个操作数都为数值型,则做加法运算
select '123'+90; 其中一方为字符型,试图将字符型转换为数值型
select 'john'+90; 如果转换失败,则将字符型数值转换为0
select null+10; 只要其中一方为null,则结果肯定为null
*/
2.2 条件查询
语法:select [查询列表] from [表名] where [筛选条件]
条件查询分为三种:
#1.按条件表达式筛选
#条件运算符: > < = != >= <= <>(等同于!=)
#查询所有价格小于等于10的产品
SELECT prod_name,prod_price
FROM products
WHERE prod_price <= 10;
#注意mysql中相等是'='而不是'=='
#2.按逻辑表达式筛选
#逻辑运算符: &&(and) ||(or) !(not)
#查询价格大于等于10且由1002或1003号生产商制造的产品
SELECT prod_name,prod_price
FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
#AND的优先级比OR高,建议在where中添加复数or/and时使用括号
#3.模糊查询
#3.1.like
#a.查询以s起头e结尾的所有产品
SELECT prod_name
FROM products
WHERE prod_name LIKE 's%e';
#‘%’为通配符,表示任意多个字符(含0)出现任意多次
#b.查询前面有一个任意字符的,包含" ton anvil"的所有产品
SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
#"_"也为通配符,表示任意单个字符
#如果要查询包含'_'的名称,可以在'_'前加/,这样'_'就不会被识别为通配符,而是作为一个普通的字符
#不要过度使用通配符,会造成性能下降,优先使用其它操作符;如果真的要使用通配符,不要把它们用在搜索模式的开始处,否则效率会非常低
#3.2.between
#查询价格在[5,10]之间的商品
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
#between和and可以被比较运算符替代;between包含两个临界值,且临界值不可调换顺序
#3.3.in
#查询生产商id为1002或1003的产品
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
#in可以被'='和逻辑运算符替代;in列表的值类型必须一致或兼容,不支持通配符
/*
除了in以外还有其它类似的比较符:
1.IN/NOT IN:等于列表中的任意一个
2.ANY|SOME:和子查询返回的某一个值比较(等价于MIN/MAX)
3.ALL:和子查询返回的所有值比较(等价于MIN/MAX)
*/
#3.4.is null
#查询没有邮箱的用户
SELECT cust_id
FROM customers
WHERE cust_email IS NULL;
#=或<>不能用于判断null值,但是is null或is not null可以
#安全等于(<=>)既可以判断数值,又可以判断null值
2.3 分页查询
定义:当要显示的数据一页显示不全时,需要分页提交sql请求
语法:select [查询列表] from [表] limit [start] offset [size];
([start]表示要显示条目的起始索引(起始索引从0开始),[size]要显示的条目个数)
#显示默认排序下前五个产品
SELECT DISTINCT prod_name
FROM products
LIMIT 5;
#显示从行5开始的后5个产品
SELECT DISTINCT prod_name
FROM products
LIMIT 5 OFFSET 5;
#检索是从行0开始的,而非行1
#公式:offset=(page-1)*size;所以limit最终写法就是limit [(page-1)*size] offset [size]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)