DML 增删改
DQL 查
cmd 管理者身份
net start mysql57
net stop mysql57
cmd
mysql -uroot -p**** --login
mysql -h127.0.0.1 -uroot -p**** --login
mysql -uroot -p --login
****
quit --logout
exit --logout
select @@datadir; -- my.ini文件存在目录查找
快捷键
tab 自动写全
l
DDL 数据库
CREATE DATABASE db1; -- 创建数据库
CREATE DATABASE db1_1 CHARACTER SET utf8; -- 创建数据库
USE db1; -- 切换数据库
SELECT DATABASE(); -- 查询正在使用的数据库
SHOW DATABASES; -- 查询MySQL中有哪些数据库
ALTER DATABASE db1 CHARACTER SET utf8; -- 修改数据库的字符集
SHOW CREATE DATABASE db1; -- 查找当前数据库的基本信息
DROP DATABASE db1_1; -- 删除数据库
CREATE DATABASE db1; -- 创建数据库 create
CREATE DATABASE db1_1 CHARACTER SET utf8; -- 创建数据库 create
-- update create
ALTER DATABASE db1 CHARACTER SET utf8; -- 修改数据库的字符集 create
USE db1; -- 切换数据库 retrieve (show)
SELECT DATABASE(); -- 查询正在使用的数据库 retrieve (show)
SHOW DATABASES; -- 查询MySQL中有哪些数据库 retrieve (show)
SHOW CREATE DATABASE db1; -- 查找当前数据库的基本信息 retrieve (show)
DROP DATABASE db1_1; -- 删除数据库 drop
DDL 数据表
-- create
CREATE TABLE test2 LIKE test1; -- 创建一个与test1表结构相同的 test2表
CREATE TABLE category ( -- 创建分类表
cid INT,
cname VARCHAR(20),
tdate DATE
);
-- retrieve(show)
DESC test1; -- 查看表结构
SHOW TABLES; -- 查看当前数据库中所有的数据表名
SHOW CREATE TABLE category; -- 查看创建表的 sql
-- drop
DROP TABLE test1; -- 删除 test1表
DROP TABLE IF EXISTS test1; -- 使用先判断后再删除方式
-- update
RENAME TABLE category TO category1; -- 修改变名称 -> rename table 旧表名 to 新表名;
ALTER TABLE category1 CHARACTER SET gbk; -- 修改表的字符集为 gbk -> alter table 表名 character set 字符集;
ALTER TABLE category1 ADD cdesc VARCHAR(20); -- 向表中添加一个字段 关键字:add -> 语法格式:alter table 表名 add 字段名 字段类型(长度)
ALTER TABLE category1 MODIFY cdesc VARCHAR(50); -- 修改表中列的类型或者长度 关键字:modify -> alter table 表名 modify 字段名称 字段类型(长度)
ALTER TABLE category1 MODIFY cdesc CHAR(20); -- 修改表中列的类型或者长度 关键字:modify -> alter table 表名 modify 字段名称 字段类型(长度)
ALTER TABLE category1 CHANGE cdesc description VARCHAR(30); -- 修改列的名称 关键字:change -> alter table 表名 change 旧列名 新列名 类型(长度)
ALTER TABLE category1 DROP description; -- 删除列 关键字:drop -> alter table 表名 drop 列名
DML/DQL 表中数据
DML
-- insert 添加
INSERT INTO student (sid,sname,age,sex,address) VALUES(1,'孙悟空',18,'男','花果山'); -- 方式一 插入全部字段 将所有字段名都写出来
INSERT INTO student VALUES(2,'孙悟饭',5,'男','地球'); -- 方式二 插入全部字段 不写字段名
INSERT INTO student (sid,sname) VALUES(3,'蜘蛛侠'); -- 方式三 插入指定字段
-- update 修改
UPDATE student SET sex = '女'; -- 修改表中的所有的学生姓别为女
UPDATE student SET sex = '男' WHERE sid =1; -- 带条件的修改
UPDATE student SET age=20, address='大唐' WHERE sid=3; -- 一次性修改多个列
-- delete 删除
DELETE FROM student WHERE sid =3; -- 删除 sid为 3的数据
DELETE FROM student; -- 删除所有数据
TRUNCATE TABLE student; -- 删除所有数据
DQL
-- retrieve 查找
SELECT * FROM emp; -- 查询 emp表中所有数据
SELECT eid,ename FROM emp; -- 查询所有数据,只显示ID和name
# as
SELECT eid AS '编号',
ename AS '姓名',
sex AS '性别',
salary AS '薪资',
hire_date AS '入职时间',
dept_name '部门名称'
FROM emp;-- 查询所有的数据,然后给列名改为中文. 即别名查询 使用关键字 as
# distinct
SELECT DISTINCT dept_name FROM emp; -- 查询一共有几个部门 去重操作 关键字 distinct
# +
SELECT ename, salary, salary+1000 salary FROM emp; -- 将我们的员工薪资工资 +1000
排序
SELECT * FROM emp ORDER BY salary DESC;
SELECT * FROM emp ORDER BY salary DESC, eid DESC;
聚合函数
SELECT COUNT(*) FROM emp;
SELECT COUNT(1) FROM emp;
SELECT COUNT(eid) FROM emp;
SELECT COUNT(dept_name) FROM emp; -- 忽略空值
SELECT
SUM(salary) AS '总薪水',
MAX(salary) AS '最高薪水',
MIN(salary) AS '最小薪水',
AVG(salary) AS '平均薪水'
FROM emp;
SELECT COUNT(*) FROM emp WHERE salary > 4000;
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部';
SELECT AVG(salary) FROM emp WHERE dept_name = '市场部';
分组
SELECT * FROM emp GROUP BY sex; -- 无意义的 eid ename
SELECT sex,AVG(salary) FROM emp GROUP BY sex;
SELECT dept_name,AVG(salary) FROM emp GROUP BY dept_name;
SELECT dept_name,AVG(salary) FROM emp GROUP BY dept_name HAVING AVG(salary)>6000;
SELECT dept_name,AVG(salary) FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;
limit
SELECT * FROM emp LIMIT 0,5;
SELECT * FROM emp LIMIT 5;
SELECT * FROM emp LIMIT 3,6;
SELECT * FROM emp LIMIT 0,3; -- 第一页
SELECT * FROM emp LIMIT 3,3; -- 第二页 分页公式:
SELECT * FROM emp LIMIT 6,3; -- 第三页 (当前页-1)*每页显示条数 = (3-1)*3 = 6
主键约束
CREATE TABLE emp2(
eid INT PRIMARY KEY,
ename VARCHAR(20),
sex CHAR(1)
);
DESC emp2;
CREATE TABLE emp2(
eid INT,
ename VARCHAR(2),
sex CHAR(1),
PRIMARY KEY(eid)
);
CREATE TABLE emp2(
eid INT,
ename VARCHAR(20),
sex CHAR(1)
);
ALTER TABLE emp2 ADD PRIMARY KEY(eid); -- 添加主键
ALTER TABLE emp2 DROP PRIMARY KEY; -- 删除主键
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增
ename VARCHAR(20),
sex CHAR(1)
);
INSERT INTO emp2(ename,sex) VALUES('hhh','m');
INSERT INTO emp2(ename,sex) VALUES('yyy','f');
INSERT INTO emp2 VALUES('kkk','f'); -- error
INSERT INTO emp2 VALUES(NULL,'kkk','f');
INSERT INTO emp2 VALUES(NULL,'ddd','f');
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
sex CHAR(1)
)AUTO_INCREMENT=100; -- 主键自增其实值
INSERT INTO emp2(ename,sex) VALUES('hhh','m'); -- 100
INSERT INTO emp2(ename,sex) VALUES('yyy','f'); -- 101
DELETE FROM emp2;
INSERT INTO emp2(ename,sex) VALUES('hhh','m'); -- 102 无影响
INSERT INTO emp2(ename,sex) VALUES('yyy','f'); -- 103 无影响
TRUNCATE TABLE emp2;
INSERT INTO emp2(ename,sex) VALUES('hhh','m'); -- 1 有影响
INSERT INTO emp2(ename,sex) VALUES('yyy','f'); -- 2 有影响
DESC emp2;
SELECT * FROM emp2;
DROP TABLE emp2;
非空约束
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20) NOT NULL,
sex CHAR(1)
);
INSERT INTO emp2 VALUES(NULL,'zhangsan','m');
INSERT INTO emp2 VALUES(NULL,NULL,'m'); -- error
DESC emp2;
SELECT * FROM emp2;
DROP TABLE emp2;
唯一约束
CREATE TABLE emp3(
eid INT PRIMARY KEY,
ename VARCHAR(20) UNIQUE,
sex CHAR(1)
);
INSERT INTO emp3 VALUES(1,'zhangbaiwan','f');
INSERT INTO emp3 VALUES(2,'zhangbaiwan1','f');
INSERT INTO emp3 VALUES(3,'zhangbaiwan','f'); -- error
INSERT INTO emp3 VALUES(3,NULL,'f');
DESC emp3;
SELECT * FROM emp3;
外键约束
FOREIGN KEY(pid) REFERENCES province(id)
ALTER TABLE ... ADD FOREIGN KEY(pid) REFERENCES province(id)
默认值
CREATE TABLE emp4(
eid INT PRIMARY KEY,
ename VARCHAR(20),
sex CHAR(1) DEFAULT 'f'
);
INSERT INTO emp4(eid,ename) VALUES(1,'zhangfei');
INSERT INTO emp4(eid,ename) VALUES(2,'liubei');
INSERT INTO emp4(eid,ename,sex) VALUES(3,'sunwukong','m');
DESC emp4;
SELECT * FROM emp4;
事务
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
money DOUBLE
);
INSERT INTO account (NAME, money) VALUES('tom',1000),('jack',1000);
-- 手动提交, cmd运行测试
START TRANSACTION;
UPDATE account SET money = money + 500 WHERE NAME = 'tom';
UPDATE account SET money = money - 500 WHERE NAME = 'jack';
COMMIT;
SHOW VARIABLES LIKE 'autocommit'; -- on
SET @@autocommit=off;
SHOW VARIABLES LIKE 'autocommit'; -- off
SET @@autocommit=ON;
SELECT * FROM account;
事务隔离级别
select @@tx_isolation; -- 查看事务隔离级别
set global transaction isolation level read uncommitted -- 设置事务隔离级别 读未提交
set global transaction isolation level read committed -- 设置事务隔离级别 读已提交
set global transaction isolation level repeatable read -- 设置事务隔离级别 可重复读
set global transaction isolation level serializable -- 设置事务隔离级别 串行化
多表连接
SELECT * FROM products p INNER JOIN category c ON p.`category_id`=c.`cid`;
SELECT * FROM category c LEFT OUTER JOIN products p ON c.`cid`=p.`category_id`;
SELECT * FROM products p RIGHT OUTER JOIN category c ON c.`cid`=p.`category_id`;
索引
ALTER TABLE demo01 ADD PRIMARY KEY(did); -- 主键索引
CREATE UNIQUE INDEX ind_hobby ON demo01(hobby); -- 唯一索引
CREATE INDEX ind_dname ON demo01(dname); -- 普通索引
ALTER TABLE demo01 DROP INDEX ind_hobby; -- 删除索引
视图
CREATE VIEW products_category_view AS SELECT...
存储过程
-- 1
DELIMITER $$
CREATE PROCEDURE goods_proc()
BEGIN
SELECT * FROM goods; -- 查询所有商品数据
END $$
CALL goods_proc; -- 调用
-- 2
DELIMITER $$
CREATE PROCEDURE goods_proc02(IN goods_id INT)
BEGIN
DELETE FROM goods WHERE gid = goods_id;
END $$
CALL goods_proc02(1);
-- 3
DELIMITER $$
CREATE PROCEDURE orders_proc(IN o_oid INT, IN o_gid INT, IN o_price INT, OUT out_num INT)
BEGIN
INSERT INTO orders VALUES(o_oid, o_gid, o_price);
SET @out_num = 1; -- 设置 out_num = 1
SELECT @out_num; -- 返回 out_num
END $$
CALL orders_proc(1,2,50,@out_num); -- 获取返回值out_num
触发器
DELIMITER $
CREATE TRIGGER t1
AFTER INSERT ON orders
FOR EACH ROW -- 行触发器
BEGIN
UPDATE goods SET num = num -1 WHERE gid = 4; -- 订单+1 库存-1
END $
INSERT INTO orders VALUES(1,4,25); -- 向orders表插入一个订单
用户
创建用户
CREATE USER 'admin1'@ 'localhost' IDENTIFIED BY '123456'; -- 只能在 localhost 这个服务器登录 mysql 服务器
CREATE USER 'admin2'@ '%' IDENTIFIED BY '123456'; -- 在任何电脑上登录 mysql 服务器
SELECT * FROM USER;
用户的授权
GRANT SELECT ON db4.`products` TO 'admin1'@ 'localhost';
GRANT ALL ON *.* TO 'admin2'@ '%';
查看用户权限
SHOW GRANTS FOR 'root'@ 'localhost';
SHOW GRANTS FOR 'admin1'@ 'localhost';
SHOW GRANTS FOR 'admin2'@ '%';
删除用户
DROP USER 'admin1'@'localhost';
查询用户
SELECT * FROM USER;
Java程序访问MySQL数据库
// 1.注册驱动
// 2.获取连接 Connection
// 3.获取语句执行平台 Statement
// 3.1 通过statement对象的方法 增删改查
// 3.2 通过prepareStatement对象的方法 增删改查
// 4.关闭流 后开先关
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4?characterEncoding=utf8", "root", "stone");
Statement statement = con.createStatement();
int i = statement.executeUpdate("create table test( id int, name varchar(20), age int);");
ResultSet resultSet = statement.executeQuery("select * from jdbc_user;");
resultSet.close();
statement.close();
con.close();