Mysql复习
一、Mysql服务的登录和退出
mysql [-h主机名 -p端口号] -u用户名 -p密码
二、Mysql的常见命令(数据库操作)
1. 查看当前所有的数据库
show databases;
2. 打开指定的数据库
use 库名
3. 查看当前库的所有表
show tables;
4. 查看其他库的所有表
show tables from 库名;
5. 创建表
create table 表名(
列名 列类型,
列名 列类型,
....
)
6. 查看表结构
desc 表名;
7. 查看服务器的版本
已登陆mysql服务器
select version();
未登录
mysql --v
三、Mysql的语法规范
1.不区分大小写,建议关键字大写
2.每条命令以分号结尾
3.注释:
单行注释:#注释文字
单行注释:--注释文字
多行:/* 文字 */
四、DQL语言学习
(data query language 查询语言)
4.1、基础查询
select 查询列表 from table
查询列表: 表中的字段、常量、表达式、函数
#1. 查询单个字段
select a from table;
#2. 查询多个字段
select a,b from table
#3. 查询常量
select 100; #打印:100
#4. 表达式
select 100*100 #打印 10000
#5. 函数
SELECT version(); #打印出版本
#6. 起别名
SELECT first_name as 名,last_name AS 姓 from employees;
SELECT first_name 名,last_name 姓 from employees;
#7. 去重,关键字 DISTINCT
SELECT DISTINCT department_id from employees;
#8. +号的作用,合并连接
select '123'+90; #打印213,将字符转换成数值,转化失败则赋值为0
4.2、条件查询
select 查询列表 from table where 筛选条件
#1. 简单运算符,<>不等于
SELECT last_name ,department_id
FROM employees
WHERE department_id<>90;
/*2. like 模糊查询
%:任意多个字符
_:任意单个字符
*/
SELECT *
from employees
WHERE last_name like "%a%";
#3. between and
SELECT * from employees WHERE employee_id BETWEEN 100 and 200;
#4. in
SELECT * from employees WHERE employee_id IN (100,150);
#5. is null ,null不能使用=
#6. 安全等于 <=>,可以判断null和数值
4.3、排序查询
select 查询列表 from table order by 排序列表 【asc /升序 desc/降序 】
- asc /升序 desc/降序
- order不要可以支持单个字段,多个字段,函数,别名
- order by 一般放在查询语句的最后
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
from employees
ORDER BY 年薪
4.4、常见函数
4.4.1、单行函数
1、--字符函数
concat : 连接
substr : 截取字符串
upper : 变大写
lower : 变小写
replace : 替换
length : 获取字符串长度
rtim : 去除空格
lpad : 左填充
rpad : 右填充
2、--数学函数
ceil : 向上取整
floor : 向下取整
round : 四舍五入
mod : 取模
truncate : 截断
rand : 获取随机数
4.4.2、分组函数
-
用于统计使用,又称聚合函数
-
sum求和、avg平均数、max最大值、min最小值、count计算个数
4.5、分组查询
select 查询列表 from table group by 分组函数
- 分组前筛选使用where ,分组后筛选使用 having
#1. 查询部门员工人数大于2结果集
SELECT COUNT(*) ,department_id
from employees
GROUP BY department_id
HAVING COUNT(*)> 2
#2. 查询奖金率不为0且最高工资大于12000的员工和最高工资
SELECT employee_id ,MAX(salary) highSalary
FROM employees
WHERE commission_pct is not null
GROUP BY employee_id
HAVING highSalary >12000
4.6、连接查询
4.6.1、sql92语法
-
等值连接
SELECT last_name,department_name FROM employees,departments WHERE employees.department_id = departments.department_id
-
非等值连接
#查询员工的工资和工资级别 SELECT salary,grade_level from employees e ,job_grades jg WHERE e.salary BETWEEN jg.lowest_sal and jg.highest_sal
-
自连接
SELECT e.employee_id , e.first_name ,m.employee_id ,m.first_name FROM employees e ,employees m WHERE e.manager_id = m.employee_id
4.6.1、sql99语法
-
内连接
#1、查询员工名、部门名、工种名,并按部门名降序 #等值 SELECT last_name ,department_name ,job_title from employees e INNER JOIN departments d on e.department_id = d.department_id INNER JOIN jobs j on e.job_id = j.job_id ORDER BY department_name #非等值 SELECT salary,grade_level from employees e INNER JOIN job_grades jg ON e.salary BETWEEN jg.lowest_sal and jg.highest_sal
-
外连接
- 左外连接,left join 左边的是主表
- 右外连接,right join 右边的是主表
#查询部门表中没有员工的部门 SELECT d.department_name ,e.employee_id from departments d LEFT JOIN employees e ON e.department_id = d.department_id WHERE employee_id is NULL ORDER BY d.department_name
4.7、子查询
内部嵌套其他select语句的查询,称为外查询或主查询
4.7.1、列子查询
#1. 返回locatiuon_id是1400或者1700的部门中的所有员工
SELECT last_name from employees
WHERE department_id IN (
SELECT department_id from departments
WHERE location_id IN(1400,1700)
)
4.7.2、from后面,表查询
#查询每个部门平均工资的等级
SELECT aas,avgs.department_id,grade_level
FROM (
SELECT AVG(salary) aas ,department_id
FROM employees
GROUP BY department_id
) avgs,job_grades
WHERE aas BETWEEN job_grades.lowest_sal and job_grades.highest_sal
4.8、分页查询
select 查询列表 from table limit offset , size
- offset 要是显示条目的起始索引
- size 要显示的条目个数
SELECT * from employees
LIMIT 0,5
4.9、union联合查询
语法:
查询语句1
union
查询语句2
union
查询语句3
应用场景:
-
查询结果来自于多个表,且多个表之间没有直接的连接关系,但查询的信息一致
-
默认去重,不去重则 union all
五、DML语言学习
data manage language 操作语言,增删改
5.1、插入语句
-
insert into 表名 (列名,.......) value(值1,.......)
-
insert into 表名 set 列名=值,列名=值,....
5.2、修改语句
5.2.1、修改单表
update 表名 set 列=新值,列=新值,....
where 筛选条件
5.3、删除语句
delete from 表名 where 筛选条件
truncate table #清空数据
六、DDL语言
数据定义语言,表和库的管理
6.1、库的管理
创建、修改、删除
#1、库的创建
create database 库名;
#2、库的修改<弃用>
#更改字符集
alter database 库名 character set gbk;
#3、库的删除
drop database 库名
6.2、表的管理
创建、修改、删除
- 表的创建
create table 表名(
列名 列类型 【长度 约束】,
列名 列类型,
....
)
-
表的修改
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】
# 修改列名
alter table 表名 change column 旧列名 新列名 类型;
#修改列的类型或约束
alter table 表名 modify column 列名 类型
#添加新列
alter table 表名 add column 列名 类型;
#删除列
alter table 表名 drop column 列名
#修改表名
alter table 表名 rename to 新表名
-
表的复制
CREATE TABLE copy LIKE 表名
七、约束
-
NOT NULL : 非空,用于保证该字段的值不为空
-
DEFAULT: 用于保证该字段具有默认值
-
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
-
UNIQUE:唯一,用于保证该字段具有唯一性,可以为空
-
CHECK: 检查约束【mysql中不支持】
-
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联的值
字段 字段类型 foreign key references 表(外键字段)
主键与唯一得区别:
主键和唯一都可以保证唯一性,但是主键不能为空,唯一允许为空
-
标志列:自增长列 (AUTO_INCREMENT)
一个表至多一个标识列,且必须为数值类型
八、TCL语言
Transaction Control Language 事务控制语言
8.1、事务的ACID属性
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生
-
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态
-
隔离性(Isolation)
事务的隔离性指一个事务的执行不能被其他事务干扰。事务与事务之间不能互相干扰
-
持久性(Durability)
一个事务一旦被提交,他对数据库的操作是永久性的,接下来的其他操作呵数据库故障不应该对其有影响
8.2、并发读出问题
-
**脏读:**一个事务T1读取了另一个事务T2未提交的字段,若T2回滚,则T1读取的数据无效
-
不可重复读:两个事务T1,T2都读取了同一字段,T2对字段进行修改,如果T1再次读取同一字段,值就不同了
-
幻读:两个事务T1,T2都读取了同一字段,T2对表进行插入新行,如果T1再次读取同一个表,则多出几行
8.3、事务的隔离级别
-
READ UNCOMMITED
允许事务读取未被其他事务提交的变更,会导致脏读、不可重复读和幻读
-
READ COMMITED
只允许事务读取被其他事务提交的变更,可以避免脏读,不可重复读和幻读会出现
-
REPEATABLE READ
确保事务可以多次从一个字段读取相同的值,禁止其他字段进行更新,可以避免脏读和不可重复读,幻读一九存在
-
SERIALIZABLE (串行化)
确保事务可以从一个表读取相同的行,此操作禁止其他事务进行插入、更新和删除操作,所有并发问题可解决,但是性能低下
九、视图
9.1、视图的创建
CREATE VIEW 视图名
9.2、视图的删除
DROP view 视图名
9.3、查看视图
desc 视图名
show create view 视图名
9.4、视图的更新
CREATE OR REPLACE VIEW 视图名
AS
select * from ***
十、全局变量
10.1、全局变量
# 查看所有全局变量
SHOW GLOBAL VARIBALES;
# 查看部分全局变量
SHOW GLOBAL VARIABLES LIKE "%CHAR%"
#查看指定的全局变量的值
select @@global.autocommit;
十一、存储过程
11.1、创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程(一组合法的sql语句)
END
评论区