MySQL的SELECT查询初

表的增删改查

1.创建一个表


CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);

2.插入操作

语句:INSERT [INTO] table_name[(column [, column] …)]VALUES (value_list) [, (value_list)]

  • 插入一行数据+全列插入
insert into students   values
(1,2322,'SMITH',NULL);
  • 插入多行数据+全列插入
insert into students values 
(2,1111,'JOb',NULL),
(3,3333,'Tome',NULL),
(4,4444,'BiBo',NULL);

结果:

SELECT *FROM students;
+----+------+-------+------+
| id | sn   | name  | qq   |
+----+------+-------+------+
|  1 | 2322 | SMITH | NULL |
|  2 | 1111 | JOb   | NULL |
|  3 | 3333 | Tome  | NULL |
|  4 | 4444 | BiBo  | NULL |
+----+------+-------+------+



  • 多行数据 + 指定列插入
insert into students(id ,sn,name) values
(5,5555,'Ewa'),
(6,666,'JIEMI');

结果:
SELECT *FROM students;
+----+------+-------+------+
| id | sn   | name  | qq   |
+----+------+-------+------+
|  1 | 2322 | SMITH | NULL |
|  2 | 1111 | JOb   | NULL |
|  3 | 3333 | Tome  | NULL |
|  4 | 4444 | BiBo  | NULL |
|  5 | 5555 | Ewa   | NULL |
|  6 |  666 | JIEMI | NULL |
+----+------+-------+------+


  • 插入是否更新的问题

由于 主键 或者 唯一键 对应的值已经存在而导致插入失败

主键冲突:


insert into students(id,sn,name)values
(1,3332,'REPEATE');

结果:

Duplicate entry '1' for key 'PRIMARY'

唯一键冲突:

insert into students(sn,name)values
(666,'BenJmin');


结果:

Duplicate entry '666' for key 'sn'

使用同步更新:

INSERT … ON DUPLICATE KEY UPDATE
column = value [, column = value]

主键更新:
insert into students(id,sn,name)values
(1,3332,'REPEATE') on duplicate key update id=1,name='REPEATE';

select *from students;

唯一键的更新:
insert into students(id ,sn,name)values
(8,666,'BenJmin') on duplicate key update sn=666,NAME='BIEJIMIN';

SELECT*FROM students;

替换:

  • 主键 或者 唯一键 没有冲突,则直接插入;
  • 键 或者 唯一键 如果冲突,则删除后再插入

REPLACE INTO tablename (…,…,…) VALUES(…,…,…);

REPLACE INTO students (id ,sn,name)values(6,666,'唐大');

SELECT查询

SELECT [DISTINCT] [COLUMN,CLOMN]

[FROM TABLE_NAME]
[WHERE …]

[GROUPBY BY [COLUMN]]

[ORDER BY [DESC |ASC] ]

[limit ]

创建一个测试表

CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
yuwen float DEFAULT 0.0 COMMENT '语文成绩',
shuxue float DEFAULT 0.0 COMMENT '数学成绩',
yingyu float DEFAULT 0.0 COMMENT '英语成绩'
);

--插入测试数据
INSERT INTO exam_result (name, yuwen, shuxue, yingyu) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

SELECT 列

1.全列查询
通常情况下不建议使用 * 进行全列查询
注意事项:
– 1. 查询的列越多,意味着需要传输的数据量越大;
– 2. 可能会影响到索引的使用。

select *from exam_result;


+----+-----------+-------+--------+--------+
| id | name      | yuwen | shuxue | yingyu |
+----+-----------+-------+--------+--------+
|  1 | 唐三藏    |    67 |     98 |     56 |
|  2 | 孙悟空    |    87 |     78 |     77 |
|  3 | 猪悟能    |    88 |     98 |     90 |
|  4 | 曹孟德    |    82 |     84 |     67 |
|  5 | 刘玄德    |    55 |     85 |     45 |
|  6 | 孙权      |    70 |     73 |     78 |
|  7 | 宋公明    |    75 |     65 |     30 |
+----+-----------+-------+--------+--------+

