一 MySQL 关系型数据库

7.1数据库表的基本结构

关系结构数据库是以表格(Table)进行数据存储,表格由“行和“列”组成。

执查询语句返回的结果集是一张虚拟表

7.1.1基本查询:     SELECT 列名   FROM 表名

1、查询部分列(姓名,学号)  SELECT name,num  FROM students        

2、查询全部列(所有属性)    SELECT * FROM students 

注意:工作环境下,优先使用列名查询。* 的方式需转换成全列名,效率低,可读性差。

7.2对列中数据进行运算

+       -        *         /

例1、SELECT ID,NAME,salary*12 FROM t_employees;   

SELECT ID AS'编号’,NAME AS'姓氏’,salary*12 AS' 年薪’ FROM t_employees;

SELECT DISTINCT manager id FROM t_employees;     DISTINCT 去除重复,查询管理者人数

7.3排序查询

语法:SELECT 列名 FROM 表名 ORDER BY  排序列[排序规则]

ASC升序      DESC降序

按工资从小到大排序:  SELECT ID,salary FROM t_employees ORDER BY salary ASC;

多条件排序:   SELECT ID,salary FROM t_employees ORDER BY salary DESC,ID  DESC;(工资降序,ID升序)     先按照第一个ORDER BY执行,然后再执行第二个

7.4 条件查询

语法:SELECT 列名 FROM 表名 WHERE 条件

7.4.1 等值判断(=)     前后相等

查询工资为11000的员工信息: 

SELECT EMPLOYEE_ ID,FIRST_NAME,salary

FROM t_employees 

WHERE salary =11000;

7.4.2 逻辑判断(AND  OR   NOT)

SELECT EMPLOYEE_ ID,FIRST_NAME,salary

FROM t_employees 

WHERE salary =11000 AND COMMISSION_PCT=0.30;

7.4.3 不等值判断(>、<、>=、<=、‘!=、<>’)

SELECT EMPLOYEE_ ID,FIRST_NAME,salary

FROM t_employees 

WHERE salary != 11000 ;

                    WHERE salary <> 11000 ;

                    WHERE salary >= 6000 AND  salary <= 11000; 

7.4.4 区间判断(between and)

SELECT EMPLOYEE_ ID,FIRST_NAME,salary

FROM t_employees 

WHERE salary BETWEEN  6000 AND  11000 ;    前面小值,后面大值

7.4.5 NULL值判断(IS NULL  、 IS NOT NULL)

SELECT EMPLOYEE_ ID,FIRST_NAME,salary

FROM t_employees 

WHERE commission_pct IS NULL ;     不能用   ‘= NULL’

7.4.6 枚举查询(IN(值1,值2,值3))

#查询部门编号为70、80、90的员工信息(编号,名字,薪资,部门编号)

SELECT employee_id,first_name,salary,department_id

 FROM t_employees 

WHERE department_id IN(70,80,90);  注:in的查询效率较低,可通过多条件拼接。

7.4.7 模糊查询(LIKE)

#查询名字以“L“开头的员工信息(编号,名字,薪资,部门编号)

SELECT employee_id,first_name,salary,department_id FROM t_employees 

WHERE first_name LIKE ‘L%’

#查询名字以“L“开头并且长度为4的员工信息(编号,名字,薪资,部门编号)

SELECT employeeid,first_name,salary,department_id FROM t_employees 

WHERE first_name LIKE 'L___'; (3个下划线)

7.4.8 分支结构查询

CASE

        WHEN 条件1 THEN 结果1

        WHEN 条件2 THEN 结果2

        ELSE 结果

END

#查询员工信息(编号,名字,薪资,薪资级别<对应条件表达式生成>)

SELECT employee_id,first_name,salary,department_id,

CASE 

                WHEN salary >=10000 THEN 'A'

                WHEN salary>=8000  AND salary < 10000 THEN 'B'

                WHEN salary>=6000  AND salary < 8000 THEN 'C'

                WHEN salary>=4000  AND salary < 6000 THEN 'D'

                ELSE 'E'

