SQL(Structured Query Language - 称为结构化查询语言)
- 结构化查询语言简称SQL, 是一种专门设计用于操作关系型数据库的编程语言。
- 我们使用SQL的主要目的是对关系型数据库进行数据的查询、修改等管理性的操作 。SQL语言适用于所有的关系型数据库。
简单的查询
语法: select 字段名1,字段名2… from 表名;
书写查询语句的思路:
首先明确查询哪张表,然后确定查询表的哪些字段的信息。
我们学习使用的表名: employees
- 查询多个字段
例: 查询员工表的编号、员工名字、姓氏、员工工资
select
employee_id,first_name,last_name,salary
from employees;
- 查询所有的字段
例: 查询员工表所有字段的信息
第一种方式:显示的写出所有字段名。
select
employee_id,first_name,last_name,email,phone_number,hire_date,salary,job_id,commission_pct,manager_id,department_id
from employees;
第二种方式:使用通配符 * 代替所有字段
select * from employees;
注意: Oracle数据库在执行SQL语句的时候, 会将 * 进行一次字段实际内容的转换,然后再执行。所以 * 的方式不建议在开发中使用, 因为执行效率低。
SQL语句关键字的书写语法上不区分大小写, 但是Oracle数据库在执行的时候,会将关键字转成大写执行。
- 查询员工的编号、姓、名、员工的年薪 // 要对查询结果进行算数运算
select employee_id,first_name,last_name,salary*12 from employees;
注意: Oracle允许对数值类型的字段进行 + - * /的运算,不能做模运算(%),如果需要做模运算必须使用Oracle中的函数完成。 % 是Oracle中的特殊符号。
日期类型字段只能做+ -算数运算,单位是天。
- 给字段起别名
select
employee_id as "员工编号",first_name as "名",last_name as "姓",salary*12 as "年薪"
from employees;
注意: 对于字段起别名的操作, 别名可以使用英文的双引号,也可以不使用双引号。 如果别名是英文字符,那么加上双引号严格区分大小写, 不加双引号则不区分大小写。 中文加不加都一样。
- 查询员工的编号、姓、名、工资 , 要求姓名展示为 Steven_King; Oracle 中的字符串拼接,Oracle中用 || 进行字符串拼接,拼接的其他内容使用英文的单引号。
select
employee_id,first_name||'_'||last_name,salary
from employees;
排序查询 - order by
语法: select 字段1,字段2… from 表名 order by 条件字段 排序规则;
说明:
条件字段: 是指根据哪个字段进行排序后展示。
排序规则: 升序/降序(asc【默认】/desc)
例:
- 查询员工表所有的信息,按照工资的升序展示
select * from employees order by salary asc;
- 查询员工表所有的信息,按照工资的降序展示
select * from employees order by salary desc;
- 查询员工表所有的信息,首先按照工资降序展示,如果工资相同按照编号的升序展示
select * from employees order by salary desc,employee_id asc;
**注意:**如果不书写排序规则关键字,默认升序。 在进行多字段排序时,排序规则的关键字作用域前面的字段。
条件查询 - where 【重点】
语法: select 字段1,字段2… from 表名 where 条件 order by …;
说明: 条件这里指定的是一个运算结果为boolean值的条件。
- 等值查询 : = !=(<>)
-查询工资是24000的员工信息
select * from employees where salary=24000;
-查询first_name是 Steven的员工信息
select * from employees where first_name=’Steven’; // 注意字符串条件值,
需要使用英文的单引号。条件的内容严格区分大小写。
-查询员工工资不是24000的人员信息
select * from employees where salary != 24000;
或
select * from employees where salary <> 24000;
- 关系比较运算查询 > >= < <=
查询工资大于8000的
select * from employees where salary<8000;
- 逻辑运算查询 and(并且) or(或者)
-查询工资大于8000 小于12000的员工信息
select * from employees where salary>8000 and salary<12000;
-查询工资大于等于8000 小于等于12000的员工信息
select * from employees where salary>=8000 and salary<=12000;
-查询工资为24000的员工或者first_name是peter 的员工信息
select * from employees where salary=24000 or first_name=’Peter’;
- 区间查询 between … and 【了解】
语法: select 字段1,字段2… from 表名 where 字段名 between 值1 and 值2;
-查询工资大于等于8000 小于等于12000的员工信息
select * from employees where salary between 8000 and 12000;// 包含边界值
注意: 建议大家在做这种区间查询的时候优先选择 and 运算符方式。
- 枚举查询 in
语法: select 字段1,字段2… from 表名 where 字段名 in (值1,值2…)
-查询工资是24000 、12000、8000的员工的信息
select * from employees where salary=24000 or salary=12000 or salary=8000;
用枚举查询实现:
select * from employees where salary in (24000,12000,8000) ;
注意: in 里面的值最多不能超过1000个。
- 模糊查询 【很重要】
语法: **select 字段1,字段2… from 表名 where 字段 like 条件值 order by …; **
说明:
条件值里面有几个占位符: _ 匹配一个字符。 % 匹配0到n个字符。
-查询first_name是由5个字符组成的人员信息
select * from employees
where first_name like ‘_____’;
-查询first_name是以大写的D 开头的人员信息
select * from employees
where first_name like ‘D%’;
-查询first_name是以大写的D 开头并且由5个字符组成的人员信息
select * from employees
where first_name like ‘D____’;
-查询first_name中包含字母a 的人员信息
-查询first_name中不包含字母a 的人员信息
select * from employees where first_name not like ‘%a%’;
- Oracle中对null值的处理
-查询员工信息,按照提成的降序排列
select * from employees order by commission_pct desc;
这条SQL语句语法没有问题,但是不能拿到我们想要的结果。 原因是Oracle中null值最大。
使用nvl函数解决上面的问题:
nvl函数类似于三元运算符的作用,比如:
nvl(值1,值2) 当值1为null的时候,返回值2。当值1不为null的时候,返回值1.
select * from employees order by nvl(commission_pct,0) desc;
-查询没有提成的员工信息
select * from employees where commission_pct is null;
查询当前系统的时间
单行函数 - 日期处理函数【掌握】
-查询今天是星期几
- to_char(…) : 将日期类型转换成指定的字符串格式展示。
1.1 日期格式的字符
yyyy - 年
mm -月
dd - 日
hh - 时
mi - 分
ss - 秒
day - 星期
1.2 to_char的使用: to_char(日期类型参数, 代表日期格式的字符参数 )
-查询今天是星期几
select to_char(sysdate,’day’) from dual;
- to_date(…) : 将一个字符串转换成Oracle数据库的日期类型。
2.1 to_date的使用: to_date(一个日期字符串,代表日期格式的字符串)
- 将一个字符串日期转换成oracle数据库的日期类型
select to_date(‘1949-10-1’,’yyyy-mm-dd’) from dual;
- 查询1949年10月1日是星期几
select to_char(to_date(‘1949-10-1’,’yyyy-mm-dd’),’day’) from dual;
注意: 函数之间可以嵌套使用。