1.SQL分类
数据定义(DDL):创/改/删/名/清(cadrt)
数据库对象:表/视图/存储/函数/触发器/事件
数据操作(DML):增/删/改/查(idus)
操作数据库对象
数据控制(DCL):提/回/保/赋/收(权限)(crsgr)
2.SQL语言规则
- 子句分行可缩进
- 命令记得要加;
- 关键字不可缩分
- 标点符号要成对
3.注释
单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/*注释文字*/
4.select语句
4.1最基本select语句
SELECT字段1,字段2,...FROM表名
SELECT 1 + 1,3 * 2
FROM DUAL; #dual:伪表
结果集:
4.2别名
#.列的别名
#as:全称:alias(别名),可以省略
#列的别名可以使用一对" "引起来。
SELECT employee_id emp_id, last_name AS lname, department_id "部门id"
FROM employees; I
4.3去除重复行
SELECT DISTINCT department _ id
FROM employees;
4.4空值参与运算
#空值参与运算
#1.空值:null
#2.null不等同于0,",'null'
#3.空值参与运算:结果一定也为空。
SELECT employee id, salary "月工资", salary * (1 + commission_pct ) * 12 "年工资", commisssion_pct
FROM employees;
#实际问题的解决方案:引入IFNULL
SELECT employee id, salary "月工资", salary * (1 + IFNULL (commission _ pct , 0 ) * 12 "年工资", commission_pct
FROM employees;
4.5着重号 ``
与关键字冲突
SELECT * FROM `order`;
4.6查询常数
SELECT 123,employee_id,last_name
FROM employees;
4.7显示表结构
DESCRIBE employees;#显示了表中字段的详细信息
4.8过滤数据(条件查询)
#练习:查询90号部门的员工信息
SELECT *
FROM employees
#过滤条件:声明在FROM结构的后面
WHERE department id = 90;
#练习:查询last_name为'King'的员工信息
SELECT
*
FROM employees
WHERE last_name = 'King';|
5.运算符
5.1算术运算符
5.1.1加法
#在SQL中,+没有连接的作用,就表示加法运算。此时,会将字符串转换为数值(隐式转换)
SELECT 100 + '1' #在Java语言中,结果是:1001。
FROM DUAL;
SELECT 100 + 'a' #此时将'a' 看做0处理
FROM DUAL;
SELECT 100 + NULL #nu11值参与运算,结果为null
FROM DUAL;
5.1.2加减乘除
SELECT 100, 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2,
100 + 2 * 5 / 2,100 / 3,100 DIV 0 #分母如果为0,则结果为null
FROM DUAL;
5.1.3取模运算
# 取模运算(计算余数): % mod
SELECT 12 % 3,12 % 5, 12 MOD -5,-12 % 5,-12 % -5
FROM DUAL;
5.2.比较运算符
5.2.1 等于=
SELECT 1 = 2, 1 ! = 2,1 = ' 1', 1 = 'a', 0 = 'a' # 字符串存在隐式转换。如果转换数值不成功,则看做0
FROM DUAL;SELECT'a'='a''ab'='ab','a'='b'#两边都是字符串的话,则按照ANSI的比较规则进行比较。
FROM DUAL;SELECT 1 = NULL, NULL = NULL # 只要有null参与判断,结果就为null
FROM DUAL;
关于NULL的条件比较查询
SELECT last name, salary, commission_pct
FROM employees
#where salary = 6000;
#此时执行,不会有任何的结果,因为比较结果为null非1
WHERE commission_pct = NULL;
5.2.2安全等于<=>
SELECT last name, salary, commission_pct
FROM
employees
WHERE
commission_pct <=> NULL; #解决null比较问题
5.2.3不等于<>,!=
SELECT 3 <> 2,'4' <> NULL,'' != NULL, NULL != NULLFROM DUAL;
5.2.4比较(IS NULL\IS NOT NULL\ ISNULL)
#IS NULL \ IS NOT NULL \ ISNULL
#练习:查询表中commission_pct为nul1的数据有哪些
SELECT last name , salary , commission_pct
FROM employees
WHERE commission_pct IS NULL;
#或
SELECT last name, salary, commission_pct
FROM employees
WHERE ISNULL(commission_pct);
#练习:查询表中commissionpct不为nu11的数据有哪些
SELECT last name , salary , commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
#或
SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct <=> NULL;
5.2.5字符串大小LEAST()/GREATEST()
SELECT LEAST('g','b','t','m'),GREATEST('g','b','t''m''m')
FROM DUAL;SELECT LEAST(first_name,last_name),#比较字符串大小
LEAST(LENGTH(first_name),LENGTH(last_name))#比较字符串长度大小
FROM employees;
5.2.6区域查询BETWEEN ...AND ...
#BETWEEN 条件下界1 AND 条件上界2(查询条件1和条件2范围内的数据,包含边界)
#查询工资在6000到8000的员工信息
SELECT employee_id, last_name, salary
FROM employees
#where salary between 6000 and 8000;
WHERE salary >= 6000 && salary <= 8000;
#交换6000和8000之后,查询不到数据
SELECT employee_id, last_name, salary
FROM employees
WHERE salary BETWEEN 8000 AND 6000;#错误写法
#查询工资不在6000到8000的员工信息
SELECT employee id, last name, salary
FROM employees
WHERE salary NOT BETWEEN 6000 AND 8000;
#where salary < 6000 or salary > 8000;
5.2.7in()/not in()
#练习:查询部门为10,20,30部门的员工信息
SELECT last_name, salary, department_id
FROM employees
#where department_id = 10 or department_id = 20 or department_id = 30 ;
WHERE department id IN (10,20,30);
#练习:查询工资不是6000,7000,8000的员工信息
SELECT last_name , salary , department_id
FROM employees I
WHERE salary NOT IN (6000,7000,8000);
5.2.8模糊查询:LIKE
#练习:查询last_name中包含字符'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';
#练习:查询last_name中以字符a’开头的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE 'a%';
#练习:查询last_name中包含字符'a'且包含字符'e'的员工信息
#写法1
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
#写法2
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';
#_:代表一个不确定的字符
#查询第2个字符是'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '_a%';
#练习:查询第3个字符是'a'的员工信息
SELECT last name
FROM employees
WHERE last_name LIKE '__a%';
#练习:查询第2个字符是且第3个字符是'a'的员工信息
#需要使用转义字符:\
SELECT last_name
FROM employees
WHERE last_name LIKE '_\_a%';
#或者将$作为转义字符(了解)
SELECT last_name
FROM employees
WHERE last_name LIKE '_$_a%' ESCAPE'$';