版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83828778
MySQL 笔记3 – SQL 语言
MySQL 系列笔记是笔者学习、实践MySQL数据库的笔记
课程链接: MySQL 数据库基础入门教程
参考文档:
MySQL 官方文档
一、 SQL语言规范
- SQL关键字、对象名、和列名不区分大小写
- 字符值和日期值要区分大小写
- 在应用程序中如果SQL语句文本很长,可以将语句分布到多行上,并且可以通过使用跳格和缩进提高代码的可读性
- SQL语句以分号(;)结束。
二、 DLL:数据定义(definition)语言
功能 | 语句 |
---|---|
创建数据库 | create database 数据库名 character set utf8; |
修改数据库 | alter database 数据库名 charactor set gbk; |
创建表 | CREATE TABLE 表名(列名1 类型 [约束],列名2 类型 [约束]); |
添加一列 | ALTER TABLE 表名 ADD 列名 数据类型; |
查看表的字段信息 | DESC 表名; |
修改表的字段类型 | ALTER TABLE 表名 MODIFY 字段名 数据类型; |
删除一列 | ALTER TABLE 表名 DROP 字段名; |
修改表名 | RENAME TABLE 原始表名 TO 要修改的表名; |
查看表的创建细节 | SHOW CREATE TABLE 表名; |
修改表的字符集 | ALTER TABLE 表名 CHARACTER SET 字符集名称; |
修改表的列名 | ALTER TABLE 表名 CHANGE 原始列名 新列名 数据类型; |
删除表 | DROP TABLE 表名; |
三、 DML:数据操作(manipulation)语言
1、插入操作
语句:
单行插入:INSERT INTO 表名(列名1,列名2 …)VALUE (列值1,列值2…);
多行插入:INSERT INTO 表名(列名1,列名2 …)VALUES (列值1,列值2…),(列值1,列值2…);
要点:
- 列名与列值的类型、个数、顺序要一一对应
- 值不要超出列定义的长度
- 插入的日期和字符一样,都使用引号括起来
- 可以省略列名,VALUE 按表头顺序填写
2、更新操作
语句:
更新某几列值:UPDATE 表名 SET 列名1=列值1,列名2=列值2
更新某行的某几列值:UPDATE 表名 SET 列名1=列值1,列名2=列值2 WHERE 列名=值;
要点:
- 如果列值为数字类型,可以使用运算符
实例: 修改数据库密码
------
# 方法1:适用于旧版
# 进入数据库
use mysql;
# 修改表
update user set password=password('abc') WHERE User='root';
------
# 方法2:适用于新版
# 直接在数据库管理系统中修改
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
# 刷新MySQL的系统权限相关表
flush privileges;
------
# 方法3:适用命令行
mysqladmin -u root -p password 12356
3、删除操作
语句:
删除1:DELETE FROM 表名 [WHERE 列名=值]
删除2:TRUNCATE TABLE 表名;
区别:
- DELETE 删除表中的数据,表结构还在,删除后的数据可以找回
- TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表,删除的数据不能找回,执行速度比DELETE快
四 、 DQL:数据查询(query)语言
1、基本查询语句
功能 | 语句 |
---|---|
查询所有列 | SELECT * FROM 表名; |
查询指定列 | SELECT 列名1,列名2… FROM 表名; |
条件查询 | SELECT * FROM 表名 WHERE 条件 |
2、条件查询
条件查询运行符及关键字:
运行符/关键字 | 语句 |
---|---|
=(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于); | SELECT * FROM 表名 WHERE 列名>=值 |
BETWEEN…AND;值在什么范围 | SELECT * FROM 表名 WHERE 列名 BETWEEN 列值1 AND 列值2; |
IN(set);固定的范围值 | SELECT * FROM 表名 WHERE 列名 IN(列值1,列值2,…) |
IS NULL;(为空)、IS NOT NULL(不为空) | SELECT * FROM 表名 WHERE 列名 IS NULL; |
AND;与、OR;或、NOT; 非 | SELECT * FROM 表名 WHERE 列名1=列值 AND 列名2=列值; |
3、模糊查询
语句: SELECT * FROM 表名 WHERE 列名 LIKE 匹配表达式;
通配符:
通配符 | 说明 |
---|---|
_ | 任意一个字符 |
% | 任意0~n个字符 |
常用匹配表达式:
表达式 | 说明 |
---|---|
‘____’ | 几个_就表示匹配几个字符 |
‘%字符%’ | 匹配包含某个/些字符的列值 |
‘字符%’ | 匹配以某个/些字符开头的列值 |
‘%字符’ | 匹配以某个/些字符结尾的列值 |
4、字段控制查询
功能 | 语句 |
---|---|
去除重复记录 | SELECT DISTINCT 列名 FROM 表名; |
查询结果进行运算,必须都要是数据型 | SELECT *,列名1+列名2 FROM 表名; |
查询结果进行条件替换 | SELECT *,IFNULL(列名,0) FROM 表名; |
对查询结果起别名 | SELECT *,列名1+列名2 AS 别名 FROM 表名; |
5、排序
语句: 可以多级排序
SELECT * FROM 表名 ORDER BY 列名1,列名2 排序类型;
排序类型:
- ASC:升序,从小到大,默认
- DESC:降序,从大到小
6、聚合函数
语句:
SELECT 聚合函数(*) AS 别名 FROM 表名;
常用聚合函数:
函数 | 功能 |
---|---|
COUNT() | 统计指定列不为NULL的记录行数; |
MAX() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
MIN() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
SUM() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0; |
AVG() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0; |
7、分组查询
语句: SELECT 字段名 from 表名 GROUP BY 字段名;
要点:
- 当 GROUP BY 单独使用时,只显示出每组的第一条记录
- 在使用分组时,SELECT 后面直接跟的字段一般都出现在 GROUP BY 后
(1)group by + group_concat():
- GROUP_CONCAT(字段名)可以作为一个输出字段来使用表示分组之后,根据分组结果,使用GROUP_CONCAT()来放置每一组的某字段的值的集合
# 语句
SELECT 字段名,GROUP_CONCAT(字段名) from 表名 GROUP BY 字段名;
# 示例:查询性别名称和各性别的人的名字
SELECT gender,GROUP_CONCAT(name) from employee GROUP BY gender;
(2)group by + 聚合函数:
- GROUP BY 统计出每个分组的某字段的值的集合,再通过集合函数来对这个"值的集合"做一些操作
# 语句
SELECT 字段名1,聚合函数(字段名2) FROM 表名 GROUP BY 字段名1;
# 示例:查询每个部门的部门名称和每个部门的工资和
SELECT department,SUM(salary) FROM employee GROUP BY department;
(3)group by + having:
- having 作用和 where 一样,但 having 只能用于 group by
- having 是在分组后对数据进行过滤,where 是在分组前对数据进行过滤
- having 后面可以使用分组函数(统计函数),where 不可以
# 语句
SELECT 字段名,聚合函数(字段名) from 表名 GROUP BY 字段名 HAVING 聚合函数(字段名)的条件;
# 示例:各部门个人工资大于2000的总和大于6000,降序排列
SELECT department, SUM(salary) FROM employee WHERE salary >2000
GROUP BY department HAVING SUM(salary)>6000 ORDER BY SUM(salary) DESC;
8、LIMIT
语句:
SELECT * FROM 表名 LIMIT 参数1, 参数2;
- 参数1:从哪一行开始查
- 参数2:要查几行
- 行数的索引从0开始
示例:
# 分页查询格式
SELECT * FROM 表名 LIMIT (当前页数-1)*每页的行数,每页的行数
# 实例
SELECT * FROM tabel LIMIT (cyr_page-1)*page_size,page_size
GOOD LUCK!