目录
4.2 过滤数据(满足某些条件) --> where 在from后面使用
5.1 算术运算符 + - * / (div) % (mod)
5.2 比较运算符 = <=> <> != < <= > >=
5.2.3 is null 为空 / is not null 不为空 / isnull(字段)为空
5.2.6 in(set) / not in(set) 在与不在 属于不属于 是与不是
5.3 逻辑运算符 或且非 or || and && not ! xor 异或(只满足一个)
一.SQL语言的分类
1.DDL - 数据定义语言 --> create / alter / drop / rename / truncate(清空表,表结构依然在)
2.DML - 数据操作语言 --> insert / delete / update / selsect 增删改查
3.DCL - 数据控制语言 --> commit / rollback / savepoint / grant / revoke
二.SQL语句的规范(建议遵守)
1. 小写: 数据库名、表名、表别名、字段名、字段别名等2. 大写: SQL 关键字、函数名、绑定变量等
2.1语句规则
1. 数据库名、表名、字段名等对象名中间不要包含空格2. 同一个 MySQL 软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名3. 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在 SQL 语句中使用 ` (着重号)引起来4. 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
2.2 注释
单行注释: # 注释文字 (MySQL 特有的方式 )单行注释: -- 注释文字 (-- 后面必须包含一个空格。 )多行注释: /* 注释文字 */
三. 数据库导入数据指令
3.1 source 文件的路径名
3.1.1几种关于数据库的指令
1.登录数据库
mysql
-
u用户名
-
p用户密码
例:
mysql -u root -p
2.显示所有数据库
show databases;
3.选择数据库
use 数据库名;
4.显示数据库中所有的表
show tables;
5.导入sql文件
source 文件路径;
6.退出数据库
quit/exit
3.2 基于图形化界面导入
1.SQLyog
工具 - > 执行SQL脚本 - > 选择文件 - > 执行 shift+alt+f5刷新
四 .SELECT语句
4.1 SELECT ... FROM ...(最基本)
SELECT 字段1,字段2,... FORM 表名;
特殊的 * 表示所有的字段(或列)
例: SELECT 1+1,3*2; 同 SELECT 1+1,3*2 FROM DUAL; //dual伪表
SELECT last_name,salary FROM employees;
4.1.1列的别名
三种方式 as(alias别名) 双引号(建议) AS 可以省略
SELECT last_name NAME, salary AS 工资, salary*12 "年薪" FROM employees;
建议别名简短,见名知意
4.1.2 去除重复行(distinct关键字)
#查询员工表中有哪些部门id
SELECT DISTINCT department_id FROM employees;
SELECT DISTINCT department_id,salary FROM employees;//两者都去重
DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门 id 不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id ),只需要写 DISTINCT department_id 即可,后面不需要再加其他的列名了。
4.1.3 空值参与运算
所有运算符或列值遇到null值,运算的结果都为null
SELECT employee_id,salary,commission_pct,12 * salary * ( 1 + commission_pct) "annual_sal"FROM employees;注意:MYSQL中: 空值不等于空字符串。一个空字符串的长度是 0 ,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的
4.1.4 着重号 ``(类似于java 转义符)
select * from `order`;
4.1.5 常数查询
SELECT '公司名',last_name,salary FROM employees;
//一般用于做标识
4.1.6 显示表结构
DESCRIBE employees; #显示了表的详细信息 describe
或者DESC employees;
4.2 过滤数据(满足某些条件) --> where 在from后面使用
SELECT * FROM employees WHERE department_id = 90;
练习: 查询last_name为'king'员工的信息
SELECT * FROM employees WHERE last_name = 'king';
五.运算符
5.1 算术运算符 + - * / (div) % (mod)
5.1.1 + -
select 100+'1' from dual;
在java中 结果为 1001 在SQL中就表示加法运算,会将字符串转换为数值,
例如: select 100+'a' from dual; //结果为100
如果转失败,就按 0 计算。(补充: MySQL 中字符串拼接要使用字符串函数CONCAT() 实现)
5.1.2 * / (div)
在数学运算中, 0 不能用作除数,在 MySQL 中,一个数除以 0 为 NULL 。一个数除以整数后,不管是否能除尽,结果都为一个浮点数; 除不尽时,保留到小数点后 4 位;乘什么类型的数,结果就为什么类型
5.1.3 % mod 结果正负与被模数相同
练习:
# 筛选出 employee_id 是偶数的员工SELECT * FROM employeesWHERE employee_id MOD 2 = 0 ; //用一个等于号
5.2 比较运算符 = <=> <> != < <= > >=
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回 1 ,比较的结果为假则返回 0 ,其他情况则返回 NULL 。比较运算符经常被用来作为 SELECT 查询语句的条件来使用,返回符合条件的结果记录。
5.2.1 = 等号运算符
判断等号两边的值、字符串或表达式是否相等,如果相等则返回 1 ,不相等则返回0 。如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。除<=>,其他都是
字符串与数值运算存在隐式转换,如果转换不成功,看做0 如 0='a' 结果为 1 但都是字符串按ASCII码比较 'a'= 'b'为0
where commission_pct = null 结果为null 不会有任何和结果显示 is null
5.2.2 <=> 安全等于
与= 的作用是相似的,唯一的区别就是<=>可以对null进行判断,记忆技巧:为null而生
两个都为null 返回 1,只有一个null返回是 0
where commission_pct = null 会把null 的值输出 查询为null的数据
5.2.3 is null 为空 / is not null 不为空 / isnull(字段)为空
5.2.4 least() / greatest()
单个字符比较,一个字符一个字符比较,不是比较长度
5.2.5 between ... and ...
查询工资在2500-3500之间的员工信息SELECT last_name, salaryFROM employeesWHERE salary BETWEEN 2500 AND 3500 ; 边界值包括查询工资不在2500-3500之间的员工信息SELECT last_name, salary
FROM employees
WHERE NOT salary BETWEEN 2500 AND 3500;
5.2.6 in(set) / not in(set) 在与不在 属于不属于 是与不是
练习: 查询部门为10,20,30部门的员工信息
SELECT last_name,department_id FROM employees WHERE department_id IN (10,20,30);
or也可以,但条件需要完整
dedepartment_id = 10 or department_id=20 or department_id=30;
练习:查询工资不是6000,7000,8000的员工信息
SELECT last_name,salary FROM employees WHERE salary NOT IN (6000,7000,8000);
5.2.7 like 模糊查询
练习1: 查询last_name中的字符包含'a'的员工信息
SELECT last_name FROM employees WHERE last_name LIKE "%a%";
%代表不确定个数的字符,包括0个,一个或多个
练习2: 包含字符a也包含字符e
SELECT last_name FROM employees WHERE last_name LIKE "%a%e%" or last_name LIKE "%e%a%";
或者 last_name like '%a%' and last_name='%e%'
练习3:查询第二个字符为a的员工信息
_ 代表一个不确定性字符
SELECT last_name FROM employees WHERE last_name LIKE "_a%";
考虑前后 __不要空格
练习4: 查询第二个字符是下划线且第三个字符是a的员工信息
SELECT last_name FROM employees WHERE last_name LIKE "_\_a%";
用转移字符 \
escape 设置转义符 escape '$' $_(了解)
5.2.8 regexp / rlike :正则表达式
( 1 ) ‘^’ 匹配以该字符后面的字符开头的字符串。( 2 ) ‘$’ 匹配以该字符前面的字符结尾的字符串。( 3 ) ‘.’ 匹配任何一个单字符。( 4 ) “[...]” 匹配在方括号内的任何字符。例如, “[abc]” 匹配 “a” 或 “b” 或 “c” 。为了命名字符的范围,使用一个 ‘-’ 。 “[a-z]” 匹配任何字母,而 “[0-9]” 匹配任何数字。( 5 ) ‘*’ 匹配零个或多个在它前面的字符。例如, “x*” 匹配任何数量的 ‘x’ 字符, “[0-9]*” 匹配任何数量的数字,而 “*” 匹配任何数量的任何字符例:SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk';//111SELECT 'atguigu' REGEXP 'gu.gu', 'atguigu' REGEXP '[ab]'; //11
5.3 逻辑运算符 或且非 or || and && not ! xor 异或(只满足一个)
1 .逻辑非运算符 逻辑非( NOT 或 ! )运算符表示当给定的值为 0 时返回 1 ;当给定的值为非 0 值时返回 0 ;当给定的值为 NULL 时,返回 NULL 。2 .逻辑与运算符 逻辑与(AND 或 && )运算符是当给定的所有值均为非 0 值,并且都不为 NULL 时,返回1 ;当给定的一个值或者多个值为 0 时则返回 0 ;否则返回 NULL 。3 .逻辑或运算符 逻辑或(OR 或 || )运算符是当给定的值都不为 NULL ,并且任何一个值为非 0 值时,则返回 1 ,否则返回 0 ;当一个值为 NULL ,并且另一个值为非 0 值时,返回 1 ,否则返回 NULL ;当两个值都为NULL 时,返回 NULL 。注意:OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。4 .逻辑异或运算符 逻辑异或(XOR )运算符是当给定的值中任意一个值为 NULL 时,则返回 NULL ;如果两个非 NULL 的值都是 0 或者都不等于 0 时,则返回 0 ;如果一个值为 0 ,另一个值不为 0 时,则返回 1 。 不同就返回1
5.4 位运算符(用的比较少,了解) & | ^
六.运算符的优先级
# 1.选择工资不在5000到12000的员工的姓名和工资
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 5000 AND 12000;
SELECT last_name,salary
FROM employees
WHERE salary <5000 OR salary >12000;
# 2.选择在20或50号部门工作的员工姓名和部门号
SELECT last_name,department_id
FROM employees
WHERE department_id IN (20,50);
# 3.选择公司中没有管理者的员工姓名及job_id
SELECT last_name,job_id
FROM employees
WHERE manager_id IS NULL;
# 4.选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
# 5.选择员工姓名的第三个字母是a的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%';
# 6.选择姓名中有字母a和k的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%' AND last_name LIKE '%k%';# 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT first_name
FROM employees
WHERE first_name LIKE '%e';
SELECT first_name
FROM employees
WHERE first_name REGEXP 'e$';
#以e开头的
SELECT first_name
FROM employees
WHERE first_name REGEXP '^e';
# 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种
SELECT last_name,job_id
FROM employees
WHERE department_id >= 80 AND department_id <= 100;
# 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
SELECT last_name,salary,manager_id
FROM employees
WHERE manager_id IN (100,101,110);