MySQL基础语句
SQL分类
- DDL:数据定义语言,用来定义数据库对象(如数据库,表,字段)
- DML:用来对数据库表中数据进行增删改操作
- DQL:用来查询数据库中表的记录
- DCL:用来创建数据库用户,控制数据库的访问权限
数值类型
| 类型 |
存储大小(字节) |
范围(有符号) |
范围(UNSIGNED无符号) |
TINYINT |
1字节 |
-128 到 127 |
0 到 255 |
SMALLINT |
2字节 |
-32768 到 32767 |
0 到 65535 |
MEDIUMINT |
3字节 |
-8388608 到 8388607 |
0 到 16777215 |
INT 或 INTEGER |
4字节 |
-2147483648 到 2147483647 |
0 到 4294967295 |
BIGINT |
8字节 |
-9223372036854775808 到 9223372036854775807 |
0 到 18446744073709551615 |
字符串类型
| 类型 |
描述 |
存储大小 |
使用场景 |
CHAR(M) |
固定长度字符串,长度固定为M字符 |
每字符占用M × 字符集字节数,不足部分用空格填充 |
存储固定长度的字符串,如国家代码、性别、邮政编码等 |
VARCHAR(M) |
可变长度字符串,最大长度为M字符 |
实际长度 + 1或2字节(存储长度信息) |
存储长度不固定的字符串,如用户名、地址、描述等 |
TEXT |
长文本数据,最大长度为65,535字节 |
实际长度 + 2字节(存储长度信息) |
存储较长的文本数据,如文章、评论等 |
MEDIUMTEXT |
更长的文本数据,最大长度为16,777,215字节 |
实际长度 + 3字节(存储长度信息) |
存储非常长的文本数据,如博客文章、HTML内容等 |
LONGTEXT |
最长的文本数据,最大长度为4,294,967,295字节 |
实际长度 + 4字节(存储长度信息) |
存储超长文本数据,如文档存储、日志内容等 |
BINARY(M) |
固定长度的二进制字符串,长度为M字节 |
每字节占用M字节 |
存储固定长度的二进制数据,如哈希值、固定长度的密钥等 |
VARBINARY(M) |
可变长度的二进制字符串,最大长度为M字节 |
实际长度 + 1或2字节(存储长度信息) |
存储可变长度的二进制数据,如图片、文件片段等 |
BLOB |
二进制大对象,最大长度为65,535字节 |
实际长度 + 2字节(存储长度信息) |
存储较小的二进制数据,如图片、音频片段等 |
MEDIUMBLOB |
中等大小的二进制大对象,最大长度为16,777,215字节 |
实际长度 + 3字节(存储长度信息) |
存储中等大小的二进制数据,如中等大小的图片、视频片段等 |
LONGBLOB |
最大的二进制大对象,最大长度为4,294,967,295字节 |
实际长度 + 4字节(存储长度信息) |
存储超大二进制数据,如大文件、视频内容等 |
ENUM('val1', 'val2', ...) |
枚举类型,列中只能存储预定义的字符串值之一 |
1或2字节(取决于枚举值的数量) |
存储有限的、固定选项的字符串,如状态('active', 'inactive')、性别('male', 'female')等 |
SET('val1', 'val2', ...) |
集合类型,列中可以存储预定义字符串值的组合 |
1到8字节(取决于集合值的数量) |
存储多个选项的组合,如权限('read', 'write', 'execute') |
日期时间类型
| 类型 |
描述 |
格式 |
范围 |
存储大小(字节) |
使用场景 |
DATE |
仅日期,不包含时间 |
YYYY-MM-DD |
1000-01-01 到 9999-12-31 |
3 |
存储具体的日期,如生日、入职日期等 |
TIME |
仅时间,不包含日期 |
HH:MM:SS 或 HHH:MM:SS(支持负数) |
-838:59:59 到 838:59:59 |
3 |
存储时间段或一天中的具体时间,如营业时间、会议时间 |
DATETIME |
日期和时间的组合 |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 到 9999-12-31 23:59:59 |
8 |
存储具体的日期和时间,如订单创建时间、日志时间 |
TIMESTAMP |
日期和时间的组合,与时区相关 |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC |
4 |
存储与时间戳相关的日期和时间,如创建时间、更新时间 |
YEAR |
仅年份 |
YYYY 或 YY |
1901 到 2155,0000(特殊值) |
1 |
存储年份,如毕业年份、版权年份 |
DDL语句
DDL操作数据库
创建数据库:
创建数据库:
create database blog;
create schema blog;
create database blog character set utf8mb4;
create database blog charset utf8 collate utf8_general_mysql500_ci;
查看数据库:
查看数据库:
show databases; -- 查看所有数据库
show databases like 'blog'; -- 查看指定的数据库
show create database blog; -- 查询数据库创建信息
修改数据库:
修改数据库:
alter database blog charset utf8mb4;
alter database blog charset utf8 collate utf8_general_mysql500_ci;
删除数据库:
删除数据库:(慎用)
drop database blog;
drop schema blog;
切换数据库:
切换数据库:
use blog; -- cd
select database(); -- 查看当前所处的数据库 -- pwd
DDL操作表
创建表:
create table emp(
id int comment '编号',
workno varchar(10) comment '员工编号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
entrydate date comment '入职时间'
) comment '员工信息表';
查看表结构:
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
查看数据表的建表语句:
mysql> show create table emp;
......
| emp | CREATE TABLE `emp` (
`id` int DEFAULT NULL COMMENT '编号',
`workno` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '员工编号',
`name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
`gender` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
`age` tinyint unsigned DEFAULT NULL COMMENT '年龄',
`idcard` char(18) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '身份证号',
`entrydate` date DEFAULT NULL COMMENT '入职时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='员工信息表' |
......
1 row in set (0.02 sec)
修改表(alter插入一列字段):
- 给emp表添加一个nickname字段
mysql> alter table emp add nickname varchar(10) comment '昵称';
mysql> alter table emp add column work_address varchar(20) default NULL comment '工作地址';
修改表字段名和字段类型:
- alter table 表名 modify 字段名 新数据类型(长度)
- alter table 表名 change 旧字段名 新字段名 新数据类型(长度)
- 把emp表中nickname字段名改为username,类型为varchar(20)
mysql> alter table emp change nickname username varchar(20) comment '用户名';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp
-> ;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql>
删除表中字段:
- 删除emp表的username字段
mysql> alter table emp drop username;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
修改表名:
- emp名改为supershy
mysql> alter table emp rename to supershy;
Query OK, 0 rows affected (0.02 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'blog.emp' doesn't exist
mysql> desc supershy;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
mysql>
删除表(drop,truncate):
- drop table [if exists] 表名; 删除表
- truncate table 表名; 删除指定表,并重新创建该表,但是表中数据被删除
- 删除表
mysql> drop table if exists supershy;
Query OK, 0 rows affected (0.01 sec)
- 删除指定表,并重新创建该表
mysql> truncate table emp;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+----------------+
| Tables_in_blog |
+----------------+
| b_user |
| emp |
+----------------+
2 rows in set (0.00 sec)
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
DML
向表中插入数据:
- insert into 表名(字段1,字段2,......) values (值1,值2,......);
- insert into 表名 values (值1,值2,......);
- insert into 表名(字段1,字段2,......) values (值1,值2,......),(值1,值2,......);
- insert into 表名(字段1,字段2,......) select ……; 适用于从另一张表查询结果插入数据
- 例:insert into 表名(字段1,字段2,......) values (值1,值2,......);
mysql> insert into emp(id,workno,name,gender,age,idcard,entrydate) values (1,'1','张无忌','男',18,'234212321315368321','2002-01-01');
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+------+--------+-----------+--------+------+--------------------+------------+
| id | workno | name | gender | age | idcard | entrydate |
+------+--------+-----------+--------+------+--------------------+------------+
| 1 | 1 | 张无忌 | 男 | 18 | 234212321315368321 | 2002-01-01 |
+------+--------+-----------+--------+------+--------------------+------------+
1 row in set (0.00 sec)
- 例:insert into 表名 values (值1,值2,......);
mysql> insert into emp values (2,'2','张敏','女',19,'234212321315368312','2001-01-01');
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+------+--------+-----------+--------+------+--------------------+------------+
| id | workno | name | gender | age | idcard | entrydate |
+------+--------+-----------+--------+------+--------------------+------------+
| 1 | 1 | 张无忌 | 男 | 18 | 234212321315368321 | 2002-01-01 |
| 2 | 2 | 张敏 | 女 | 19 | 234212321315368312 | 2001-01-01 |
+------+--------+-----------+--------+------+--------------------+------------+
2 rows in set (0.00 sec)
- 例:insert into 表名(字段1,字段2,......) values (值1,值2,......),(值1,值2,......);
mysql> insert into emp(id,workno,name,gender,age,idcard,entrydate) values (3,'3','jiaxing','男',20,'234212151315368321','2002-01-02'),(4,'4','supershy','男',22,'234212151315315221','2002-02-05');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from emp;
+------+--------+-----------+--------+------+--------------------+------------+
| id | workno | name | gender | age | idcard | entrydate |
+------+--------+-----------+--------+------+--------------------+------------+
| 1 | 1 | 张无忌 | 男 | 18 | 234212321315368321 | 2002-01-01 |
| 2 | 2 | 张敏 | 女 | 19 | 234212321315368312 | 2001-01-01 |
| 3 | 3 | jiaxing | 男 | 20 | 234212151315368321 | 2002-01-02 |
| 4 | 4 | supershy | 男 | 22 | 234212151315315221 | 2002-02-05 |
+------+--------+-----------+--------+------+--------------------+------------+
4 rows in set (0.00 sec)
--- insert into 表名(字段1,字段2,......) select ……; 适用于从另一张表查询结果插入数据
mysql> insert into student_course (studentid,courseid) select s.id,(select id from courses where name='大学英语') from students s left join student_course sc on s.id=sc.studentid where s.id not in (select studentid from student_course where courseid = (select id from courses where name='大学英语')) group by s.id;
修改表中数据(update):
- update 表名 set 字段名1=值1,字段名2=值2,...... [where 条件];
mysql> update emp set name='shy',age=20 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from emp;
+------+--------+----------+--------+------+--------------------+------------+
| id | workno | name | gender | age | idcard | entrydate |
+------+--------+----------+--------+------+--------------------+------------+
| 1 | 1 | shy | 男 | 20 | 234212321315368321 | 2002-01-01 |
| 2 | 2 | 张敏 | 女 | 19 | 234212321315368312 | 2001-01-01 |
| 3 | 3 | jiaxing | 男 | 20 | 234212151315368321 | 2002-01-02 |
| 4 | 4 | supershy | 男 | 22 | 234212151315315221 | 2002-02-05 |
+------+--------+----------+--------+------+--------------------+------------+
4 rows in set (0.00 sec)
删除表数据(delete):
- delete from 表名 [where 条件];
- 注意:不加条件会删除整个表
- delete不能删除某个字段(使用update可以)
mysql> delete from emp where gender='女';
Query OK, 1 row affected (0.01 sec)
mysql> select * from emp;
+------+--------+----------+--------+------+--------------------+------------+
| id | workno | name | gender | age | idcard | entrydate |
+------+--------+----------+--------+------+--------------------+------------+
| 1 | 1 | shy | 男 | 20 | 234212321315368321 | 2002-01-01 |
| 3 | 3 | jiaxing | 男 | 20 | 234212151315368321 | 2002-01-02 |
| 4 | 4 | supershy | 男 | 22 | 234212151315315221 | 2002-02-05 |
+------+--------+----------+--------+------+--------------------+------------+
3 rows in set (0.00 sec)
DQL
select语句执行顺序
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit
基础查询
1)查询多个字段
- select 字段1,字段2,...... from 表名;
- select * from 表名;
2)设置别名
- select 字段1 [as 别名1],字段2 [as 别名2],...... from 表名;
3)去除重复统计
- select distinct 字段列表 from 表名;
mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name | url | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
+----+--------------+---------------------------+-------+---------+
5 rows in set (0.00 sec)
mysql> select name,country from websites;
+--------------+---------+
| name | country |
+--------------+---------+
| Google | USA |
| 淘宝 | CN |
| 菜鸟教程 | CN |
| 微博 | CN |
| Facebook | USA |
+--------------+---------+
5 rows in set (0.00 sec)
mysql> select name as '企业名字',country as '国家' from websites;
+--------------+--------+
| 企业名字 | 国家 |
+--------------+--------+
| Google | USA |
| 淘宝 | CN |
| 菜鸟教程 | CN |
| 微博 | CN |
| Facebook | USA |
+--------------+--------+
5 rows in set (0.00 sec)
mysql> select distinct country from websites;
+---------+
| country |
+---------+
| USA |
| CN |
+---------+
2 rows in set (0.00 sec)
4)where条件判断应用
| 关键字/操作符 |
描述 |
示例 |
= |
等于,用于比较两个值是否相等。 |
WHERE column = value
SELECT * FROM table WHERE id = 1; |
<> 或 != |
不等于,用于比较两个值是否不相等。 |
WHERE column <> value
SELECT * FROM table WHERE name != 'Alice'; |
> |
大于,用于比较一个值是否大于另一个值。 |
WHERE column > value
SELECT * FROM table WHERE age > 18; |
< |
小于,用于比较一个值是否小于另一个值。 |
WHERE column < value
SELECT * FROM table WHERE age < 18; |
>= |
大于等于,用于比较一个值是否大于或等于另一个值。 |
WHERE column >= value
SELECT * FROM table WHERE age >= 18; |
<= |
小于等于,用于比较一个值是否小于或等于另一个值。 |
WHERE column <= value
SELECT * FROM table WHERE age <= 18; |
BETWEEN |
用于指定一个值的范围(包括边界值)。 |
WHERE column BETWEEN value1 AND value2
SELECT * FROM table WHERE age BETWEEN 18 AND 30; |
NOT BETWEEN |
用于排除一个值的范围(不包括边界值)。 |
WHERE column NOT BETWEEN value1 AND value2
SELECT * FROM table WHERE age NOT BETWEEN 18 AND 30; |
IN |
用于指定一个值是否在一组值中。 |
WHERE column IN (value1, value2, ...)
SELECT * FROM table WHERE id IN (1, 2, 3); |
NOT IN |
用于指定一个值是否不在一组值中。 |
WHERE column NOT IN (value1, value2, ...)
SELECT * FROM table WHERE id NOT IN (1, 2, 3); |
LIKE |
用于模糊匹配,支持通配符 %(任意字符)和 _(单个字符)。 |
WHERE column LIKE pattern
SELECT * FROM table WHERE name LIKE 'A%';
SELECT * FROM table WHERE name LIKE '_oo'; |
NOT LIKE |
用于排除模糊匹配。 |
WHERE column NOT LIKE pattern
SELECT * FROM table WHERE name NOT LIKE 'A%'; |
IS NULL |
用于判断一个值是否为 NULL。 |
WHERE column IS NULL
SELECT * FROM table WHERE address IS NULL; |
IS NOT NULL |
用于判断一个值是否不为 NULL。 |
WHERE column IS NOT NULL
SELECT * FROM table WHERE address IS NOT NULL; |
AND |
用于组合多个条件,所有条件必须同时满足。 |
WHERE condition1 AND condition2
SELECT * FROM table WHERE age > 18 AND gender = 'Male'; |
OR |
用于组合多个条件,满足任意一个条件即可。 |
WHERE condition1 OR condition2
SELECT * FROM table WHERE age > 18 OR gender = 'Female'; |
NOT |
用于对条件取反。 |
WHERE NOT condition
SELECT * FROM table WHERE NOT age > 18; |
REGEXP 或 RLIKE |
用于正则表达式匹配。 |
WHERE column REGEXP pattern
SELECT * FROM table WHERE name REGEXP '^A.*'; |
EXISTS |
用于检查子查询是否返回数据。 |
WHERE EXISTS (SELECT 1 FROM table2 WHERE table2.id = table1.id); |
ANY |
用于比较一个值与子查询结果中的任意值。 |
WHERE column = ANY (SELECT column FROM table2); |
ALL |
用于比较一个值与子查询结果中的所有值。 |
WHERE column > ALL (SELECT column FROM table2); |
INSERT INTO emp (id, workno, name, gender, age, idcard, entrydate) VALUES
(1, 'W001', 'Alice', 'F', 25, '110101199001011234', '2020-01-01'),
(2, 'W002', 'Bob', 'M', 30, '110101198502025678', '2019-03-15'),
(3, 'W003', 'Charlie', 'M', 28, '110101198703039012', '2018-05-20'),
(4, 'W004', 'Diana', 'F', 22, '110101199504043456', '2021-06-30'),
(5, 'W005', 'Eve', 'F', 27, '110101199305057890', '2017-07-10'),
(6, 'W006', 'Frank', 'M', 35, '110101198006061234', '2016-08-20'),
(7, 'W007', 'Grace', 'F', 29, '110101198107075678', '2015-09-30'),
(8, 'W008', 'Hank', 'M', 32, '110101198308089012', '2014-10-15'),
(9, 'W009', 'Ivy', 'F', 24, '110101199109093456', '2013-11-20'),
(10, 'W010', 'Jack', 'M', 26, '110101199410107890', '2012-12-30'),
(11, 'W011', 'Kimi', 'F', 23, '110101199211111234', '2011-01-15'),
(12, 'W012', 'Leo', 'M', 31, '110101198412125678', '2010-02-20'),
(13, 'W013', 'Mona', 'F', 28, '110101198601019012', '2009-03-30'),
(14, 'W014', 'Nick', 'M', 33, '110101198202023456', '2008-04-15'),
(15, 'W015', 'Olive', 'F', 27, '110101198803037890', '2007-05-20'),
(16, 'W016', 'Peter', 'M', 29, '110101198904041234', '2006-06-30'),
(17, 'W017', 'Queen', 'F', 30, '110101199005055678', '2005-07-10'),
(18, 'W018', 'Ryan', 'M', 34, '110101198106069012', '2004-08-20'),
(19, 'W019', 'Sara', 'F', 25, '110101199307073456', '2003-09-30'),
(20, 'W020', 'Tom', 'M', 28, 'null', '2002-10-15');
示例 1:基本条件
-- 查询年龄大于 30 的员工
mysql> select * from emp where age>30;
-- 查询性别为女性的员工
mysql> select * from emp where gender='F';
示例 2:范围查询
-- 查询年龄在 25 到 30 之间的员工
mysql> select * from emp where age>=25 and age<=30;
mysql> select * from emp where age between 25 and 30;
mysql> select * from emp where age in(25,26,27,28,29,30);
-- 查询年龄不在 25 到 30 之间的员工
mysql> select * from emp where age not in(25,26,27,28,29,30);
示例 3:模糊查询
-- 查询名字以字母 "A" 开头的员工
mysql> select * from emp where name like 'A%';
-- 查询名字是三个字母的员工
mysql> select * from emp where name like '___';
示例 4:空值查询
-- 查询身份证号为空的员工
mysql> select * from emp where idcard is null;
-- 查询身份证号不为空的员工
mysql> select * from emp where idcard is not null;
示例 5:组合条件
-- 查询年龄大于 25 且性别为男的员工
mysql> select * from emp where age>25 and gender='M';
-- 查询年龄小于 30 或性别为女的员工
mysql> select * from emp where age<30 or gender='F';
5)聚合函数
| 聚合函数 |
功能描述 |
示例 |
COUNT() |
统计行数或非空值的数量。 |
SELECT COUNT(*) AS total_rows FROM emp;
SELECT COUNT(age) AS age_count FROM emp; |
SUM() |
计算数值列的总和。 |
SELECT SUM(age) AS total_age FROM emp;
SELECT SUM(salary) AS total_salary FROM emp; |
AVG() |
计算数值列的平均值。 |
SELECT AVG(age) AS average_age FROM emp;
SELECT AVG(salary) AS average_salary FROM emp; |
MAX() |
找出某列的最大值。 |
SELECT MAX(age) AS max_age FROM emp;
SELECT MAX(salary) AS max_salary FROM emp; |
MIN() |
找出某列的最小值。 |
SELECT MIN(age) AS min_age FROM emp;
SELECT MIN(salary) AS min_salary FROM emp; |
DISTINCT |
去除重复值,统计唯一值的数量。 |
SELECT COUNT(DISTINCT name) AS unique_names FROM emp;
SELECT DISTINCT gender FROM emp; |
示例1:count()
-- 统计表中总行数
mysql> select count(*) from emp;
-- 统计非空证件号的数量
mysql> select count(idcard) from emp;
-- 统计性别为男的员工数量
mysql> select count(*) from emp where gender='M';
示例2:sum()
-- 假设表中有 salary 列,计算总薪资
mysql> select sum(salary) as total_salary from emp;
-- 计算男性员工的总薪资
mysql> select sum(salary) as male_total_salary from emp where gender = 'M';
示例3:avg()
-- 计算平均年龄
mysql> select avg(age) from emp;
-- 计算女性员工的平均年龄
mysql> select avg(age) from emp where gender='F';
示例4:max()和min()
-- 找出最大年龄
mysql> select max(age) from emp;
-- 找出最小年龄
mysql> select min(age) from emp;
-- 找出入职时间最早和最晚的员工
mysql> select max(entrydate),min(entrydate) from emp;
6)分组查询
- select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
- where和having区别:
- 执行时机不同:where是再分组之前过滤,如果不满足where条件不参与分组;而having是分组之后的结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断,而having可以
-- 分别统计男员工和女员工的数量
mysql> select gender,count(*) from emp group by gender;
-- 分别统计男员工和女员工的平均年龄
mysql> select gender,avg(age) from emp group by gender;
-- 统计年龄小于45的员工所在的工作地址并取出员工数量大于3的工作地址
mysql> select count(*) as worker_total,work_address from emp where age<45 group by work_address having worker_total>3;
7)排序查询(order by)
- select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
- 排序方式:
- 注意:如果是多字段排序时,当第一个字段值相同时,才会根据第二个字段进行排序
-- 根据年龄对公司员工进行升序排序
mysql> select * from emp order by age asc;
mysql> select * from emp order by age;
-- 根据入职时间,对员工进行降序排序
mysql> select * from emp order by entrydate desc;
-- 根据年龄对公司员工进行升序排序,年龄相同,再按照入职时间进行降序排序
mysql> select * from emp order by age asc,entrydate desc;
8)分页查询(limit)
- select 字段列表 from 表名 limit 起始索引,查询记录数;
- 注意:
- 起始索引从0开始,起始索引 = (查询页数 - 1)* 每页显示的记录数
- 分页查询在不同的数据库中关键字不同,mysql中是limit
- 如果查询的是第一页数据,起始索引可以省略,简写:limit 10;
-- 查询第1页员工数据,每页显示10条数据
mysql> select * from emp limit 0,10;
mysql> select * from emp limit 10;
-- 查询第2页员工数据,每页显示10条数据
mysql> select * from emp limit 10,10;
案例练习:
-- 查询年龄为20,21,22,25岁的女性员工信息
mysql> select * from emp where age in(20,21,22,25) and gender='F';
-- 查询性别为男,并且年龄在20-40岁(含)以内的姓名为3个字的员工
mysql> select * from emp where gender='M' and age between 20 and 40 and name like '___';
-- 统计员工表中,年龄小于30岁的,男性和女性员工人数
mysql> select gender as '性别',count(*) as '数量' from emp where age<30 group by gender;
-- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,年龄相同按入职时间降序排序
mysql> select name,age,entrydate from emp where age<35 order by age asc,entrydate desc;
-- 查询性别为男,并且年龄在20-40岁(含)以内的前五个员工信息,对查询结果按年龄升序排序,年龄相同按入职时间升序排序
mysql> select * from emp where gender='M' and age between 20 and 40 order by age asc,entrydate asc limit 5;
DCL
用户管理
查看用户信息
-- 查看系统用户
mysql> select user,host,authentication_string,plugin from mysql.user;
user 用户名
host 用户ip范围
authentication_string 加密后的密码(8.0使用sha2加密)
plugin 显示密码加密方式
-- 查看当前登录用户:
mysql> select user();
创建用户
-- 创建用户
mysql> create user 'shyshy'@'%' identified by '6';
删除 用户
-- 删除用户
mysql> drop user 'shyshy'@'%';
mysql> delete from mysql.user where user='shyshy';
修改用户信息
-- 修改用户信息
mysql> alter user supershy identified by '1';
mysql> alter user jiaxing identified with 密码加密方式 by '123';
8.0之前 密码加密方式:mysql_native_password 容易破解
8.0之后 密码加密方式:caching_sha2_password 不容易破解
给用户上锁
-- 上锁
mysql> alter user supershy account lock;
Query OK, 0 rows affected (0.00 sec)
-- 解锁
mysql> alter user supershy account unlock;
Query OK, 0 rows affected (0.01 sec)
权限管理
查看系统可用的权限
mysql> show privileges;
查看用户权限
-- 方式一:查看用户权限
mysql> show grants for supershy;
-- 方式二:查看用户权限
select * from mysql.user where user='jiaxing'\G;
select * from mysql.db where user='jiaxing'\G;
select * from mysql.tables_priv where user='jiaxing'\G;
mysql.user 全局授权表*.*
mysql.db 库权限授权表blog.*
mysql.tables_priv 表权限授权表blog.student
给用户授权
-- 给用户授权
mysql> grant all on *.* to supershy;
mysql> grant select,show on *.* to supershy;
all所有权限
回收权限
mysql> revoke create,select on *.* from supershy;
使用role角色管理用户权限
创建role:create role jiaxing_r,jiaxing_rw;
给role授权:grant select on blog.* to jiaxing_r;
用户绑定role:grant jiaxing_r to supershy01;
激活role功能:set default role all to supershy01;
查看role是否激活:select current_role();