2.指定列查询

select name ,shuxue from exam_result;

+-----------+--------+
| name      | shuxue |
+-----------+--------+
| 唐三藏    |     98 |
| 孙悟空    |     78 |
| 猪悟能    |     98 |
| 曹孟德    |     84 |
| 刘玄德    |     85 |
| 孙权      |     73 |
| 宋公明    |     65 |
+-----------+--------+

3.查询字段为表达式

表达式不包含字段
select name ,shuxue ,10 from exam_result;

+-----------+--------+----+
| name      | shuxue | 10 |
+-----------+--------+----+
| 唐三藏    |     98 | 10 |
| 孙悟空    |     78 | 10 |
| 猪悟能    |     98 | 10 |
| 曹孟德    |     84 | 10 |
| 刘玄德    |     85 | 10 |
| 孙权      |     73 | 10 |
| 宋公明    |     65 | 10 |
+-----------+--------+----+

表达式包含一个字段
select name,shuxue+10 from exam_result;
+-----------+-----------+
| name      | shuxue+10 |
+-----------+-----------+
| 唐三藏    |       108 |
| 孙悟空    |        88 |
| 猪悟能    |       108 |
| 曹孟德    |        94 |
| 刘玄德    |        95 |
| 孙权      |        83 |
| 宋公明    |        75 |
+-----------+-----------+

表达式包含多个字段字段

select name ,shuxue ,yuwen+yingyu+shuxue from exam_result;

+-----------+--------+---------------------+
| name      | shuxue | yuwen+yingyu+shuxue |
+-----------+--------+---------------------+
| 唐三藏    |     98 |                 221 |
| 孙悟空    |     78 |                 242 |
| 猪悟能    |     98 |                 276 |
| 曹孟德    |     84 |                 233 |
| 刘玄德    |     85 |                 185 |
| 孙权      |     73 |                 221 |
| 宋公明    |     65 |                 170 |
+-----------+--------+---------------------+

6.为查询结果指定别名

SELECT [COLUMN] [AS] ANME FROM TABLE_NAME;

注:AS可以省略

SELECT name,yuwen,shuxue+yingyu+yuwen as 总分 from exam_result;

+-----------+-------+--------+
| name      | yuwen | 总分   |
+-----------+-------+--------+
| 唐三藏    |    67 |    221 |
| 孙悟空    |    87 |    242 |
| 猪悟能    |    88 |    276 |
| 曹孟德    |    82 |    233 |
| 刘玄德    |    55 |    185 |
| 孙权      |    70 |    221 |
| 宋公明    |    75 |    170 |
+-----------+-------+--------+


或者

SELECT name,yuwen,shuxue+yinygyu+yuwen 总分 from exam_result;

+-----------+-------+--------+
| name      | yuwen | 总分   |
+-----------+-------+--------+
| 唐三藏    |    67 |    221 |
| 孙悟空    |    87 |    242 |
| 猪悟能    |    88 |    276 |
| 曹孟德    |    82 |    233 |
| 刘玄德    |    55 |    185 |
| 孙权      |    70 |    221 |
| 宋公明    |    75 |    170 |
+-----------+-------+--------+

7.结果去重
SELECT DISTINCT COLUMN FROM TABLE_NAME;

SELECT distinct yingyu from exam_result;

+--------+
| yingyu |
+--------+
|     56 |
|     77 |
|     90 |
|     67 |
|     45 |
|     78 |
|     30 |
+--------+

当包含多个字段是可能会有重复的,因为要只有有一个满足不重复就输出结果了

select distinct name ,shuxue from exam_result;

+-----------+--------+
| name      | shuxue |
+-----------+--------+
| 唐三藏    |     98 |
| 孙悟空    |     78 |
| 猪悟能    |     98 |
| 曹孟德    |     84 |
| 刘玄德    |     85 |
| 孙权      |     73 |
| 宋公明    |     65 |
+-----------+--------+


