前言
MySQL语句多而杂,记录下来方便自己回顾和查询。官网安装MySQL client,我多安装了一个work bench,图形化界面,对于一些操作还是十分方便的。
配置好环境变量之后就可以开始运行了。
运行MySQL
直接打开命令行输入mysql -u root -p
,root是用户名(可更改),p表示之后输入密码,成功后就连接到MySQL服务器了:
以上是本地连接
,如果需要更详细的或者连接远程数据库,输入指令:
mysql –u用户名 [–h主机名或者IP地址,-P端口号] –p密码
,
- 该命令是在命令行窗口下执行,而不是MySQL的命令行;
- 输入-p后可以直接跟上密码,也可以按回车,会提示你输入密码,二者都是相同的效果;
- –p密码选项不一定是要在最后;
- –u、-h、-p后无空格。(端口号一般为3306,不过也可以更改)
连接远程数据库时
,如果无法连接,提示密码错误的话,需要更改host值为"%"
,我的做法是用MySQL WorkBench客户端:
创建数据库
如下脚本创建test数据库
,并且在test数据库下创建students表
和classes表
,以及必要的初始化数据。源自廖雪峰。
可以作为一个创建的范本:
-- 如果test数据库不存在,就创建test数据库:
CREATE DATABASE IF NOT EXISTS test;
-- 切换到test数据库
USE test;
-- 删除classes表和students表(如果存在):
DROP TABLE IF EXISTS classes;
DROP TABLE IF EXISTS students;
-- 创建classes表:
CREATE TABLE classes (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建students表:
CREATE TABLE students (
id BIGINT NOT NULL AUTO_INCREMENT,
class_id BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
gender VARCHAR(1) NOT NULL,
score INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入classes记录:
INSERT INTO classes(id, name) VALUES (1, '一班');
INSERT INTO classes(id, name) VALUES (2, '二班');
INSERT INTO classes(id, name) VALUES (3, '三班');
INSERT INTO classes(id, name) VALUES (4, '四班');
-- 插入students记录:
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'M', 90);
INSERT INTO students (id, class_id, name, gender, score) VALUES (2, 1, '小红', 'F', 95);
INSERT INTO students (id, class_id, name, gender, score) VALUES (3, 1, '小军', 'M', 88);
INSERT INTO students (id, class_id, name, gender, score) VALUES (4, 1, '小米', 'F', 73);
INSERT INTO students (id, class_id, name, gender, score) VALUES (5, 2, '小白', 'F', 81);
INSERT INTO students (id, class_id, name, gender, score) VALUES (6, 2, '小兵', 'M', 55);
INSERT INTO students (id, class_id, name, gender, score) VALUES (7, 2, '小林', 'M', 85);
INSERT INTO students (id, class_id, name, gender, score) VALUES (8, 3, '小新', 'F', 91);
INSERT INTO students (id, class_id, name, gender, score) VALUES (9, 3, '小王', 'M', 89);
INSERT INTO students (id, class_id, name, gender, score) VALUES (10, 3, '小丽', 'F', 85);
-- OK:
SELECT 'ok' as 'result:';
查询数据
基本查询
SELECT * FROM <表名>
select * from students;
*
表示“完整的整个二维表”/“所有列”,from
表示从哪个表查询。
SELECT语句
其实并不要求一定要有FROM
子句:
SELECT 100+200;//返回300
上述查询会直接计算出表达式的结果。虽然SELECT可以用作计算,但它并不是SQL的强项。但是,不带FROM子句的SELECT语句
有一个有用的用途,就是用来判断当前到数据库的连接是否有效
。许多检测工具会执行一条SELECT 1;
来测试数据库连接。
小结
使用SELECT查询的基本语句SELECT * FROM <表名>
可以查询一个表的所有行和所有列的数据。
SELECT查询的结果是一个二维表
。
条件查询
SELECT * FROM <表名> WHERE <条件表达式>
可以多个条件:
select * from students where score >= 80 and score <= 90;
常用条件表达式
条件 | 表达式举例 | 说明 |
---|---|---|
使用=判断相等 | score = 80 | 字符串需要用单引号括起来 |
使用>判断大于 | score > 80 | |
使用>=判断大于或相等 | score >= 80 | |
使用<判断小于 | score < 80 | |
使用<=判断小于或相等 | score <= 80 | |
使用<>判断不相等 /not | score <> 80/not score = 80 | |
使用LIKE判断相似 | name LIKE ‘ab%’/name LIKE ‘%bc%’ | %表示任意字符,例如’ab%‘将匹配’ab’,‘abc’,‘abcd’ |
加上括号
可以改变优先级。
投影查询
如果我们只希望返回某些列的数据
,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM ...
,让结果集仅包含指定列。这种操作称为投影查询。
SELECT id, score, name FROM students;
使用SELECT 列1, 列2, 列3 FROM …时,还可以给每一列起个别名
,这样,结果集的列名就可以与原表的列名不同。它的语法是SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...
。
例如,以下SELECT语句将列名score重命名为points,而id和name列名保持不变:
SELECT id, score points, name FROM students;
将结果排序显示
我们使用SELECT查询时,查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序
怎么办?可以加上ORDER BY
子句。例如按照成绩从低到高进行排序:
SELECT id, name, gender, score FROM students ORDER BY score;
默认是升序asc
,如果要反过来,按照成绩从高到底排序,我们可以加上DESC
表示“倒序”
:
SELECT id, name, gender, score FROM students ORDER BY score DESC;
分页查询
使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条。
要实现分页功能,实际上就是从结果集中显示第1-100条记录作为第1页,显示第101-200条记录作为第2页,以此类推。
因此,分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过LIMIT <M> OFFSET <N>
子句实现。
把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0
:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;
LIMIT
总是设定为pageSize
;
OFFSET
计算公式为pageSize * (pageIndex - 1)
。
聚合查询
COUNT(*)表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
通常,使用聚合查询时,我们应该给列名设置一个别名
,便于处理结果:
SELECT COUNT(*) num FROM students;
SELECT COUNT(id) num FROM students;//效果相同
函数 | 说明 |
---|---|
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值 |
MIN | 计算某一列的最小值 |
分组
group by
查询男女同学分别的平均分:
select gender, avg(score) average from students group by gender;
连接查询
多表查询时,通过外键将一个表和另外一个表相关联,并显示两张表的内容。
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
- 先确定
主表
,仍然使用FROM <表1>的语法; - 再确定
需要连接的表
,使用INNER JOIN
<表2>的语法; - 然后确定连接条件,使用
ON
<条件…>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接; - 可选:加上WHERE子句、ORDER BY等子句。
注意区分几个连接语句:
inner join
返回同时存在于两张表的行数据;left outer join
返回左表都存在的行;right outer join
返回右表都存在的行。
修改数据
关系数据库的基本操作就是增删改查
,即CRUD:Create、Retrieve、Update、Delete
。其中,对于查询,就是前面的select。