当前位置:   article > 正文

数据库学习——SQL之SELECT查询语句_sql select

sql select

SELECT的基本使用

SELECT 指定列/*
FROM 表名;
  • 1
  • 2

Tips:

一般情况下,最好不要使用通配符‘*’。

虽然*节省输入查询语句的时间,但降低查询和所使用的应用程序的效率。

通配符的优势是:当不知道所需要的列的名称时,可以通过它获取它们。

在生产环境下,不推荐你直接使用 SELECT * 进行查询

列的别名

SELECT last_name AS name, commission_pct comm
FROM employees;
SELECT last_name "Name", salary*12 "Annual Salary" 
FROM employees;
  • 1
  • 2
  • 3
  • 4

重命名一个列,可(不)使用AS,可(不)使用双引号

去除重复行

SELECT DISTINCT depatment
FROM employees;
  • 1
  • 2

空值

  • 所有运算符或者列值遇到null值,运算结果都是null
  • MySQL中,空值!=字符串,空字符串的长度是0,控制的长度为空。MySQL中,空值占用空间。

着重号

#错误
SELECT * FROM ORDER;
#正确
SELECT * FROM `ORDER`;
  • 1
  • 2
  • 3
  • 4

使用着重号防止表中的字段、表名等和保留字、数据库系统或常用方法冲突

显示表的结构

DESCRIBE employees;DESC employees;
+----------------+-------------+------+-----+---------+-------+
| Field          |        Type | Null | Key | Default | Extra | 
+----------------+-------------+------+-----+---------+-------+
| employee_id    |      int(6) |   NO | PRI |       0 |       | 
| first_name     | varchar(20) |  YES |     |    NULL |       | 
+----------------+-------------+------+-----+---------+-------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

各字段的含义:

  • Field:字段名称
  • Type:字段类型
  • Null:表示该列是否可以存储NULL值
  • Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次
  • Default:表示该列是否有默认值,如果有,那么值是多少。
  • Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。

运算符

算术运算符

+ - * / %

mysql> select 1+2;
+-----+
| 1+2 |
+-----+
|   3 |
+-----+
1 row in set (0.01 sec)

mysql> select 1/2;
+--------+
| 1/2    |
+--------+
| 0.5000 |
+--------+
1 row in set (0.00 sec)

mysql> select '5a'+2;  -- a=1
+--------+
| '5a'+2 |
+--------+
|      7 |
+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select 'a5'+2; -- a=0
+--------+
| 'a5'+2 |
+--------+
|      2 |
+--------+
1 row in set, 1 warning (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

比较运算符

= !=/<> < > <= >=

  • in或者not in

    in用于判断某个列的取值是否为指定的值,使用in运算符时指定的值是离散的数据,不是连续值

select * from tb_student where age in(18,28,15)
含义是 age=18 or age=28 or age=15
select * from tb_student where age not in(18,28,15)
含义是 age!=18 and age!=28 and age!=15
  • 1
  • 2
  • 3
  • 4
  • between and

    用于判断数据是否在指定的范围内,连续值

select * from tb_student where score between 60 and 85;
  • 1
  • like/not like

    主要针对字符串类型数据进行模糊查询,通配符_和%

select * from tb_student where name not like '张%';
  • 1
  • is null/is not null

逻辑运算符

语法说明
&&或anda and b或者 a && b逻辑与,a和b都为true,则为true
||或者ora || b或者 a or b逻辑或,一个为true,则为true
not或者!not a或者!a逻辑非
mysql> SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL; 
+----------+---------+------------+------------+
| 1 AND -1 | 0 AND 1 | 0 AND NULL | 1 AND NULL | 
+----------+---------+------------+------------+
|        1 |       0 |          0 |       NULL | 
+----------+---------+------------+------------+
1 row in set (0.00 sec)

mysql> SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL; 
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 0 | 1 OR NULL | 0 || NULL | NULL || NULL | 
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL | 
+---------+--------+-----------+-----------+--------------+
1 row in set, 2 warnings (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

位运算符

& | ^ ~ >> <<

运算符的优先级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXpzP6aI-1651221695715)(C:\Users\pon18\AppData\Roaming\Typora\typora-user-images\image-20220429110933555.png)]

正则表达式查询

五类聚集函数

聚集函数用于对一个集合中的数据进行处理,不是一行一行的数据

count统计行数 sum求和 max最大值 min最小值 avg平均值

count计数

语法:count([all/distinct] 列名称)

select count(*) from tb_student; 

select count(1) from tb_student; 

select count(distinct dept) from tb_student; -- 获取系的个数 
mysql> select * from tb_student; 

select count(dept) from tb_student; -- 进行计数统计时,null不参与统计
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

统计值

用于数值类型的列,不要用于其他类型。max min sum avg

  • max/min可以用于日期类型比较,最新的日期最大
mysql> select max(age) from tb_student; 
+----------+ 
| max(age) | 
+----------+ 
|       19 | 
+----------+ 
1 row in set (0.00 sec) 

mysql> select min(age) from tb_student;
+----------+ 
| min(age) | 
+----------+ 
|       16 |
+----------+ 
1 row in set (0.00 sec)

mysql> select avg(age) from tb_student; -- null值不参与计算,除非使用空值处理函数 将其转换为确定数值才可以 
+----------+ 
| avg(age) |
+----------+ 
|  16.7143 | 
+----------+ 
1 row in set (0.00 sec)

mysql> select sum(age),max(age),min(age),avg(age) from tb_student;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

分组

group by

可以使用group by子句对查询结果进行分组处理,经常会使用聚集函数

  • 如果不使用分组,聚集函数则用于处理所有查询结果数据

  • 如果使用分组,则分别作用于各个分组查询的结果数据

获取男女生的平均年龄

mysql> select sex,avg(age) from tb_student group by sex; 
+------+----------+ 
| sex  | avg(age) | 
+------+----------+ 
|    1 |  17.0000 | 
|    0 |  16.0000 | 
| NULL |  16.0000 | 
+------+----------+ 
3 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
having

可以对分组进行条件选择

需要获取人数多余2人的不同性别学生的平均年龄

  • 按照性别分组

  • 要统计的组必须人数多余2人,小于等于2人的分组不进行显示处理

select sex,avg(age) from tb_student group by sex having count(1)>2;
  • 1
having和where之间的区别

只有满足条件的数据才会输出显示

最大区别在于:作用的对象不同

  • where子句用于基表或者视图,从中选择满足条件的元组

  • having子句用于分组,从多个分组中选择满足条件的分组

排序

ORDER BY
  • 1
SELECT 指定列
FROM 表名
ORDER BY 某一列 ASC[升序]/DESC[降序]
#ORDER BY 在SELECT 语句的结尾
#多列排序,按顺序以此排列
  • 1
  • 2
  • 3
  • 4
  • 5

分页

LIMIT[位置位移量] 行数
  • 1
-- 前10条记录: 
SELECT * FROM 表名 LIMIT 0,10; 
或者SELECT * FROM 表名 LIMIT 10;
-- 第11至20条记录: 
SELECT * FROM 表名 LIMIT 10,10;
-- 第21至30条记录: 
SELECT * FROM 表名 LIMIT 20,10;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/189078
推荐阅读
相关标签
  

闽ICP备14008679号