END AS  "薪资级别"

FROM  t_employees;              CASE...END 会生成一个独立的列, AS 将其命名

7.5 时间查询

执行时间查询函数,会自动生成一张虚拟表(1行1列)

#当前系统时间                        SELECT SYSDATE();

#当前系统日期                        SELECT CURDATE();

#当前系统时间                        SELECT CURTIME();

#获取指定日期为一年中的第几周            SELECT WEEK(SYSDATE());

#获取指定日期中的年份                           SELECT YEAR('2020-4-1');

#获取小时值                                            SELECT HOUR(CURTIME());

#获取分钟值                                            SELECT MINUTE(CURTIME());

#指定日期之间的相隔天数                      SELECT DATEDIFF('2020-4-1','2019-4-1');

#计算Date日期加上N天后的日期            SELECT ADDDATE('2020-4-1',4);

7.6 字符串查询

1.多个字符串拼接   SELECT CONCAT('MY','S','QL')

SELECT CONCAT(FIRST NAME,LAST NAE)AS'姓名’ FROM t_employees;

2.字符串替换

SELECT INSERT('这是一个数据库,3,2,MySQL'); # 参数3为开始位置,参数2为len长度

执行结果:这是MYSQL数据库

3.字符串转换大小写

SELECT LOWER('MYSQL');     结果: mysql

SELECT UPPER('mysql');         结果:   MYSQL

4.指定内容截取

SELECT SUBSTRING('JavaMySQLOracle',5,5);   执行结果:MySQL  从5位置开始向后截5个

7.7 聚合函数  自动忽略NULL值,不进行统计

SUM()     AVG()     MAX()     MIN()      COUNT()求总行数

SELECT SUM(salary)FROM t_employees;   #求单列所有数据的和

SELECT AVG(salary)FROM t_employees;  #求单列所有数据的平均值

7.8分组查询 GROUP BY  

在WHERE之后生效

#查询各部门的总人数

SELECT department_ID,COUNT(EMPLOYEE_ID)

FROM t_employees GROUP BY DEPARTMENT_ID;

#查询各部门的平均薪资

SELECT department_ID,AVG (salary)

FROM t_employees GROUP BY DEPARTMENT_ID;

# 查询各个部门,各岗位的人数

SELECT DEPARTMENT_ID,JOB_ID,COUNT(EMPLOYEE_ID)

FROM t_employees GROUP BY DEPARTMENT_ID, job_id;

分组查询中,select显示的列只能是分组依据列,或者聚合函数列,不能出现其他列。

7.9 分组过滤查询      'HAVING 过滤规则'

语法:SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组列 HAVING 过滤规则

# 统计部门为60,70,90的最高工资

SELECT DEPARTMENT_ID,MAX(salary)

FROM t_employees GROUP BY DEPARTMENT_ID HAVING DEPARTMENT_ID IN(60,70,90);

7.10 限定查询      'LIMIT 起始行,查询行数'

#查询前五条

SELECT * FROM t_employees LIMIT  0,5;

·注意:起始行是从0开始,代表了第一行。第二个参数代表的是从指定行开始查询几行

典型应用

分页查询,一页显示10条,一共查询3页

SELECT * FROM t_employees LIMIT  0,10;

SELECT * FROM t_employees LIMIT  10,10;

SELECT * FROM t_employees LIMIT  20,10;

7.11 查询总结

1. 语句编写顺序

SELECT 列名 FROM 表名 WHERE 条件

GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列(asc|desc) LIMIT 起始行,总条数

2. 执行顺序

1.    FROM:指定数据来源表

2.    WHERE:对查询数据做第一次过滤

3.    GROUP BY:分组

4.    HAVING:对分组后的数据第二次过滤

5.    SELECT:查询各字段的值

6.    ORDER BY:排序

7.    LIMIT:限定查询结果

参考: 数据库知识整理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。