可以看出数学还是有重复的,所以一般包含一个字段,效果比较好。

8.WHERE 条件

运算符:

1.>, >=, <, <=

2.等于|不等于

= :等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL

<=>:等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)

!= \ <>:不等于

3.范围匹配

  • BETWEEN …AND …

是左闭右闭的区间:

例如下:
A<=X<=B;

  • IN (option, …)

如果是 option 中的任意一个,返回 TRUE(1)
就像举例子一样,只要在其中就满足条件

4.是否为空

IS NULL: 是 NULL

IS NOT NULL :不是 NULL

5.LIKE

模糊匹配。

%表示多个任意字符

select *from exam_result where name like "孙%"

+----+-----------+-------+--------+--------+
| id | name      | yuwen | shuxue | yingyu |
+----+-----------+-------+--------+--------+
|  2 | 孙悟空    |    87 |     78 |     77 |
|  6 | 孙权      |    70 |     73 |     78 |
+----+-----------+-------+--------+--------+


select *from exam_result where name like "%悟%"+----+-----------+-------+--------+--------+
| id | name      | yuwen | shuxue | yingyu |
+----+-----------+-------+--------+--------+
|  2 | 孙悟空    |    87 |     78 |     77 |
|  3 | 猪悟能    |    88 |     98 |     90 |
+----+-----------+-------+--------+--------+

_表示任意一个字符

select *from exam_result where name like "孙_";

+----+--------+-------+--------+--------+
| id | name   | yuwen | shuxue | yingyu |
+----+--------+-------+--------+--------+
|  6 | 孙权   |    70 |     73 |     78 |
+----+--------+-------+--------+--------+

逻辑运算符:
AND 多个条件必须都为 TRUE(1),结果才是 TRUE(1)

OR 任意一个条件为 TRUE(1), 结果为 TRUE(1)

NOT 条件为 TRUE(1),结果为 FALSE(0)

英语不及格的同学及英语成绩 ( < 60 )



select *from exam_result where yuwen<60;

语文成绩在 [80, 90] 分的同学及语文成绩



select *from exam_result where yuwen between 60 and 90;


+----+-----------+-------+--------+--------+
| id | name      | yuwen | shuxue | yingyu |
+----+-----------+-------+--------+--------+
|  1 | 唐三藏    |    67 |     98 |     56 |
|  2 | 孙悟空    |    87 |     78 |     77 |
|  3 | 猪悟能    |    88 |     98 |     90 |
|  4 | 曹孟德    |    82 |     84 |     67 |
|  6 | 孙权      |    70 |     73 |     78 |
|  7 | 宋公明    |    75 |     65 |     30 |
+----+-----------+-------+--------+--------+

数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩


select name,shuxue from exam_result where shuxue in (58,59 ,98,99);
+-----------+--------+
| name      | shuxue |
+-----------+--------+
| 唐三藏    |     98 |
| 猪悟能    |     98 |
+-----------+--------+



语文成绩 > 80 并且不姓孙的同学

select name,yuwen from exam_result where yuwen>80 and name not like "孙%";

+-----------+-------+
| name      | yuwen |
+-----------+-------+
| 猪悟能    |    88 |
| 曹孟德    |    82 |
+-----------+-------+

语文成绩好于英语成绩的同学

select name from exam_result where yuwen>yingyu;

+-----------+
| name      |
+-----------+
| 唐三藏    |
| 孙悟空    |
| 曹孟德    |
| 刘玄德    |
| 宋公明    |
+-----------+

孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

select *from exam_result where name like "孙%" or shuxue+yingyu+yuwen>200 and yuwen<shuxue and yingyu>80;

