MySQL数据库语法(四-->表的查询)

数据库表的查询

SELECT语句:
SELECT {*, column [alias],...}
FROM table;

说明:
–SELECT列名列表。*表示所有列。
–FROM 提供数据源(表名/视图名)
–默认选择所有行
定义字段的别名:
改变列的标题头
用于表示计算结果的含义
作为列的别名
如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都可以通过为别名添加加双引号实现。
    SELECT last_name as “姓名”, salary “薪水”
    FROM employees;
    
    SELECT last_name, salary*12 “年薪”
    FROM employees;
重复记录:
缺省情况下查询显示所有行,包括重复行
    SELECT department_id
    FROM employees;
    
使用DISTINCT关键字可从查询结果中清除重复行
    SELECT DISTINCT department_id
    FROM employees;
    
DISTINCT的作用范围是后面所有字段的组合
    SELECT DISTINCT department_id , job_id
    FROM employees;
使用WHERE子句限定返回的记录
WHERE子句在FROM 子句后
	SELECT[DISTINCT] {*, column [alias], ...}
	FROM table–[WHEREcondition(s)];
	
WHERE中的字符串和日期值
字符串和日期要用单引号扩起来
字符串是大小写敏感的,日期值是格式敏感的
    SELECT last_name, job_id, department_id
    FROM employees
    WHERE last_name = "king";
    
    
WHERE中比较运算符:
    SELECT last_name, salary, commission_pct
    FROM employees
    WHERE salary<=1500;    
    
其他比较运算符
使用BETWEEN运算符显示某一值域范围的记录
    SELECTlast_name, salary
    FROM employees
    WHERE salary BETWEEN 1000 AND 1500; 
    
使用IN运算符
使用IN运算符获得匹配列表值的记录
    SELECTemployee_id, last_name, salary, manager_id
    FROM employees
    WHERE manager_id IN (7902, 7566, 7788);
    
使用LIKE运算符
  使用LIKE运算符执行模糊查询   #也有可能让索引失效;
  查询条件可包含文字字符或数字
  (%) 可表示零或多个字符
  ( _ ) 可表示一个字符
    SELECT last_name
    FROM employees
    WHERE last_name LIKE '_A%';
    
