MySQL数据库命令
MySQL数据库–刷题题库
MySQL面试知识点干货
进入数据库
mysql -uroot -p
显示数据库
show databases;
创建自定义数据库
create database name;
CREATE DATABASE companydb CHARACTER SET utf8;
create database name character set gbk;
create database name charset=utf8;
删除数据库
drop database name;
打开数据库
use name;
查看当前数据库
select database();
查询指令
语法:SELECT 列名 FROM 表名
//查找部分列
SELECT EMPLOYEE_ID,FIRST_NAME,email FROM t_employees;
//查找所有列
SELECT 所有列名 FROM t_employees;
SELECT * FROM t_employees;
查询结果去重
SELECT DISTINCT MANAGER_ID FROM t_employees;
排序查询
ASC 升序
DESC 降序
//单列排序
SELECT EMPLOYEE_ID,salary FROM t_employees ORDER BY salary ASC;
SELECT EMPLOYEE_ID,salary FROM t_employees ORDER BY salary DESC;
//多列排序
SELECT EMPLOYEE_ID,salary FROM t_employees ORDER BY salary DESC,EMPLOYEE_ID DESC;
条件查询
语法:SELECT 列名 FROM 表名 WHERE 条件
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary = 11000;
区间查找
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary BETWEEN 6000 AND 10000;
NULL值判断
is NULL
IS NOT NULL
SELECT EMPLOYEE_ID,FIRST_NAME,SALARY FROM t_employees WHERE salary SALARY IS NULL;
分支结构查询
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 结果
END
时间查询
# 当前系统时间
SELECT SYSDATE();
# 当前系统日期
SELECT CURDATE();
# 当前系统时间
SELECT CURTIME();
# 获取指定日期为一年中的第几周
SELECT WEEK(SYSDATE());
# 获取指定日期中的年份
SELECT YEAR('2020-11-10');
# 获取小时
SELECT HOUR(CURTIME());
# 获取分钟
SELECT MINUTE(CURTIME());
# 指定日期中的相隔天数
SELECT DATEDIFF('','');
字符串查询
# 字符串拼接
SELECT CONCAT('my','s','ql');
# 字符串替换
SELECT INSERT('这是一个数据库',3,2,'mysql')
# 字符串大写转小写
SELECT LOWER('MYSQL');
# 字符串小写转大写
SELECT UPPER('mysql');
# 字符串内容截取
SELECT SUBSTRING('javamysqlsss',5,5);
聚合函数
SUM()//求所有行中单列结果中的总和
AVG()//平均数
MAX()//最大值
MIN()//最小值
COUNT()//求总行数
查询各个部门,各个岗位的总人数
SELECT department_id,job_id,COUNT(EMPLOYEE_ID)
FROM t_employees
GROUP BY department_id,job_id;
//统计60,70,90号部门的最高工资
SELECT department_id,COUNT(EMPLOYEE_ID)
FROM t_employees
GROUP BY department_id
HAVING department_id IN (60,70,90);
查询总结
//查询语句编写顺序
SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排序列 LIMIT 起始行,总条数
//查询语句执行顺序
1、FROM:指定数据来源表
2、WHERE:对查询数据第一次过滤
3、GROUP BY:分组
4、HAVING:对分组后的数据第二次过滤
5、SELECT:查询各字段的值
6、ORDER BY:排序
7、LIMIT:限定查询结果
子查询
SELECT * FROM t_employees WHERE SALARY > (SELECT SALARY FROM t_employees WHERE FIRST_NAME = 'bruce');
SELECT * FROM t_employees WHERE salary > ALL(SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID = '60');
合并查询
SELECT * FROM t1 UNION SELECT * FROM t2;
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
// left join
select Person.FirstName,Person.LastName,Address.City,Address.State
from Person
left join Address
on Person.PersonId = Address.PersonId;
select Person.FirstName,Person.LastName,Address.City,Address.State
from Person
left join (select distinct PersonId, City, State from Address) Address
on Person.PersonId = Address.PersonId;
新增
//新增
SELECT * FROM t_jobs;
INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY)
VALUES('java_le','java',400,5000);
修改
SELECT * FROM t_employees;
UPDATE t_employees SET SALARY = 25000 WHERE EMPLOYEE_ID = '100';
SELECT SALARY FROM t_employees WHERE EMPLOYEE_ID = '100';
删除
DELETE FROM t_employees WHERE EMPLOYEE_ID = '100';
清空
TRUNCATE TABLE 表名
数据表操作
数值类型
数值类型
日期类型
字符串类型
数据表的创建
CREATE TABLE SUBJECT(
subject_id INT,
subject_name CHAR(20),
subject_hours INT
)CHARSET = utf8;// 指定表的字符编码集
INSERT INTO SUBJECT (subject_id,subject_name,subject_hours) VALUES (1,'hong',100);
SELECT * FROM SUBJECT;
数据表操作
# 向现有表添加列
ALTER TABLE SUBJECT ADD subject_score INT;
# 修改表中的列
ALTER TABLE SUBJECT MODIFY subject_name VARCHAR(10);
# 删除表中的列
ALTER TABLE SUBJECT DROP subject_hours;
# 修改表中的列名
ALTER TABLE SUBJECT CHANGE subject_score subject_hour INT;
# 修改表名
ALTER TABLE sub RENAME SUBJECT;
# 删除表
DROP TABLE SUBJECT;
约束
主键约束
// 主键约束不允许为NULL
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY,
subject_name CHAR(20),
subject_hours INT
)CHARSET = utf8;# 指定表的字符编码集
INSERT INTO SUBJECT (subject_id,subject_name,subject_hours) VALUES (1,'hong',100);
唯一约束
// 唯一约束的列是唯一的,但是可以为null
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY,
subject_name CHAR(20) UNIQUE,
subject_hours INT
)CHARSET = utf8;# 指定表的字符编码集
INSERT INTO SUBJECT (subject_id,subject_name,subject_hours) VALUES (1,'hong',100);
自动增长
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY AUTO_INCREMENT,
subject_name CHAR(20) UNIQUE,
subject_hours INT
)CHARSET = utf8;# 指定表的字符编码集
INSERT INTO SUBJECT (subject_name,subject_hours) VALUES ('hong',100);
INSERT INTO SUBJECT (subject_name,subject_hours) VALUES ('java',100);
SELECT * FROM SUBJECT;
非空约束
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY AUTO_INCREMENT,
subject_name CHAR(20) UNIQUE NOT NULL,
subject_hours INT
)CHARSET = utf8;# 指定表的字符编码集
默认约束
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY AUTO_INCREMENT,
subject_name CHAR(20) UNIQUE NOT NULL,
subject_hours INT DEFAULT 20
)CHARSET = utf8;# 指定表的字符编码集
INSERT INTO SUBJECT (subject_name,subject_hours) VALUES ('C++',DEFAULT);
引用完整性约束
# 专业表
CREATE TABLE speciality(
id INT PRIMARY KEY AUTO_INCREMENT,
specialname VARCHAR(20) UNIQUE NOT NULL
)CHARSET = utf8;
INSERT INTO speciality (specialname) VALUES ('java');
INSERT INTO speciality (specialname) VALUES ('h5');
SELECT * FROM speciality;
# 课程表
CREATE TABLE SUBJECT(
subject_id INT PRIMARY KEY AUTO_INCREMENT,
subject_name VARCHAR(20) UNIQUE NOT NULL,
subject_hours INT DEFAULT 10,
specialid INT NOT NULL,
CONSTRAINT fk_subject_specialid FOREIGN KEY (specialid) REFERENCES speciality (id)
)CHARSET = utf8;# 指定表的字符编码集
INSERT INTO SUBJECT (subject_name,subject_hours,specialid) VALUES ('javase',20,1);
INSERT INTO SUBJECT (subject_name,subject_hours,specialid) VALUES ('c++',30,2);
SELECT * FROM SUBJECT;
约束整合练习题
# 约束整合
CREATE TABLE grade(
gradeid INT PRIMARY KEY AUTO_INCREMENT,
gradename VARCHAR(20) UNIQUE NOT NULL
)CHARSET = utf8;
INSERT INTO grade (gradename) VALUES ('一年级一班');
CREATE TABLE student(
student_id VARCHAR(20) PRIMARY KEY,
student_name VARCHAR(50) NOT NULL,
sex CHAR(1) DEFAULT '男',
borndata DATE NOT NULL,
phone VARCHAR(11),
gradeid INT NOT NULL,
CONSTRAINT fk_student_gradeid FOREIGN KEY (gradeid) REFERENCES grade(gradeid)
)CHARSET = utf8;
INSERT INTO student(student_id,student_name,sex,borndata,phone,gradeid)
VALUES('s1001','hong',DEFAULT,'1999-10-25','18702213305',1);
SELECT * FROM student;
事务
# 事务
CREATE TABLE account(
id INT,
money INT
)CHARSET = utf8;
INSERT INTO account(id,money) VALUES(1,10000);
INSERT INTO account(id,money) VALUES(2,1000);
SELECT * FROM account;
# 模拟转账,
UPDATE account SET money = money - 1000 WHERE id = 1;
UPDATE account SET money = money + 1000 WHERE id = 2;
事务的原理
事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
事务运行的三种模式:
A:自动提交事务
每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。
B:显式事务
以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
C:隐性事务
在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
事务的特性
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
注:事务是恢复和并发控制的基本单位。
# 开启事务
START TRANSACTION;
# 模拟转账,
UPDATE account SET money = money - 1000 WHERE id = 1;
UPDATE account SET money = money + 1000 WHERE id = 2;
# 成功提交
COMMIT;
# 失败回滚
ROLLBACK;
权限管理
# 创建用户
CREATE USER 'zhangsan' IDENTIFIED BY '123';
# 授权用户
GRANT ALL ON companydb.* TO 'zhangsan';
# 撤销用户
REVOKE ALL ON companydb.* FROM 'zhangsan';
# 删除任务
DROP USER 'zhangsan';
视图
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
# 创建视图
CREATE VIEW t_empinfo
AS
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY FROM t_employees;
# 使用视图
SELECT * FROM t_empinfo WHERE EMPLOYEE_ID = '101';
修改视图
# 存在则更新,反之,创建指定新视图
CREATE OR REPLACE VIEW t_empinfo
AS
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY,email FROM t_employees;
# 视图的修改法二 alter
ALTER VIEW t_empinfo
AS
SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY,email,job_id FROM t_employees;
SELECT * FROM t_empinfo;
# 删除视图
DROP VIEW t_empinfo;
作用:
①简化了操作,把经常使用的数据定义为视图。
我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。
②安全性,用户只能查询和修改能看到的数据。
因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。
③逻辑上的独立性,屏蔽了真实表的结构带来的影响。
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
缺点:
①性能差
数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
②修改限制
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
在定义数据库对象时,不能不加选择地来定义视图,应该权衡视图的优点和缺点,合理地定义视图。