+----+-----------+-------+--------+--------+
| id | name      | yuwen | shuxue | yingyu |
+----+-----------+-------+--------+--------+
|  2 | 孙悟空    |    87 |     78 |     77 |
|  3 | 猪悟能    |    88 |     98 |     90 |
|  6 | 孙权      |    70 |     73 |     78 |
+----+-----------+-------+--------+--------+


NULL 的查询

select  *from exam_result where qq is null;



select *from students where qq is not null;

+-----+-------+-----------+------+
| id  | sn    | name      | qq   |
+-----+-------+-----------+------+
|   1 |  2322 | REPEATE   | NULL |
|   2 |  1111 | JOb       | NULL |
|   3 |  3333 | Tome      | NULL |
|   4 |  4444 | BiBo      | NULL |
|   5 |  5555 | Ewa       | NULL |
|   6 |   666 | 唐大      | NULL |
| 100 | 10010 | 唐大一    | NULL |
+-----+-------+-----------+------+



=不安全 ,<=>安全 
select NULL=NULL,NULL=1,NULL=0;

+-----------+--------+--------+
| NULL=NULL | NULL=1 | NULL=0 |
+-----------+--------+--------+
|      NULL |   NULL |   NULL |
+-----------+--------+--------+

SELECT NULL<=>NULL,NULL<=>1,NULL<=>0;

+-------------+----------+----------+
| NULL<=>NULL | NULL<=>1 | NULL<=>0 |
+-------------+----------+----------+
|           1 |        0 |        0 |
+-------------+----------+----------+
结果排序

– ASC 为升序(从小到大)
– DESC 为降序(从大到小)
– 默认为 ASC

SELECT … FROM table_name [WHERE …]
ORDER BY column [ASC|DESC], […];

查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

select shuxue from exam_result where name like "孙%"
or name like  "曹%" order by shuxue desc;

+--------+
| shuxue |
+--------+
|     84 |
|     78 |
|     73 |
+--------+

筛选分页结果

– 1.起始下标为 0

– 从 0 开始,筛选 n 条结果

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n;

–2. 从 s 开始,筛选 n 条结果

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT s, n;

–3. 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n OFFSET s;

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死



select *from students limit 0,3;

+----+------+---------+------+
| id | sn   | name    | qq   |
+----+------+---------+------+
|  1 | 2322 | REPEATE | NULL |
|  2 | 1111 | JOb     | NULL |
|  3 | 3333 | Tome    | NULL |
+----+------+---------+------+

--从一开始显示3行数据
select *from students limit 1,3;
+----+------+------+------+
| id | sn   | name | qq   |
+----+------+------+------+
|  2 | 1111 | JOb  | NULL |
|  3 | 3333 | Tome | NULL |
|  4 | 4444 | BiBo | NULL |
+----+------+------+------+


--从零开始显示三行

select *from  students limit 3 offset 0;
+----+------+---------+------+
| id | sn   | name    | qq   |
+----+------+---------+------+
|  1 | 2322 | REPEATE | NULL |
|  2 | 1111 | JOb     | NULL |
|  3 | 3333 | Tome    | NULL |
+----+------+---------+------+

select *from  students limit 3;

+----+------+---------+------+
| id | sn   | name    | qq   |
+----+------+---------+------+
|  1 | 2322 | REPEATE | NULL |
|  2 | 1111 | JOb     | NULL |
|  3 | 3333 | Tome    | NULL |
+----+------+---------+------+

Update

UPDATE TABLE_NAME SET COLUMN=KEY
[WHERE ]
[ORDER BY]
[LIMIT ]


将孙悟空同学的数学成绩变更为 80UPDATE exam_result set shuxue =80 where name="孙悟空";
 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70update exam_result set shuxue =60 ,yuwen=70 where name="曹孟德";

将总成绩倒数前三的 3 位同学的数学成绩加上 30select name ,shuxue+yingyu+yuwen 总分 order by 总分

 limit 3;
 
 +-----------+--------+
