第一章 SQL的基本语法规范
1.sql不区分大小写,但是习惯上关键字、系统保留字、函数名称大写,表名和列名小写
2.sql使用空格或者回车来分隔每个单词都一样,习惯上每个子句换行
WHERE子句中的每个条件占一行,子查询单独占一行
3.复杂的语句最好加上注释进行说明
-- 单行注释(空格必须有)
/*
多行注释
*/
4.sql语句中使用分号作为分隔符,系统读取到分号才会执行语句
/*
select 列名1,列名2,……列名n定义查询数据所在的列
from 表名1,表名2,……表名n 定义查询数据所在的表
where 限定条件1 and/or 限定条件2 ...... 定义查询数据的限定条件(行)
group by 列名1,列名2,……列名n定义分组函数的分组方式
having 分组条件1 and/or 分组条件2…… 定义分组函数结果的限定条件
order by 列名1 asc/desc,列名2 asc/desc ...... 定义查询结果的排序方式
*/
第二章 SELECT基础
1.*代表所有列
SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;
SELECT * FROM bonus;
2.查询指定的列
SELECT ename,job,sal,deptno FROM emp;
3.对查询结果进行运算
# + - * /
查询每个员工的年薪
SELECT ename,12*sal FROM emp;
#员工的年终奖定为年薪的10%再加上500
SELECT ename,(12*sal)*0.1+500 FROM emp;
4.空值参与运算得到结果也是空值
#计算员工的年收入
SELECT ename,sal,comm,12*(sal+comm) FROM emp;
5.别名
#查询结果中可以给列起别名加以说明
/*
列名 别名
列名 AS 别名
别名中如果包含特殊字符(空格),需要加双引号
双引号只会在起别名的时候出现,其他的所有地方都只能用单引号而不能用双引号
*/
SELECT ename xingming,job zhiwei FROM emp;
SELECT ename AS xingming,job AS zhiwei FROM emp;
SELECT ename 姓名,job 职位 FROM emp;
SELECT ename "xing ming",job "zhi wei" FROM emp;
#别名主要用来标识运算结果
SELECT ename,(12*sal)*0.1+500 AS nianzhongjiang FROM emp;
6.表达式
#表达式根据数据类型的不同分为数字表达式、字符表达式和日期表达式
#手动输入的表达式可以写在select后面,表中有多少行,表达式就显示多少次
#手动输入数字表达式可以直接写,日期和字符表达式必须加上单引号
SELECT 123.456,12*60*48,'I am the king' FROM emp;
#mysql允许只写select,不写from;oracle必须要写select和from,不能缺少
#如果要查询的数据都是手动输入,与表中数据无关,可以不写from
SELECT 123.456,12*60*48,'I am the king';
SELECT 'who are you',ename FROM emp;
SELECT job,'JOB' FROM emp;
#手动字符串必须加单引号,mysql在windows平台字符串不区分大小写,但是在linux区分大小写
#其他的数据库包括编程语言,字符串都要区分大小写
7.distinct去重
SELECT job FROM emp;
SELECT DISTINCT job FROM emp;
SELECT DISTINCT deptno FROM emp;
#多列去重
SELECT DISTINCT job,deptno FROM emp;
#普通列不能和去重的列同时查询,因为行数不匹配,不能组成一张表
#select ename,distinct job from emp;
8.limit分页查询
SELECT * FROM emp;
#如果在查询结果中,想要得到固定某几行的结果,使用limit
#limit 写在查询语句最后
#limit m,n 表示从第m行开始显示n行数据,第一行的行号是0
SELECT * FROM emp
LIMIT 2,5;
#limit n 表示显示前n行数据
SELECT * FROM emp
LIMIT 3;
第三章 限定和排序
1.where子句限定范围
#where子句后面必须是一个完整的逻辑表达式,结果只有两种true或者false
#在where子句中,逻辑表达式通常是比较运算,比较条件是否满足
# = > < >= <= !=(<>)
#where子句限定条件通常是用表中的某一列数据作为条件,返回满足条件的数据
#查询20号部门的员工信息
SELECT * FROM emp
WHERE deptno = 20;
#查询工资高于2000的员工信息
SELECT * FROM emp
WHERE sal > 2000;
#查询职位不是manager的员工信息
SELECT * FROM emp
WHERE job != 'MANAGER';
#手动输入字符串要加单引号,最好在匹配的时候大小写一致
#查询年薪小于20000的员工信息
#列的别名不能出现在where子句中
SELECT ename,job,sal,12*sal nianxin,deptno FROM emp
WHERE 12*sal < 20000;
#其他的数据库不支持*加上其他列一起查询,mysql允许
SELECT *,12*sal nianxin FROM emp;
#where子句中的条件也可以是两列数据相互比较
SELECT * FROM emp
WHERE sal < comm;
#where子句中作为条件的列可以不出现在select后面,但是这样的语句结果不够直观
SELECT ename,job,deptno FROM emp
WHERE sal <= 1500;
#where子句中比较运算符的两端数据类型必须一致
#如果是其他数据库,数据类型不一致时会直接报错
#mysql由于是弱数据类型的语言,所以不会报错,只是这样的语句没有意义
SELECT * FROM emp
WHERE ename > 2;
#如果没有数据满足条件,则一行数据都没有
SELECT * FROM emp
WHERE deptno > 200;
#如果有满足条件的数据,至少会返回一行,只是可能数据的值是空值
SELECT comm FROM emp
WHERE ename = 'SMITH';
2.常用的特殊比较运算
#in(value1,value,2...valueN), 列表匹配
SELECT * FROM emp
WHERE job IN ('MANAGER','CLERK','PRESIDENT');
#between 最小值 and 最大值,范围匹配,最大值和最小值的位置不能变
SELECT * FROM emp
WHERE sal BETWEEN 1500 AND 3000;
#like, 模糊匹配(对字符)
#通配符,可以匹配或者代表其他字符的特殊符号
# _ 表示1个任意字符
# % 表示任意个任意字符,包括0个1个和多个
SELECT * FROM emp
WHERE ename LIKE 'S%';
SELECT * FROM emp
WHERE ename LIKE '%S';
SELECT * FROM emp
WHERE ename LIKE '%A%';
SELECT * FROM emp
WHERE ename LIKE '_A%';
SELECT * FROM emp
WHERE ename LIKE '_____';
#is null, 匹配空值(不能写成 =null)
SELECT * FROM emp
WHERE comm IS NULL;
3.逻辑运算
<