使用IS NULL运算符
  查询包含空值的记录
      SELECT last_name, manager_id
      FROM employees
      WHERE manager_id IS NULL;
  
  
  逻辑运算符
  使用AND运算符
    AND需要所有条件都是满足T.
    
    SELECT employee_id, last_name, job_id, salary
    FROM employees
    WHERE salary>=1100–4 AND job_id='CLERK';
  使用OR运算符
    OR只要两个条件满足一个就可以
  
    SELECT employee_id, last_name, job_id, salary
    FROM employees
    WHERE salary>=1100 OR job_id='CLERK';
  使用NOT运算符
    NOT是取反的意思
    	SELECT last_name, job_id
        FROM employees
        WHERE job_id NOT IN ('CLERK','MANAGER','ANALYST');
        少用,会失去索引功能,在大量数据下;
        
        
  使用正则表达式:REGEXP
  	<列名> regexp '正则表达式'
  	select * from product where product_name regexp '^2018';
  	
  
  数据分组--GROUP BY
  GROUP BY子句的真正作用在于与各种聚合函数配合使用。它用来对查询出来的数据进行分组。
    分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。
    分组函数忽略空值,。
    结果集隐式按升序排列,如果需要改变排序方式可以使用Order by 子句。
    SELECT column, group_function
    FROM table
    [WHERE condition]
    [GROUP BY group_by_expression]
    [ORDER BY column];
    #每个部门的平均工资
    SELECT deptno,AVG(sal) FROM TB_EMP GROUP BY deptno
   
   #查每个部门的整体工资情况
    #如果select语句中的列未使用组函数,那么它必须出现在GROUP BY子句中
    #而出现在GROUP BY子句中的列,不一定要出现在select语句中
    SELECT deptno,AVG(sal),MAX(sal),MIN(sal),SUM(sal),COUNT(1)
    FROM TB_EMP
    GROUP BY deptno #根据部门编号分组
    #每个部门每个职位的平均工资
    SELECT deptno,job,AVG(sal) FROM TB_EMP GROUP BY deptno,job
    
    分组函数重要规则
    如果使用了分组函数,或者使用GROUP BY 的查询:出现在SELECT列表中的字段,要么出现在组合函数里,
    要么出现在GROUP BY 子句中。
    GROUP BY 子句的字段可以不出现在SELECT列表当中。
    使用集合函数可以不使用GROUP BY子句,此时所有的查询结果作为一组。
    
 数据分组--限定组的结果:HAVING子句
    HAVING子句用来对分组后的结果再进行条件过滤。
    SELECT column, group_function
    FROM table
    [WHERE condition]
    [GROUP BY group_by_expression]
    [HAVING group_condition]
    [ORDER BYcolumn];
    HAVING子句用来对分组后的结果再进行条件过滤。
    #查询部门平均工资大于2000的
    #分组后加条件 使用having
    #where和having都是用来做条件限定的,但是having只能用在group by之后
    SELECT deptno,AVG(sal),MAX(sal),MIN(sal),SUM(sal),COUNT(1)
    FROM TB_EMP
    GROUP BY deptno
    HAVING AVG(sal) > 2000
    HAVING与WHERE的区别
    WHERE是在分组前进行条件过滤, HAVING子句是在分组后进行条件过滤,WHERE子句中不能使用聚合函数,
    HAVING子句可以使用聚合函数。
    组函数的错误用法
     不能在WHERE 子句中限制组.
     限制组必须使用HAVING 子句.
     不能在WHERE 子句中使用组函数
    补充:MySQL 多行数据合并 GROUP_CONCAT
    Syntax: GROUP_CONCAT(expr)
    示例:fruits表按s_id,将供应水果名称合并为一行数据
    mysql> select s_id,group_concat(f_name)
     -> from fruits
     -> group by s_id;
    +------+-------------------------+
    | s_id | group_concat(f_name)  |
    +------+-------------------------+
    |  101 | apple,blackberry,cherry |
    |  102 | orange,banana,grape   |
    |  103 | apricot,coconut     |
    |  104 | berry,lemon       |
    |  105 | melon,xbabay,xxtt    |
    |  106 | mango          |
    |  107 | xxxx,xbababa      |
    +------+-------------------------+
    7 rows in set (0.00 sec)
    注意:使用 GROUP_CONCAT()函数必须对源数据进行分组,否则所有数据会被合并成一行
  
   
   
对结果集排序
  查询语句执行的查询结果,数据是按插入顺序排列
  实际上需要按某列的值大小排序排列
  按某列排序采用order by 列名[desc],列名…
  设定排序列的时候可采用列名、列序号和列别名
  如果按多列排序,每列的asc,desc必须单独设定   
  
  
联合查询
-- 中国或美国城市信息
SELECT * FROM city
WHERE countrycode IN ('CHN' ,'USA');
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'

说明:一般情况下,我们会将 IN 或者 OR 语句 改写成 UNION ALL,来提高性能
UNION   去重复
UNION ALL 不去重复

查询结果限定
在SELECT语句最后可以用LIMLT来限定查询结果返回的起始记录和总数量。MySQL特有。
SELECT … LIMIT offset_start,row_count;
offset_start:第一个返回记录行的偏移量。默认为0.
row_count:要返回记录行的最大数目。
例子:
SELECT * FROM TB_EMP LIMIT 5;/*检索前5个记录*/
SELECT * FROM TB_EMP LIMIT 5,10;/*检索记录行6-15*/


MySQL中的通配符:
MySQL中的常用统配符有三个:
   %:用来表示任意多个字符,包含0个字符
   _ : 用来表示任意单个字符
   escape:用来转义特定字符
   