| name      | 总分   |
+-----------+--------+
| 猪悟能    |    276 |
| 孙悟空    |    244 |
| 唐三藏    |    221 |
+-----------+--------+
 
 
 ---更新数据
 update exam_result set shuxue=shuxue+30 order by shuxue+yingyu+yuwen limit 3;
 
 
 
 select name ,shuxue,yuwen+shuxue+yingyu 总分 from exam_result where name in (  "猪悟能","孙悟空","唐三藏");
 +-----------+--------+--------+
| name      | shuxue | 总分   |
+-----------+--------+--------+
| 唐三藏    |     98 |    221 |
| 孙悟空    |     80 |    244 |
| 猪悟能    |     98 |    276 |
+-----------+--------+--------+

  • 将所有同学的语文成绩更新为原来的 2 倍
select *from exam_result; 

update exam_result set yuwen=yuwen*2 ;

select *from exam_result; 

Delete

删除数据

删除一整条的数据

DELETE FROM table_name [WHERE …] [ORDER BY …] [LIMIT …]

–从哪儿删除from

删除孙悟空同学的考试成绩

delete from exam_result where name='孙悟空';


select *from exam_result;




删除整张表数据
注意:删除整表操作要慎用

1.
delete from table_name ;


2.
drop table table_name;


两种方式都可以

截断表

删除表中的所有数据,但是表还在。

和delete from table_name;

效果一样都是删除整表的数据,但是delete不会将自增字段重置

TRUNCATE [TABLE] TABLE_NAME;

truncate table_name;

特性:

  • 对整表操作,所以不能向DELETE一样对数据操作
  • 因为它不对数据进行操作,所以delete更快
  • 会重置auto——increment项

delete 只是删除了数据但是不会重置auto_increment项

插入查询结果

NSERT INTO table_name [(column [, column …])] SELECT …

先创建一张和你要查入的一样格式的表
create table  testnew  like test;

插入查询的结果:
insert  into testnew  select *from test;


集合函数

函数 说明
COUNT([DISTINCT] expr) 返回查询到的数据的 数量
SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr) 返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义

数学大于60的人数
select  count(distinct shuxue) from exam_result where shuxue>60;

数学的总分数
select sum(shuxue) from  students;

总分的平均分
select name,AVG(shuxue+yingyu +yuwen) from students;

数学中的最大分
select name,MAX(shuxue) from students;

数学中的最小分
select MIN(shuxue)   from  students;
group by子句的使用



如何显示每个部门的平均工资和最高工资

select deptno, avg(sal),max(sal) from emp group by deptno;

+--------+-------------+----------+
| deptno | avg(sal)    | max(sal) |
+--------+-------------+----------+
|     10 | 2916.666667 |  5000.00 |
|     20 | 1970.833333 |  3000.00 |
|     30 | 1690.000000 |  2850.00 |
+--------+-------------+----------+

显示每个部门的每种岗位的平均工资和最低工资

select deptno,job ,avg(sal),min(sal) from emp group by
depno,job;

+--------+-----------+-------------+----------+
| deptno | job       | avg(sal)    | min(sal) |
+--------+-----------+-------------+----------+
|     10 | CLERK     | 1300.000000 |  1300.00 |
|     10 | MANAGER   | 2450.000000 |  2450.00 |
|     10 | PRESIDENT | 5000.000000 |  5000.00 |
|     20 | ANALYST   | 3000.000000 |  3000.00 |
|     20 | CLERK     |  950.000000 |   800.00 |
|     20 | MANAGER   | 2975.000000 |  2975.00 |
|     30 | MANAGER   | 2850.000000 |  2850.00 |
|     30 | SALESMAN  | 1400.000000 |  1250.00 |
+--------+-----------+-------------+----------+


显示平均工资低于2000的部门和它的平均工资

统计各个部门的平均工资

select deptno,avg(sal)from emp group deptno;

havinggroup by配合使用,对group by结果进行过滤


select deptno,avg(sal)from emp group deptno having avg(sal)<2000;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值