操作数据库
连接数据库
mysql -h主机名 -u用户名 -p密码 或 mysql -u用户名 -p密码
退出数据库
exit quit
查看已经创建的数据库
SHOW DATABASES;
注意
- mysql不严格区分大小写
- 分号作为结束符,必须写
查看数据库版本
select version();
创建数据库
CREATE DATABASE 数据库名;
CREATE DATABASE 数据库名 charset=utf8;
注意
- charset:指定编码为utf8
查看创建数据库
SHOW CREATE DATABASE 数据库名;

使用数据库
USE 数据库名;
查看当前使用的数据库
SELECT DATABASE();

删除数据库
DROP DATABASE 数据库名;

注意
- SQL语句不区分大小写
- 每行必须以英文状态下分号作为结束
- 当数据库名称有特殊字符时,使用
`包括。如:Logic_edu`
操作数据表
查看当前数据库中所有表
SHOW TABLES;
创建表
CREATE TABLE 数据表名(字段 类型 约束[, 字段 类型 约束])
查看表的创建语句
SHOW CREATE TABLE 数据表名;
查看表描述信息
DESC 数据表名;
注意:
- NULL:表示该列是否可以存储NULL值
- Key:表示该列是否已经编制索引
- Default:表示该列是否有默认值
- Extira:表示获取到的与给定列相关的附加信息
修改表名
ALTER TABLE 旧表名 RENAME [TO] 新表名;
修改数据表
添加表字段
ALTER TABLE 数据表名 ADD 字段 类型;
修改表字段
ALTER TABLE 数据表名 MODIFY 字段 类型; —添加一个默认值 ALTER TABLE 数据表名 CHANGE 原字段名 新字段名 类型及约束;
— 将字段重命名
删除表字段
ALTER TABLE 数据表名 DROP 字段;
修改字段的排列位置
ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST|AFTER 字段名2;
“字段名1”指的是修改位置的字段,“数据类型”指的是字段1的数据类型,“FIRST”为可选参数,指的是将“字段名1”修改为表的第一个字段,“AFTER字段名2”是将字段1插入到字段2的后面。
删除数据表
DROP TABLE 表名;
约束
主键约束
单字段主键约束: 字段名 数据类型 PRIMARY KEY 多字段主键约束: PRIMARY KEY (字段名1,字段名2,… ,字段名n)
非空约束
字段名 数据类型 NOT NULL;
唯一约束
字段名 数据类型 UNIQUE;
默认约束
字段名 数据类型 DEFAULT 默认值;
自增约束
字段名 数据类型 AUTO_INCREMENT;
外键约束
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES <主表名> 主键列1 [,主键列2,…]**
演示
修改数据表 ALTER TABLE students RENAME TO students1;
查询表的结构 DESC students1;
添加字段名 ALTER TABLE students1 ADD zhousui INT(10);
修改字段名 ALTER TABLE students1 CHANGE zhousui zage INT(10);
删除字段 ALTER TABLE students1 DROP zage;
修改字段的排列位置 ALTER TABLE students1 MODIFY age INT(11) FIRST;
ALTER TABLE students1 MODIFY age INT(11) AFTER gender;
删除数据表 DROP TABLE mytable1;
单字段主键约束 CREATE TABLE example01 ( id INT PRIMARY KEY, name VARCHAR (20), grade FLOAT );
多字段主键约束 CREATE TABLE example02 ( stu_id INT, course_id INT, grade FLOAT, PRIMARY KEY (stu_id,course_id) );
非空约束 CREATE TABLE example04 ( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT );
唯一约束 CREATE TABLE example05 ( id INT PRIMARY KEY, stu_id INT UNIQUE, name VARCHAR(20) NOT NULL );
默认约束 CREATE TABLE example06 ( id INT PRIMARY KEY AUTO_INCREMENT, stu_id INT UNIQUE, grade FLOAT DEFAULT 0 );
自增约束 CREATE TABLE example07 ( id INT PRIMARY KEY AUTO_INCREMENT, stu_id INT UNIQUE, grade FLOAT );
操作数据
添加数据
插入数据(不指定字段名)
INSERT INTO 数据表名 VALUES(值1,值2,值3…);
插入数据(指定字段名)
INSERT INTO 表名 (字段1, 字段2,…) VALUES (值1,值2,….);
注:每个字段和值的顺序要一一对应
插入数据(同时插入多条数据)
INSERT INTO 表名 (字段1, 字段2,…) VALUES (值1,值2,…),(值1,值2,…);
修改数据
UPDATE 表名 SET 字段1=新值,字段2=新值 [WHERE 条件];
删除数据
DELETE FROM 表名 [WHERE 条件];
单表查询
简单查询
SELECT语句
SELECT [DISTINCT] * |字段名1,字段名2,… FROM 表名 [WHERE 条件表达式1] [GROUP BY 字段名 [HAVING 条件表达式2]] [GROUP BY 字段名 [ASC | DESC]] [LIMIT [OFFSET] 记录数]


