一、DB、DBMS、MySQL
DB,database,数据库,存储数据的仓库,它保存了一系列有组织的数据,数据库的好处:可以持久化数据到本地、结构化查询,数据库存储数据的特点:数据存放到表中,然后表再放到库中;一个库中可以有多张表,每张表具有唯一的表名用来标识自己;表中有一个或多个列,列又称为“字段”,相当于Java中的“属性”;表中的每一行数据,相当于Java中“对象”
DBMS,database management system,数据管理系统,数据库(DB)是通过DBMS创建和操作的容器,常见的数据库管理系统,MySQL Oracle Db2 SqlServer等
MySQL,是基于客户机-服务器的DBMS(C/S,客户端 / 服务端),有别于基于共享文件系统的DBMS,如Access
与DBMS(数据库管理系统)交互,使用SQL语言
二、什么是SQL
SQL ( structure query language ) ,专门与DBMS通信的语言,结构化查询语言,是一种非过程化的语言(在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的,由数据库管理系统完成),SQL,是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言
三、SQL为什么是一种非过程化的语言
这里的非过程化指的并不是编程语言里面的那个面向过程,而是数据库的Data Manipulation Language ( DML,数据操纵语言 ) 这类语言的一个分类。
DML这类语言分为两个大类,声明式(Declarative DMLs)和过程式(Procedural DMLs)。前者我们也称为非过程式的DML(Non-procedural DMLs)。两者之间的区别是,声明式的DML只需要声明我们需要什么样的数据,像是SQL就是这样的语言。而过程式DML不仅需要声明需要什么样的数据,而且需要给出如何得到数据的方法,类似的DML是relational algebra。
四、SQL是声明式的非过程语言,那么,查询是如何实现的
SQL进行数据操作时,只需要考虑做什么,不需要考虑怎么做,用户也无需了解存取路径,存取路径的选择以及SQL的操作过程由DBMS(数据库管理系统)完成
五、SQL语言的分类
1、数据查询语言DQL(Data Query Language )
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
2、数据操纵语言DML(Data Manipulation Language)
数据操纵语言DML主要有三种形式:
插入:INSERT
更新:UPDATE
删除:DELETE
3、数据定义语言DDL(Data Definition Language)
DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上
如:CREATE、ALTER、DROP
4、数据控制语言DCL(Data Control Language)
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
授权:GRANT
取消授权:REVOKE
5、事务控制语言TCL(Transaction Control Language)
保存点: SAVEPOINT
设置事务: SET TRANSACTION
提交:COMMIT
回滚:ROLLBACK
六、数据查询语言DQL(Data Query Language )
1、基础查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#进阶1:基础查询 /* 语法: select 查询列表 from 表名; 1、查询列表可以是:表中的字段、常量值、表达式、函数 2、查询的结果是一个虚拟的表格 ( 不保存 ) */ #打开数据库 USE myemployees; #1、查询表中的单个字段 SELECT last_name FROM employees; #2、查询表中的多个字段 SELECT last_name,salary,email FROM employees; #3、查询表中的所有字段 #方式一( 栏位,双击字段可以快速添加,选中代码,按F12格式化或按F9执行 ): SELECT `first_name`, # 字段两边的着重号`是区分是关键字还是字段的,可以去掉, `last_name`, `email`, `phone_number`, `job_id`, `salary`, `commission_pct`, `manager_id`, `department_id`, `hiredate` FROM employees ; # 方式二,* 代表所有字段,字段与原始表一样: SELECT * FROM employees; #4、查询常量值 SELECT 100; SELECT 'john'; #查询字符常量 #5、查询表达式 SELECT 100*98; #6、查询函数 SELECT VERSION(); #查询函数VERSION()的返回值 #7、起别名 /* 便于理解(提高可读性) 如果要查询的字段有重名的使用别名可以区分开来 */ #方式一:使用as SELECT 100%98 AS 结果; SELECT last_name AS 姓, first_name AS 名 FROM employees; #方式二:使用空格 SELECT last_name 姓, first_name 名 FROM employees; #别名含有特殊符号的要加双引号或单引号 SELECT salary AS "out put" FROM employees; #8、去重 #查询员工表中涉及的所有的部门编号 ( 去掉重复的编号用distinct ) SELECT DISTINCT department_id FROM employees; #9、+号的作用 /* java中的+号: 运算符,两个操作数都为数值型 连接符,只要一个操作数为字符串 mysql中的+号: 运算符,仅仅只有一个功能 select 100+90; #两个操作数都为数值型,则做加法运算 select '123'+90; #只要其中一个操作数为字符型,试图把字符型转为数值型, #转换成功则继续做加法运算 select 'john'+90; #转换失败则字符型数值为0,再做加法运算 select null+90; #只要其中一个操作数为null,结果为null */ #查询员工名和姓连接成一个字段并显示为姓名,使用字符连接函数concat(), #只要其中一个操作数为null,结果为null SELECT CONCAT(last_name, ' ', first_name) AS 姓名 FROM employees ; #使用ifnull()函数,避免结果为null SELECT IFNULL(`commission_pct`, 0) AS 奖金率, `commission_pct` FROM employees ; SELECT CONCAT( `first_name`, ',', `last_name`, ',', `email`, ',', IFNULL(`commission_pct`, 0) ) AS out_put FROM employees ;
2、条件查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#进阶2:条件查询 /* 语法:( 执行顺序 from/where/select ) select 查询列表 from 表名 where 筛选条件(结果是true或false); 分类: 一、按条件表达式筛选 条件运算符: > < = != <> >= <= <=> 其中 <> 与 != 相同,<=> 安全等于 二、按逻辑表达式筛选 ( 作用:是连接条件表达式的 ) 逻辑运算符: && || ! and or not 三、模糊查询 like between and in is null|is not null */ USE myemployees; #一、按条件表达式筛选 #查询工资>12000的员工的信息 SELECT * FROM employees WHERE salary > 12000 ; #查询部门编号不等于90号的员工名和部门编号 SELECT first_name, department_id FROM employees WHERE department_id <> 90 ; #二、按逻辑表达式筛选 #查询工资在10000到20000之间的员工名、工资及奖金 SELECT first_name, salary, commission_pct FROM employees WHERE salary >= 10000 AND salary <= 20000 ; #查询部门编号不是在90到110之间 或 工资高于15000的员工信息 /* select * from employees where department_id <90 or department_id > 110 or salary > 15000 ; */ SELECT * FROM employees WHERE NOT ( department_id >= 90 AND department_id <= 110 ) OR salary > 15000 ; #模糊查询 /* like 一般和通配符搭配使用 通配符: %任意多个字符包含0个字符 _任意单个字符 between and in is null|is not null */ #查询员工中包含字符a的员工信息 SELECT * FROM employees WHERE first_name LIKE '%a%' ; #查询员工中第三个字符为e,第五个字符为a的员工和工资 SELECT first_name, salary FROM employees WHERE first_name LIKE '__e_a%' ; #查询员工姓名中第二个字符为_的员工姓名 /*select last_name from employees where last_name like '_\_%' ; #使用转义字符 */ SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$' ; # ESCAPE 定义转义字符 #查询员工编号在100到120之间的员工信息 SELECT * FROM employees WHERE employee_id >= 100 AND employee_id <= 120 ; #查询员工部门号第一个数字为1的员工信息,like 可以查询数值型的字段 SELECT * FROM employees WHERE department_id LIKE '1__' ; #between and 提高语句简洁度,包含临界值如下的100 120,两个临界值不调换顺序 SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120 ; #查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号 SELECT first_name, job_id FROM employees WHERE job_id = 'IT_PROT' OR job_id = 'AD_VP' OR job_id = 'AD_PRES' ; #IN 判断某个字段的值是否属于in列表中的某一项 #比使用or提高语句简洁度,in类别的值类型必须一致或兼容,不支持通配符 SELECT first_name, job_id FROM employees WHERE job_id IN ('IT_PROT', 'AD_VP', 'AD_PRES') ; #查询没有奖金的员工名和奖金率 /* = 或 <> 不能判断 null is null或is not null 可以判断null值 */ SELECT first_name, commission_pct FROM employees WHERE commission_pct IS NULL ; # 没有奖金 WHERE commission_pct IS NOT NULL ; #安全等于 <=> ,可读性不好 SELECT first_name, commission_pct FROM employees WHERE commission_pct <=> NULL ; #is null #奖金等于12000的员工名 SELECT first_name, salary FROM employees WHERE salary <=> 12000 ; # is null 仅仅可以判断null值,可读性高,建议使用 # <=> 即可以判断null值,又可以判断普通的数值,可读性较低 #查询员工号为176的员工的姓名和部门和年薪 SELECT first_name, department_id, salary * 12 *(1+ IFNULL(commission_pct, 0)) AS 年薪 FROM employees WHERE employee_id = 176 ; #查询没有奖金,且工资小于18000的salary,last_name SELECT last_name, salary FROM employees WHERE commission_pct IS NULL AND salary < 18000 ; #查询 employee 表中,job_id 不为 'IT' 或者 工资为12000的员工的信息 SELECT * FROM employees WHERE job_id <> 'IT' OR salary = 12000 ; #查看部门 departments 表的结构 DESC departments; #查看部门departments表中涉及到了哪些位置编号 SELECT DISTINCT #distinct 去重 location_id FROM departments ; #------------------------ SELECT * FROM employees ; #如果判断的字段有null值下面语句与上面语句不一样 SELECT * FROM employees WHERE commission_pct LIKE '%%' AND last_name LIKE '%%' ;
3、排序查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#进阶3:排序查询 /* 语法: select 查询列表 from 表 【where 筛选条件】 order by 排序列表 【asc|desc】 特点: 1、asc是升序,desc是降序 如果不写,默认是升序 2、order by 子句中可以支持单个字段、多个字段、表达式、函数、别名 3、order by 子句一般放在查询语句的最后面,limit子句除外 */ #查询员工信息,要求工资从高到低排序 SELECT * FROM employees ORDER BY salary DESC ; #查询部门编号 >= 90的员工信息,按入职时间的先后进行排序 【 添加筛选条件 】 SELECT * FROM employees WHERE department_id >= 90 ORDER BY hiredate ; #按年薪的高低显示员工的信息和年薪【 按表达式排序 】 SELECT *, salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 FROM employees ORDER BY salary * 12 * (1 + IFNULL(commission_pct, 0)) DESC; #按年薪的高低显示员工的信息和年薪【 按别名排序 】 SELECT *, salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 FROM employees ORDER BY 年薪 DESC; #按姓名的长度显示员工的姓名和工资【按函数排序】 SELECT LENGTH(last_name) AS 字节长度, last_name, salary FROM employees ORDER BY LENGTH(last_name) DESC ; #查询员工信息,要求先按工资升序排序,再按员工编号降序排序【按多个字段排序】 SELECT * FROM employees ORDER BY salary ASC, employee_id DESC ; #查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序 SELECT last_name, department_id, salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 FROM employees ORDER BY 年薪 DESC, last_name ASC ; #选择工资不在8000到17000的员工的姓名和工资,按工资降序 SELECT last_name, salary FROM employees WHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary ASC ; #查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序 SELECT * FROM employees WHERE email LIKE '%e%' ORDER BY LENGTH(email) DESC, department_id ASC ;
4、函数查询