创建数据表grade:

CREATE TABLE grade(
    id INT NOT NULL,
    sex CHAR(1),
    firstname VARCHAR(20) NOT NULL,
    lastname VARCHAR(20) NOT NULL,
    english FLOAT,
    math FLOAT,
    chinese FLOAT
);

向数据表grade中插入几条数据:

INSERT INTO grade
VALUES (1,'m','John','Smith',88.0,85.0,82.0),
(2,'f','Adam','Smith',76.0,78.0,90.0),
(3,'m','Allen','William',88.0,92.0,95.0),
(4,'m','George','William',62.0,58.0,72.0),
(5,'f','Alice','Davis',89.0,94.0,98.0),
(6,'m','Kevin','Miller',77.0,88.0,99.0),
(7,'f','Helen','Davis',79.0,83.0,91.0),
(8,'m','Andrew','Johnson',81.0,86.0,88.0);  

1、查询所有字段
2、查询grade表中的id,firstname,lastname字段
3、查询grade表中id大于4的学生姓名
4、查询grade表中女生的记录
5、查询grade表中id值为2,4,6的学生记录
6、查询grade表中math成绩在85到94之间的记录
7、查询grade表中firstname以A开头的记录
8、查询grade表中firstname以A开头以e结尾的记录
9、查询grade表中firstname包含l的记录
10、查询grade表中firstname以A开头后面有4个字符的记录
11、查询grade表中english在80到90之间的记录
12、查询grade表中math大于90 或者 chinese大于90的记录
13、查询grade表中id不是1、3、5、7的记录
14、查询grade表中的性别有哪些
15、查询grade表中的lastname有哪几种
16、求出表中所有记录的条数
17、求出表中英语成绩的80的记录的条数
18、计算所有学生的数学成绩的和
19、计算女生的数学成绩的和
20、计算英语成绩平均分
21、计算男生的英语成绩平均分
22、求出数学成绩的最高分
23、求出男生中的数学最高分
24、按照math成绩的升序进行排列
25、按照sex字段的升序和chinese字段的降序排列
26、查询数据表grade中的记录,按照sex字段进行分组
27、将grade表按照lastname字段值分组,并计算每个分组中的学生数
28、对grade表按照lastname字段分组,查出math字段和小于100的组
29、查询grade表中的第3到第6条记录
30、查询grade表中男生平均成绩(三科)大于85的记录

1、查询所有字段

select * from grade;或者
desc grade;

2、查询grade表中的id,firstname,lastname字段

3、查询grade表中id大于4的学生姓名

4、查询grade表中女生的记录

5、查询grade表中id值为2,4,6的学生记录

6、查询grade表中math成绩在85到94之间的记录

7、查询grade表中firstname以A开头的记录

8、查询grade表中firstname以A开头以e结尾的记录

9、查询grade表中firstname包含l的记录

10、查询grade表中firstname以A开头后面有4个字符的记录

11、查询grade表中english在80到90之间的记录

12、查询grade表中math大于90 或者 chinese大于90的记录

13、查询grade表中id不是1、3、5、7的记录

14、查询grade表中的性别有哪些

15、查询grade表中的lastname有哪几种

16、求出表中所有记录的条数

17、求出表中英语成绩的80的记录的条数

18、计算所有学生的数学成绩的和

19、计算女生的数学成绩的和

20、计算英语成绩平均分

21、计算男生的英语成绩平均分

22、求出数学成绩的最高分

23、求出男生中的数学最高分

24、按照math成绩的升序进行排列

25、按照sex字段的升序和chinese字段的降序排列

26、查询数据表grade中的记录,按照sex字段进行分组

27、将grade表按照lastname字段值分组,并计算每个分组中的学生数

28、对grade表按照lastname字段分组,查出math字段和小于100的组

29、查询grade表中的第3到第6条记录

30、查询grade表中男生平均成绩(三科)大于85的记录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

duoba_an

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值