MySQL 笔记(一)
内容源自书籍:MySQL必知必会
第一章 了解SQL
1. 什么是数据库
数据库是一个以某种有组织的方式存储数据的集合(通常是一个文件或一组文件)
注意:我们并不直接访问数据库,而是通过DBMS操纵数据库!
2. 表和模式
表:某种特定类型数据的结构化清单,同一数据库中的表名不能相同
模式: 关于数据库和表的布局及特性的信息 performance_schema
3. 主键规则
- 任意两行都不具有相同的主键值
- 每个行都必须有一个主键值(该值不能为NULL)
主键通常定义在一个列上,但这不是必须的,也可以一起使用多个列作为主键。此外,最好不在主键列中使用可能会更改的值!(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,就要更改这个主键)
第二章 MySQL简介
DBMS可以分为两类:一类是基于共享文件系统的DBMS,另一类为基于客户机-服务器的DBMS.
MySQL, Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据库。例如:
- 服务器软件是MySQL DBMS
- 客户机可以是MySQL提供的工具(命令行)、脚本语言、web应用开发语言、程序设计语言等
MySQL命令行:
- 命令用;或\g结束
- 输入help或\h获得帮助
- 输入quit或exit退出命令行
第三章 了解数据库和表
1. 连接数据库(登录)
mysql -u root -p
2. 选择数据库
在最初连接到MySQL的时候,没有数据库供我们使用,需要使用use关键字,选择一个数据库,这时才能使用数据库。
use database;
3. 了解数据库和表
显示MySQL内的数据库
show databases;
+--------------------+
| Database |
+--------------------+
| benchbase |
| information_schema |
| mysql |
| performance_schema |
| sys |
| tpcc |
+--------------------+
6 rows in set (0.07 sec)
显示某个数据库中的表
show tables;
显示表的列(两者等价),describe等于show columns from
show columns from customers;
describe customers;
第4章 检索数据
// 检索单个列,返回数据的顺序没有意义,是未排序的
SELECT prod_name FROM products;
// 检索多列数据
SELECT prod_name, prod_id FROM products;
// 检索所有列,使用通配符(*)
SELECT * FROM products
// 检索不同的行,用DISTINCT关键字去重
SELECT DISTINCT prod_id FROM products;
// 限制返回结果的行数,用LIMIT,行号从0计数
SELECT prod_name FROM products LIMIT 5; // 返回值不多于5行
SELECT prod_name FROM products LIMIT 5, 5; // 从行号5开始的5行
第5章 排序检索数据
子句:SQL语句由子句构成,有些子句是必须的,有些是可选的。子句的例子有SELECT语句的FROM子句
// 按单个列排序,指定排序的列未必是 被选择的列
SELECT prod_name FROM products ORDER BY prod_id;
// 按多个列排序,首先按price排序,若price相等,按照name
SELECT prod_id, prod_name FROM products ORDER BY prod_price, prod_name;
// 降序排列,指定DESC关键字,默认是升序
SELECT prod_name FROM products ORDER BY prod_id DESC;
SELECT prod_id, prod_name
FROM products
ORDER BY prod_price DESC, prod_name; // DESC只对price起作用,name仍然是升序
第6章 数据过滤
利用 SELECT 语句的 WHERE 子句指定搜索条件(ORDER BY语句要在WHERE后面)
WHERE子句的操作符有:=,!=,<,<=,>,>=,between x and y
SELECT prod_name, prod_price
FROM products
WHERE prod_name = 'fuses'; // MySQL在执行匹配的时候默认不区分大小写,所以fuses和Fuses也能匹配
// 串匹配需要用引号
// 不由供应商1003制造的所有产品 != 和 <> 是一样的
SELECT vend_id, prod_name
FROM products
WHERE vend_id <> 1003;
// 空值检查
SELECT prod_name
FROM products
WHERE prod_price IS NULL; // 空不是0,也不是空串,也不是空格
进阶技巧
为了更强的过滤控制,MySQL允许给出多个WHERE子句,这些子句以两种方式使用:以AND子句的方式或OR子句的方式
// AND 操作符
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;
// OR 操作符
SELECT prod_price, prod_name
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
// AND 的优先级比 OR 更高,SQL在处理OR操作符前,优先处理AND操作符
SELECT prod_name, prod_price
FROM product
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price <= 10;
对上述操作符优先级的问题,还有另外一种解决办法
// IN 操作符
SELECT prod_name, prod_price
FROM product
WHERE vend_id IN (1002, 1003) // 1002和1003都在,不是左闭右开
ORDER BY prod_name;
IN操作符的优点:
- IN操作符的语法更清楚且更直观
- IN操作符一般比OR操作符清单执行更快
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
NOT 操作符: MySQL支持NOT操作符对 IN, BETWEEN 和 EXISTS 取反
SELECT prod_name, prod_price
FROM product
WHERE vend_id NOT IN (1002, 1003)
ORDER BY prod_name;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)