mysql基础操作(详细版)--增删改查
文章目录
- 1.数据类型
- 2.运算符
- 3.正则表达式
- 4.多表关系
- 5.常用的逻辑关键字
- ——————————
- 1.数据库常用操作
- 表常用操作
- 2.创建表
- 3.数据插入
- 4.数据修改
- 5.数据删除
- 6.数据约束
- 6.1主键约束
- 6.2自增长约束
- 6.3非空约束
- 6.4唯一约束
- 6.5默认约束
- 6.6零填充约束
- 6.7外键约束
- 7.DQL查询
- **7.1简单查询示例**
- **7.2条件查询示例**
- 7.3排序查询
- 7.4聚合查询
- 7.5分组查询
- 7.6分页查询
- 8.数据复制
- 9.多表联合查询
- 9.1交叉连接查询
- 9.2内连接查询
- 9.3外连接查询
- 9.4子查询
- 9.5自关联查询
- 9.4子查询
- 9.5自关联查询
1.数据类型
数据类型:在创建表的时候为表中字段指定数据类型,只有数据符合类型要求才能存储起来
**原则:**够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间。
分类:
- 数值类型:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 字符串类型:
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
- 日期类型:
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
2.运算符
概述:数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。例如,学生表中存在一个birth字段,这个字段表示学生的出生年份。而运用MySQL的算术运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据。
分类:
- 算术运算符:
算术运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或 DIV | 除法运算,返回商 |
% 或 MOD | 求余运算,返回余数 |
- 比较运算符:
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<> 或!= | 不等于 |
IS NULL 或 ISNULL | 判断一个值是否为 NULL |
IS NOT NULL | 判断一个值是否不为 NULL |
LEAST | 当有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
- 逻辑运算符:
逻辑运算符 | 说明 |
---|---|
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
- 位运算符:
位运算符 | 说明 |
---|---|
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
3.正则表达式
概述:
- 正则表达式(regularexpression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
- MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除 “\n” 之外的任何单个字符。 |
[…] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^…] | 负值字符集合。匹配未包含的任意字符。例如, ‘**[^**abc]’ 可以匹配 “plain” 中的’p’。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}. |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
正则表达式示例:
- ^ 在字符串开始处进行匹配
SELECT ‘abc’ REGEXP ‘^a’;
- $ 在字符串末尾开始匹配
SELECT ‘abc’ REGEXP ‘a$’;
SELECT ‘abc’ REGEXP 'c$’;
- . 匹配任意字符
SELECT ‘abc’ REGEXP ‘.b’;
SELECT ‘abc’ REGEXP ‘.c’;
SELECT ‘abc’ REGEXP ‘a.’;
- […] 匹配括号内的任意单个字符
SELECT ‘abc’ REGEXP ‘[xyz]’;
SELECT ‘abc’ REGEXP ‘[xaz]’;
- [^…] 注意^符号只有在[]内才是取反的意思,在别的地方都是表示开始处匹配
SELECT ‘a’ REGEXP ‘[^abc]’;
- a* 匹配0个或多个a,包括空字符串。 可以作为占位符使用.有没有指定字符都可以匹配到数据
SELECT 'stab’REGEXP ‘.ta*b’;
SELECT 'stb’REGEXP ‘.ta*b’;
SELECT ''REGEXP ‘a*’;
- a+ 匹配1个或者多个a,但是不包括空字符
SELECT ‘stab’ REGEXP ‘.ta+b’;
SELECT ‘stb’ REGEXP ‘.ta+b’;
- a? 匹配0个或者1个a
SELECT 'stb’REGEXP ‘.ta?b’;
SELECT 'stab’REGEXP ‘.ta?b’;
SELECT 'staab’REGEXP ‘.ta?b’;
- a1|a2 匹配a1或者a2,
SELECT ‘a’ REGEXP ‘a|b’;
SELECT ‘b’ REGEXP ‘a|b’;
SELECT ‘b’ REGEXP ‘^(a|b)’;
SELECT ‘a’ REGEXP ‘^(a|b)’;
SELECT ‘c’ REGEXP ‘^(a|b)’;
- a{m} 匹配m个a
SELECT ‘auuuuc’ REGEXP ‘au{4}c’;
SELECT ‘auuuuc’ REGEXP ‘au{3}c’;
- a{m,n} 匹配m到n个a,包含m和n
SELECT ‘auuuuc’ REGEXP ‘au{3,5}c’;
SELECT ‘auuuuc’ REGEXP ‘au{4,5}c’;
SELECT ‘auuuuc’ REGEXP ‘au{5,10}c’;
- (abc) abc作为一个序列匹配,不用括号括起来都是用单个字符去匹配,如果要把多个字符作为一个整体去匹配就需要用到括号,所以括号适合上面的所有情况。
SELECT 'xababy’REGEXP ‘x(abab)y’;
SELECT 'xababy’REGEXP ‘x(ab)*y’;
SELECT 'xababy’REGEXP ‘x(ab){1,2}y’;
4.多表关系
分类:
一对一关系:
- 一个学生只有一张身份证;一张身份证只能对应一学生。
- 在任一表中添加唯一外键,指向另一方主键,确保一对一关系。
- 一般一对一关系很少见,遇到一对一关系的表最好是合并表。
一对多或多对一关系:
- 一个部门有多个员工,一个员工只能对应一个部门
- 实现原则:在多的一方建立外键,指向一的一方的主键
多对多关系:
- 一个学生可以选择很多门课程,一个课程也可以被很多学生选择
- 实现原则:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键
5.常用的逻辑关键字
- ALL关键字
格式:
select…from …wherec > all(查询语句)
–等价于:
select…from … where c > result1 and c > result2 and c > result3
特点:
- ALL:与子查询返回的所有值比较为true则返回true
- ALL可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
- ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。
– 查询年龄大于‘1003’部门所有年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
–查询不属于任何一个部门的员工信息
select* from emp3 where dept_id != all(selectdeptno from dept3);
- ANY关键字、SOME关键字
格式:
select …from …where c > any(查询语句)
–等价于:
select …from … where c > result1 or c > result2 or c > result3
特点:
- ANY:与子查询返回的任何值比较为true 则返回true
- ANY可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。
- 表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。
- SOME和ANY的作用一样,SOME可以理解为ANY的别名
– 查询年龄大于‘1003’部门任意一个员工年龄的员工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
- IN关键字
格式:
select …from …where c in(查询语句)
–等价于:
select …from … where c = result1 or c = result2 or c =result3
特点:
- IN关键字,用于判断某个记录的值,是否在指定的集合中
- 在IN关键字前边加上not可以将条件反过来
– 查询研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
- EXISTS关键字
格式:
select …from …where exists(查询语句)
特点:
- 该子查询如果“有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行
- 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行
- EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时where条件成立
- 注意,EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字
– 查询公司是否有大于60岁的员工,有则输出
select * from emp3 a where exists(select * from emp3 b where a.age > 60);
– 查询有所属部门的员工信息
select* from emp3 a where exists(select* from dept3 b where a.dept_id =b.deptno);
——————————
1.数据库常用操作
show databases; 查看所有数据库
create databases 数据库名; 创建数据库
use 数据库名; 使用数据库
表常用操作
功能 | SQL |
---|---|
查看当前数据库的所有表名称 | show tables; |
查看指定某个表的创建语句 | show create table 表名; |
查看表结构 | desc 表名 |
删除表 | drop table 表名 |
表添加列 | alter table 表名 add 列名 类型(长度) [约束]; |
修改列名和类型 | alter table 表名 change 旧列名新列名类型(长度) 约束; |
表删除列 | alter table 表名 drop 列名; |
修改表名 | rename table 表名 to 新表名; |
2.创建表
普通创建表:
create table [if not exists]表名(
字段名1 类型【宽度】 【约束条件】 [comment ‘字段说明’],
字段名2 类型【宽度】 【约束条件】 [comment ‘字段说明’],
字段名3 类型【宽度】 【约束条件】 [comment ‘字段说明’]
)[表的一些设置];
3.数据插入
- INSERT INTO 表名 values(属性值,属性值…);
insert into student values(1001,‘男’,18,‘1996-12-23’,‘北京’,83.5);
4.数据修改
- update 表名 set 字段名=值,字段名=值…;
updatestudent set address ='重庆’;
- update 表名 set 字段名=值,字段名=值… where 条件;
updatestudent set address ='北京’where id =1004
5.数据删除
- delete from表名 [where条件];
– 删除sid为1004的学生数据
delete from student where sid = 1004;
– 删除表所有数据
delete from student;
- truncate table 表名 或者 truncate表名
– 清空表数据
truncate table student;
truncate student;
区别:delete和truncate原理不同,delete只删除内容,而truncate类似于drop table ,可以理解为先将整个表删除,然后再创建该表。
6.数据约束
概述:表中数据的限制条件
目的:就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类:
- 主键约束(primary key) PK
- 自增长约束(auto_increment)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key) FK
6.1主键约束
概述:
- MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
- 主键约束相当于唯一约束 + 非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 每个表最多只允许一个主键
- 主键约束的关键字是:primary key
- 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引
添加单列主键:
- 方式1:
create table 表名(
…
<字段名> <数据类型> primary key
… );
- 方式2:
create table 表名(
…
[constraint <约束名>] primary key [字段名] );
添加多列主键(联合主键):
create table 表名(
…
primary key (字段1,字段2,…,字段n)
);
除此之外,还可以在表创建之后对表结构修改来对主键进行操作
- 添加主键:
alter table <表名> add primary key(字段列表);
- 删除主键:
alter table <数据表名> drop primary key;
6.2自增长约束
概述:
- 在 MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
- 通过给字段添加 auto_increment 属性来实现主键自增长
特点:
- 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
- 一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- auto_increment约束的字段必须具备 NOT NULL 属性。
- auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
- auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
添加自定义约束:
create table t_user1(
id int primary key auto_increment,
name varchar(20) );
自定义约束初始值设置:
- 方式1:
– 方式1,创建表时指定
create table t_user2 (
id int primary key auto_increment,
name varchar(20)
)auto_increment=100;
- 方式2:
alter table t_user2 auto_increment=100;
问:delete和truncate在删除后自增列的变化
答:delete数据之后自动增长从断点开始,truncate数据之后自动增长从默认起始值开始。
6.3非空约束
概述:非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
添加非空约束:
- 方式1:<字段名><数据类型> not null;
- 方式2:alter table 表名 modify 字段类型 not null;
删除非空约束:
- alter table 表名 modify 字段 类型;
6.4唯一约束
概述:唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况
添加唯一约束:
- 方式1:<字段名> <数据类型> unique
- 方式2: altertable 表名add constraint 约束名 unique(列名);
删除唯一约束:
- alter table <表名> drop index <唯一约束名>;
6.5默认约束
概述:MySQL 默认值约束用来指定某列的默认值。
添加默认约束:
- 方式1:<字段名> <数据类型> default <默认值>;
- 方式2:alter table 表名 modify 列名 类型 default 默认值;
删除默认约束:
alter table <表名> modify column <字段名> <类型> default null;
6.6零填充约束
概述:
插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
zerofill默认为int(10)
当使用zerofill时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256
添加零填充约束:
<字段名> <数据类型> zerofill;
6.7外键约束
概述:
- MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
- 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。
特点:
- 主表必须已经存在于数据库中,或者是当前正在创建的表。
- 必须为主表定义主键。
- 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。
- 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
- 外键中列的数目必须和主表的主键中列的数目相同。
- 外键中列的数据类型必须和主表主键中对应列的数据类型相同
创建外键约束:
- 方式1(在create table语句中定义):
[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]
- 方式2(修改表的结构):
alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);
外键约束下,添加数据:必须先给主表添加数据,不然由于外键约束,主表不存在该列的值,就无法给从表添加数据。
外键约束下,删除数据:主表的数据被从表依赖时,不能删除,否则可以删除;从表的数据可以随便删除。
删除外键约束:
alter table <表名> drop foreign key <外键约束名>;
多对多关系下添加外键约束:在两个表为多对多关系是需要一个中间表,将中间表作为从表,分别与其他两个表建立外键约束。
7.DQL查询
概述:
- 数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
- MySQL提供了功能强大、灵活的语句来实现这些操作。
- MySQL数据库使用select语句来查询数据。
语法格式:
SELECT
selection_list /要查询的列名称/
FROM
table_list /要查询的表名称/
WHERE
condition /行条件/
GROUP BY
grouping_columns /对结果分组/
HAVING
condition /分组后的行条件/
ORDER BY
sorting_columns /对结果分组/
LIMIT
offset_start, row_count /结果限定/
7.1简单查询示例
- 查询所有的商品.
select * from product;
- 查询商品名和商品价格.
select pname,price from product;
- 别名查询.使用的关键字是as(as可以省略的).
– 表别名:
select * from product as p;
– 列别名:
select pname as pn from product;
- 去掉重复值.
select distinct price from product;
- 查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
select pname,price+10 from product;
7.2条件查询示例
- 查询商品名称为“海尔洗衣机”的商品所有信息:
select * from product where pname = ‘海尔洗衣机’;
- 查询价格为800商品
select * from product where price = 800;
- 查询价格不是800的所有商品
select * from product where price != 800;
select * from product where price <> 800;
select * from product where not(price = 800);
- 查询商品价格大于60元的所有商品信息
select * from product where price > 60;
- 查询商品价格在200到1000之间所有商品
select * from product where price >= 200 and price <=1000;
select * from product where price between 200 and 1000;
- 查询商品价格是200或800的所有商品
select * fromproduct where price = 200 or price = 800;
select * fromproduct where price in (200,800);
- 查询含有‘裤’字的所有商品
select * fromproduct where pname like ‘%裤%';
- 查询以’海’开头的所有商品
select * fromproduct where pname like ‘海%’;
- 查询第二个字为’蔻’的所有商品
select * fromproduct where pname like ‘_蔻%’;
- 查询category_id为null的商品
select * fromproduct where category_id is null;
- 查询category_id不为null分类的商品
select * fromproduct where category_id is not null;
- 使用least求最小值
select least(10, 20, 30); – 10
select least(10, null , 30); --null
- 使用greatest求最大值
select greatest(10, 20, 30);
select greatest(10, null, 30); --null
7.3排序查询
特点:
- asc代表升序,desc代表降序,如果不写默认升序
- orderby用于子句中可以支持单个字段,多个字段,表达式,函数,别名
- orderby子句,放在查询语句的最后面。LIMIT子句除外
排序查询示例:
- 使用价格排序(降序)
select * from product order by price desc;
- 在价格排序(降序)的基础上,以分类排序(降序)
select * from product order by price desc,category_id asc;
- 显示商品的价格(去重复),并排序(降序)
select distinct price from product order by price desc;
7.4聚合查询
概述:之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
聚合查询示例:
- 查询商品的总条数
select count(*) from product;
- 查询价格大于200商品的总条数
select count(*) from product where price > 200;
- 查询分类为’c001’的所有商品的总和
select sum(price) from product where category_id = ‘c001’;
- 查询商品的最大价格
select max(price) from product;
- 查询商品的最小价格
select min(price) from product;
- 查询分类为’c002’所有商品的平均价格
select avg(price) from product where category_id = ‘c002’;
注意:
- count函数对null值的处理
如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
- sum和avg函数对null值的处理
这两个函数忽略null值的存在,就好该条记录不存在一样。
- max和min函数对null值的处理
max和min两个函数同样忽略null值的存在。
7.5分组查询
概述:分组查询是指使用group by字句对查询信息进行分组
格式:select 字段1,字段2… from 表名 group by 分组字段 having 分组条件;
注意:
- 如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where。因为where子句用来筛选FROM子句中指定的操作所产生的行
- group by 子句用来分组WHERE子句的输出
- having子句用来从分组的结果中筛选行
总结:where不能在group by后面出现,分组后筛选只能使用having。
7.6分页查询
概述:分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
格式:
- 方式1-显示前n条
select 字段1,字段2… from 表明 limit n
- 方式2-分页显示
select 字段1,字段2… from 表明 limit m,n
m: 整数,表示从第几条索引开始
n: 整数,表示查询多少条数据
–从第4条开始显示,显示5条
select* from product limit 3,5
8.数据复制
概述:将一张表的数据导入到另一张表中
- 方式1:
insert into Table2(field1,field2,…) select value1,value2,… from Table1
insert into Table2 select *from Table1
要求:目标表(Table2)必须存在。
- 方式2:
SELECT value1, value2 into Table2 from Table1
要求:目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
9.多表联合查询
9.1交叉连接查询
概述:
- 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
- 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
- 假如A表有m行数据,B表有n行数据,则返回m*n行数据
- 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
格式:
select from 表1,表2,表3….;
9.2内连接查询
概述:内连接查询求多张表的交集
隐式内连接(SQL92标准):select * from A,B where 条件;
显示内连接(SQL99标准):select * from A inner join B on 条件;
– 查询人数大于等于3的部门,并按照人数降序排序
select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
9.3外连接查询
概述:连接结果不仅包含符合连接条件的行,同时也包含自身不符合条件的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUU5reKN-1666602441451)(D:\智慧笔囊\mysql\assets\1666428799461.png)]
格式(outer可以省略):
- 左外连接:left outer join
select * from A left outer join Bon 条件;
- 右外连接:right outer join
select * from A right outer join Bon 条件;
- 满外连接: full outer join
select * from A full outer join B on 条件;
问:内连接和外连接的区别?
答:内连接的结果是两个表都符合条件的,但外连接是至少有一方是不符合条件的,通俗的来说,就是至少有一个表的值是都存在的。
注意:注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的。
9.4子查询
概述:子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
特点:
- 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
- 单行多列:返回一行数据中多个列的内容;
- 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
- 多行多列:查询返回的结果是一张临时表
– 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查询年研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
– 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2
9.5自关联查询
概述:MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。
注意:自关联时,表必须给表起别名。
格式:
select字段列表 from 表1 a ,表1 b where 条件;
或者
select字段列表 from 表1 a [left] join 表1 b on 条件;
注意:注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的。
9.4子查询
概述:子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
特点:
- 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
- 单行多列:返回一行数据中多个列的内容;
- 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
- 多行多列:查询返回的结果是一张临时表
– 查询年龄最大的员工信息,显示信息包含员工号、员工名字,员工年龄
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查询年研发部和销售部的员工信息,包含员工号、员工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研发部’ or name = ‘销售部’) ;
– 查询研发部20岁以下的员工信息,包括员工号、员工名字,部门名字
select eid,age,ename,name from (select * from dept where name = '研发部 ')t1,(select * from emp3 where age <20)t2
9.5自关联查询
概述:MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。
注意:自关联时,表必须给表起别名。
格式:
select字段列表 from 表1 a ,表1 b where 条件;
或者
select字段列表 from 表1 a [left] join 表1 b on 条件;
----------根据黑马程序员课程的学习总结
mysql基础操作(详细版)--增删改查相关推荐
- MySQL基础之数据的增删改查
MySQL的增删改查: 1增加数据:INSERT INTO 表名 VALUES(值); (注意:每个具体数据用逗号分隔,且字段必须和输入数据的次序一一对应) 2删除数据:DELETE FROM 表名 ...
- jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)
使用jdbc连接并操作Oracle数据库(增删改查IDUS) [oracle@zaibei-db ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Pro ...
- Node连接MySQL数据库进行基本的增删改查操作(一看就会)
Node连接MySQL数据库进行基本的增删改查操作(一看就会) ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ...
- SpringBoot+Mysql+MDUI实现数据的增删改查和列表操作及单,多文件上传实例
SpringBoot+Mysql+MDUI实现数据的增删改查和列表操作及单,多文件上传实例 开源地址:https://gitee.com/jfkjrym/demo.git evan原创内容!evan原 ...
- 用Python+Mysql+MDUI实现的数据库增删改查列表操作及单,多文件上传实例
用Python+Mysql+MDUI实现的数据库增删改查列表操作及单,多文件上传实例.web服务用flask框架,数据库操作用的pymysql框架.教程在我B站有的. 开源地址:https://git ...
- 1-1 MySQL数据库的基本操作 【增删改查】
1-1 MySQL数据库的基本操作 [增删改查] 一.基础操作 创建数据库 查看数据库 选择数据库 删除数据库 二.建立一个基础数据库 三.基本操作 外键约束与字段自增 数据的增删改 数据查询 数据排 ...
- MYSQL - database 以及 table 的增删改查
MYSQL - database 以及 table 的增删改查 MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这 ...
- 【node】Sequelize常用操作、基本增删改查
[node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...
- Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统
/******************************************************************** * 标题:C语言链接mysql数据库,实现可以增删改查的角色 ...
最新文章
- LeetCode 402. 移掉K位数字 中等难度
- 【转】异步编程:.NET 4.5 基于任务的异步编程模型(TAP)
- 交流适配器行业调研报告 - 市场现状分析与发展前景预测
- VC6.0 操作Excel表格
- ”在禁用UAC时,无法激活此应用“问题
- 【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
- 【C++】使用类来模拟string
- C#爬虫 音娱吉他文本和弦谱
- linux如何运行jar包、查看jar包进程、停止jar包
- JDK1.8.0_181安装以及环境配置教程(Win10系统)
- HashMap为什么用链表加红黑树?目的是什么?原理是什么
- 电力系统微网故障检测数据集及代码python
- 健忘的业余编程菜鸟在这里安窝
- “柏域信息”再获“国家高新技术企业”称号
- Linux操作系统及其发行版本
- 今天来聊一下,俞敏洪把
- 当下的个人站长都用哪些模板做网站呢?
- 【高数】高数第四章节——不定积分换元积分分部积分
- win7共享打印机设置_win7共享打印机设置
- Shell练习题(五)