查询指定字段
SELECT 字段1,字段2,… FROM 数据表名;
查询所有字段
SELECT * FROM 数据表名;
按条件查询
带关系运算符的查询
SELECT 字段名1,字段名2,… FROM 表名 WHERE 条件表达式
比较运算符
逻辑运算符
带 IN 关键字的查询
SELECT * | 字段名1,字段名2,… FROM 表名 WHERE 字段名 [NOT] IN (元素1,元素2,…);
带 BETWEEN AND 关键字的查询
SELECT * | {字段名1,字段名2,…} FROM 表名 WHERE 字段名 [NOT] BETWEEN 值1 AND 值2;
空值查询
SELECT * | 字段名1,字段名2,… FROM 表名 WHERE 字段名 IS [NOT] NULL;
带DISTINCT关键字的查询(过滤去重)
SELECT DISTINCT 字段名 FROM 表名;
带LIKE关键字的查询(模糊查询)
SELECT * | {字段名1,字段名2,…} FROM 表名 WHERE 字段名 [NOT] LIKE ‘匹配字符串’;
注意:匹配字符串可以包含百分号(%)和下划线(_)的通配符字符串
- “s%” 表示以s开始的字符串
- “%s” 表示以s结尾的字符串
- “%s%”表示包含s的字符串
- 下划线只匹配单个字符 如果想匹配多个字符可以使用多个下划线
- 如果想匹配字符串里面的 % 或 _ 可以在前面使用 \ 来转义
带AND关键字的多条件查询
SELECT * | {字段名1,字段名2,…} FROM 表名 WHERE 条件表达式1 AND 条件表达式2 [AND 条件表达式3,…]
带OR关键字的多条件查询
SELECT * | {字段名1,字段名2,…} FROM 表名 WHERE 条件表达式1 OR 条件表达式2 [AND 条件表达式3,…
聚合函数
COUNT()函数 (统计函数)
SELECT COUNT(*) FROM 表名;
SUM()函数(求和函数)
SELECT SUM(字段名) FROM 表名;
MAX()函数(最大值函数)
SELECT MAX(字段名) FROM 表名;
MIN()函数(最小值函数)
SELECT MIN(字段名) FROM 表名;
AVG()函数(平均值函数)
SELECT AVG(字段名) FROM 表名;
对查询结果排序
SELECT 字段名1,字段名2,… FROM 表名 ORDER BY 字段名1 [ASC | DESC], 字段名2 [ASC | DESC],…
注:ASC 表示升序 DESC 表示降序
分组查询
SELECT 字段名1,字段名2,… FROM 表名 GROUP BY 字段名1,字段名2,…[HAVING 条件表达式];
分组

在数据库中,通过 group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组。
select … from students group by 需要分组字段;
group_concat(…)
我们通过group_concat(…)查看每组的详细信息
分组后的筛选
限制查询
SELECT 字段名1,字段名2,… FROM 表名 LIMIT [OFFSET, ] 记录数
函数


为表和字段取别名
为表取别名
SELECT * FROM 表名 [AS] 别名;
为字段取别名
SELECT 字段名 [AS] 别名 [,字段名 [AS] 别名,…] FROM 表名;
表连接
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql。这时我们就需要使用表连接。
分类:
- 内连接
- 外连接
- 左连接
- 右连接
内连接
内连接仅选出两张表中互相匹配的记录
select * from 表1 inner join 表2 on 表1.列 = 表2.列;
左连接
查询的结果为两个表匹配到的数据,左表持有的数据,对于右表中不存的数据使用null填充
select * from 表1 left join 表2 on 表1.列 = 表2.列;

右连接
查询结果为两个表匹配到的数据,右表持有的数据,对于左表中不存在的数据使用null填充。
select * from 表1 right join 表2 on 表1.列 = 表2.列;
子查询
某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。
演示
创建数据库 CREATE DATABASE chapter04;
查看当前使用的数据库 SELECT DATABASE();
选择使用数据库 USE chapter04;
查看当前使用的数据库 SELECT DATABASE();
创建表 CREATE TABLE student( id INT(3) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, grade FLOAT, gender CHAR(2) );
查看表 SELECT * FROM student;
插入数据 INSERT INTO student(name, grade, gender) VALUES (‘A’,40,’男’), (‘B’,50,’男’), (‘C’,60,’男’), (‘D’,70,’女’), (‘E’,80,’女’), (‘F’,90,’男’), (‘G’,100,’男’), (‘H’,110,NULL);
查看表(指定字段) SELECT id, name, grade FROM student;
查看表(通配符) SELECT FROM student;
带关系运算符的查询 SELECT id, name FROM student WHERE id=4;
带IN关键字查询 SELECT id, name, grade FROM student WHERE id IN(1,2,3);
带 BETWEEN AND 关键字的查询 SELECT id, name, grade FROM student WHERE id BETWEEN 2 AND 5;
空值查询 SELECT * FROM student WHERE gender IS NULL;
带DISTINCT关键字的查询(过滤去重) SELECT DISTINCT gender FROM student;
带LIKE关键字的查询(模糊查询) SELECT name FROM student WHERE name LIKE ‘%d’;
带AND关键字的多条件查询 SELECT id,name,grade FROM student WHERE id in (1,2,3,4) AND grade < 70;
带AND关键字的多条件查询 SELECT id,name,grade FROM student WHERE id in (1,2) OR grade > 70;
COUNT()函数 (统计函数)
SELECT COUNT(*) FROM student;SUM()函数(求和函数) SELECT SUM(grade) FROM student;
MAX()函数(最大值函数) SELECT MAX(grade) FROM student;
MIN()函数(最小值函数) SELECT MIN(grade) FROM student;
AVG()函数(平均值函数) SELECT AVG(grade) FROM student;
对查询结果排序 SELECT * FROM student ORDER BY gender DESC,grade ASC;
分组查询 SELECT * FROM student GROUP BY gender;
限制查询 SELECT * FROM student LIMIT 4;
