语言定义
- db_name 数据库名称
- tbl_name 表单名称
- col_name 字段名称
- xx_name 列表名称
- view_name 视图名称
- index_name 序列名称
- tri_name 触发器名称
- pro_name 存储过程名称
- func_name 存储函数名称
-- 使用命令连接数据库 mysql- h 数据库IP -P 数据库端口 -u 用户名 -p 密码 mysql -h 192.168.31.1 -P 3306 -u root -p 123 -- 查看数据库版本信息 SELECT version();
作用:数据定义语言主要用来定义数据库中的各类对象,包括用户、库、表、视图、索引、触发器、事件、存储过程和函数等。
基本语法CREATE database
-- 创建tbl_name数据库 CREATE DATABASE tbl_name;
示例:
-- 创建school数据库 CREATE DATABASE school;
基本语法 SHOW DATABASES
-- 查看当前所有数据库名称 SHOW DATABASES; -- 数据库使用切换 USE tbl_name;
示例:
-- 查看当前所有数据库名称 SHOW DATABASES; -- 切换使用school库 USE school;
基本语法 DROP DATABASE
-- 查看当前所有数据库名称 DROP DATABASE [ IF EXISTS ] tbl_name;
示例:
-- 删除school库,存在报成功,不存在报错 DROP DATABASE school -- 先判断school库是否存在:存在则删除,不存在不报错 DROP DATABASE IF EXISTS school;
基本语法 CREATE TABLE xxx (列名1 列类型, 列名2 列类型, ...);
-- 创建表tbl_name,其中包含列id、name、sex CREATE TABLE tbl_name( id INT NOT NULL, name CHAR(10) NOT NULL, sex CHAR(2), );
示例:
DROP TABLE IF EXISTS student; -- 创建student表,表中包含id、name CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255) ) ;
基本语法 SHOW TABLES
-- 查看该库下的所有表 SHOW TABLES; -- 查看tbl_name的表结构 DESC tbl_name;
示例:
-- 查看该库下的所有表 SHOW TABLES; -- 查看student的表结构 DESC student;
基本语法ALTER TABLE
-- 编辑表名称 ALTER TABLE tbl_name rename to tbl_name2; -- 编辑表,增加列 ALTER TABLE tbl_name ADD (xx_edu CHAR(50)); -- 编辑表,修改列名称 ALTER TABLE tbl_name change xx_edu yy_edu CHAR(50); -- 编辑表,修改列类型 ALTER TABLE tbl_name modify xx_edu CHAR(100); -- 编辑表,删除列 ALTER TABLE tbl_name DROP xx_edu;
示例:
-- 修改表格增加一列,列项名为age ALTER TABLE student ADD (age CHAR(50));
基本语法DROP table
DROP TABLE [ IF EXISTS ] tbl_name;
示例:
-- 删除student表,存在报成功,不存在报错 DROP TABLE student; -- 先判断student表是否存在:存在则删除,不存在不报错 DROP TABLE IF EXISTS student;
基础语法TRUNCATE TABLE
TRUNCATE TABLE tbl_name;
区别:
DROP
可选择删除的记录;TRUNCATE TABLE
删除表中的所有记录;DROP
会返回删除记录数,执行速度不快;TRUNCATE TABLE
不能返回被删除的记录数,执行速度快;‘
视图是对若干张基本表的引用,是一张虚表,查询语句执行的结果,不存储具体的数据(基本表发生了改变,视图也会跟着被改变)
基本语法 CREATE VIEW
-- 创建一个视图view_name,用来查询 tbl_name 的数据: CREATE VIEW view_name as SELECT * FROM tbl_name; # 后面跟SELECT语句
示例:
-- 先创建一张表 DROP TABLE IF EXISTS student; CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255) ) ; -- 为表创建一个视图 CREATE VIEW stu_view AS SELECT * FROM student;
with check option
遵循视图表的规则 with check option
增加条件后了之后,如果需要在视图表进行操作,需要遵循视图表的规则
如果视图表遵循as SELECT * FROM user where sex='man'
,那么再视图表中增加的数据,sex
只能为man
CREATE VIEW view_name as SELECT * FROM user where sex='man' with check option;
基本语法 SHOW CREATE VIEW
SHOW CREATE VIEW view_name;
示例:
-- 查看创建的视图 stu_view SHOW CREATE VIEW stu_view;
基本语法 ALTER VIEW
ALTER VIEW view_name as SELECT name FROM tbl_name;
注:修改视图和创建视图语句一样,因为视图是根据真实表的结构创建的,无法修改视图中列的属性。
示例:
-- 修改视图获取条件 ALTER VIEW stu_view as SELECT name FROM student where id = '1';
基本语法 select
SELECT * FROM view_name;
示例:
-- 引用视图 SELECT * FROM stu_view;
基本语法 DROP view
DROP VIEW view_name;
示例:
-- 删除视图 stu_view DROP VIEW stu_view;
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库 索引 好比是一本书前面的目录,能加快数据库的查询速度。
转载:https://www.jianshu.com/p/3a181a5ee156
创建表时,添加索引
CREATE TABLE table_name ( id int(11) NOT NULL, title char(255) NOT NULL , PRIMARY KEY (id), INDEX index_name (title) # 设置索引 );
示例:
-- 创建tbl_name 表时,添加索引 DROP TABLE IF EXISTS student; CREATE TABLE student( id INT NOT NULL, name CHAR(10) NOT NULL, sex CHAR(2), INDEX sex_index(sex) # 设置 sex 为索引 );
在已存在的表上创建索引
-- 给tbl_name 的 col_name字段,创建索引 CREATE INDEX index_name ON tbl_name(col_name); -- 给tbl_name 的 col_name字段,创建唯一索引 ALTER TABLE tbl_name ADD INDEX index_name(col_name);
示例:
-- 先创建一个没有索引的表 CREATE TABLE people( id INT NOT NULL, name CHAR(10) NOT NULL, age CHAR(2) ); -- 为表创建索引 CREATE INDEX age_index ON people(age);
基本语法 SHOW
-- 查看tbl_name表中的索引; SHOW INDEX FROM tbl_name;
示例:
-- 查看student表中的索引 SHOW INDEX FROM student;
基本语法 ALTER table tbl_name DROP index
-- 修改表的方式删除索引 ALTER TABLE tbl_name DROP INDEX index_name; -- 删除tbl_name表上的index_name索引 DROP INDEX index_name on tbl_name;
示例:
-- 修改表的方式删除索引 ALTER TABLE student DROP INDEX sex_index; -- 删除tbl_name表上的index_name索引 DROP INDEX age_index on people;
MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。
https://www.cnblogs.com/csj2018/p/9966144.html
创建tbl_name 表时,添加序列: AUTO_INCREMENT
CREATE TABLE tbl_name( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id); name CHAR(10) NOT NULL, sex CHAR(2), PRIMARY KEY (id) );
示例:
-- 创建表时,添加序列 DROP TABLE IF EXISTS student ; CREATE TABLE `student`( `id` int UNSIGNED not null AUTO_INCREMENT, PRIMARY KEY (id), `name` varchar(20) not null, `age` date not null );
创建序列时,设置序列的开始值
-- 设置开始值为100 CREATE TABLE tbl_name( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), name CHAR(10) NOT NULL, sex CHAR(2), ) AUTO_INCREMENT=100;
查看表结构就是查看序列
-- 查看表结构中的 Extra 字段有AUTO_INCREMENT字段,说明该列就是设置了序列 DESC tbl_name;
示例:
DESC student;
重置序列
-- 先删除tbl_name表中得id列 ALTER TABLE tbl_name DROP id; -- 添加 tbl_name新增id字段,并设置为自增长 ALTER TABLE tbl_name ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
示例:
-- 存在一份没有设置序列的表 DROP TABLE IF EXISTS student ; CREATE TABLE `student`( `id` int UNSIGNED not null, `name` varchar(20) not null, `age` date not null ); -- 先删除tbl_name表中得id列 ALTER TABLE student DROP id; -- 再表单设置序列 ALTER TABLE student ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
基本语法DROP
-- 删除序列其实就是删除表中的列,或者将表删除 DROP tbl_name;
示例:
DROP TABLE student;
触发器是一种对象,它能根据对表的操作时间,触发一些动作,这些动作可以是insert、update、delete等修改操作。
https://www.cnblogs.com/phpper/p/7587031.html
基本语法CREATE TRIGGER tri_name
-- 每次在tbl_name表中插入一行数据,将用户变量str的值设置为 abc CREATE TRIGGER tri_name # 创建触发器的名称 after # 触发时间 INSERT on tbl_name # 触发事件 for each row set @str="abc"; # 触发的动作
示例:
-- 现在有表如下: # 用户 users 表 DROP TABLE IF EXISTS users; CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `add_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`(250)) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1; # 日志 logs 表: DROP TABLE IF EXISTS logs; CREATE TABLE `logs` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `log` varchar(255) DEFAULT NULL COMMENT '日志说明', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表'; # 创建触发器: -- 需求是:当在users中插入一条数据,就会在logs中生成一条日志信息。 DELIMITER $ CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW BEGIN DECLARE s1 VARCHAR(40)character set utf8; DECLARE s2 VARCHAR(20) character set utf8; #后面发现中文字符编码出现乱码,这里设置字符集 SET s2 = " is CREATED"; SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接 INSERT INTO logs(log) values(s1); END $ DELIMITER ;
基本语法
SHOW TRIGGERS;
示例:
-- 创建好了触发器,继续在users中插入数据并查看数据 INSERT INTO users(name,add_time) VALUE('周伯通','1634523798'); -- 在来看下logs表,日志会自动记录到logs表中 SELECT * FROM logs;
基本语法 DROP
DROP TRIGGER tri_name;
示例:
DROP TRIGGER user_log;
存储过程就是具有名字的一段代码,用来完成一个特定的功能。
https://blog.csdn.net/qq_33157666/article/details/87877246
基本语法 CREATE procedure pro_name()
-- 创建一个存储过程,其功能是查询tbl_name表的数据 CREATE procedure pro_name() SELECT * FROM tbl_name;
示例:
-- 创建一个表 DROP TABLE IF EXISTS student; CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255), `age` int(3) ) ; -- 往表单中插入数据 INSERT INTO student(id,name,age) VALUE(1,'张三','35'),(2,'李四','26'); -- 创建存储过程 CREATE PROCEDURE proc() SELECT * FROM student;
执行
CREATE PROCEDURE
和CREATE FUNCTION
语句需要CREATE ROUTINE
权限。
基本语法 call
CALL pro_name();
示例:
CALL proc();
删除存储过程和删除表一样
DROP PROCEDURE pro_name;
示例:
DROP PROCEDURE proc;
函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。
https://blog.csdn.net/pan_junbiao/article/details/86307126
https://blog.csdn.net/u013103102/article/details/104119669
基本语法 CREATE FUNCTION func_user
-- 创建存储函数 CREATE FUNCTION func_name ([param_name type[,...]]) RETURNS type [characteristic ...] BEGIN routine_body END;
示例:
-- 先创建tb_user(用户信息表),并添加数据。 # 创建用户信息表 DROP TABLE IF EXISTS student; CREATE TABLE student( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号', name VARCHAR(50) NOT NULL COMMENT '用户姓名' ) COMMENT = '用户信息表'; -- 添加数据 INSERT INTO student(name) VALUES('pan_junbiao的博客'); INSERT INTO student(name) VALUES('KevinPan'); INSERT INTO student(name) VALUES('pan_junbiao'); -- 创建存储函数 DELIMITER $$ CREATE FUNCTION fn_search_name(uid INT) RETURNS VARCHAR(50) DETERMINISTIC BEGIN DECLARE NAME VARCHAR(50); SELECT name INTO NAME FROM student WHERE id = uid; IF NAME IS NULL THEN RETURN(SELECT '查无此人'); ELSE IF NAME='minton' THEN RETURN(SELECT '哇!是minton大佬'); ELSE RETURN(SELECT NAME); END IF; END IF; END $$
基本语法 select
SELECT func_name()
示例:
SELECT fn_search_name(1);
基本语法 DROP FUNCTION;
DROP FUNCTION func_name;
示例:
DROP FUNCTION fn_search_name;
基本语法 CREATE user
CREATE user 'user_name'@'host_name' [IDENTIFIED by 'password']; # user_name:用户名 # host_name:主机名,不填写默认所有主机 # password:口令,密码
示例:
# 创建用户名为mike,用户密码为123,主机名为localhost; DROP USER IF EXISTS 'mike'@'%'; CREATE USER 'mike'@'%' identified by '123';
修改用户账号,基本语法 rename user
RENAME USER 'old_user'@'host_name' to 'new_user'@'host_name';
示例:
RENAME USER 'mike'@'localhost' to 'jake'@'%';
修改用户密码,基本语法 set password
# for user指定修改密码的用户 SET PASSWORD [FOR 'user_name'@'host_name'] = PASSWORD('password');
示例:
SET PASSWORD FOR 'jake'@'%' = PASSWORD("abc");
基本语法 DROP
DROP USER [ IF EXISTS ] 'user_name1'@'host_name', 'user_name2'@'host_name';
示例:
DROP USER 'jake'@'%';
作用:用于添加、删除、更新和查询数据库记录,并检查数据完整性,主要包括的操作有:INSERT,UPDATE,DELETE。
基本语法 insert into
# 向tbl_name 的表中插入多条数据 INSERT INTO db_name.tbl_name(id,name,age) value(1,'张三','35'),(2,'李四','26');
示例:
-- 创建一个表单 DROP TABLE IF EXISTS student; CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255), `age` int(3) ) ; -- 往表单中插入数据 INSERT INTO student(id,name,age) VALUE(1,'张三','35'),(2,'李四','26');
插入部分列值的数据
# insert...set INSERT INTO db_name.tbl_name SET xx_name='mike',xx_age=1;
插入子查询数据
# insert...SELECT INSERT INTO db_name.tbl_name SELECT * FROM id ='1';
插入新数据的列为自增长,使用 0
表示
INSERT INTO db_name.tbl_name VALUE(3,'王五','11');
插入新数据要为默认值时,可以使用 default
表示
INSERT INTO db_name.tbl_name VALUE(id,'name',default);
基本语法 update
# 修改tbl_name表中,id为1的数据,修改名称为micke UPDATE db_name.tbl_name SET name='mike' WHERE id=1;
示例:
UPDATE student SET name='王五' WHERE id='1';
基本语法delete FROM
DELETE FROM db_name WHERE xx=xx;
示例:
# 删除tbl_name表中,id 为 1 的数据 DELETE FROM student WHERE id='1';
作用:主要用来查看表中的数据,也是平时使用最多的操作,主要命令为:SELECT
基本语法 SELECT * FROM tbl_name where id='1';
SELECT col_name # col_name 输出字段 FROM tbl_name # 查询表名 [where xx_name='mike'] # 数据条件选择 [group by {}] [having] [order by {col_name} ASC|DESC] # 对结果进行排序 [limit {}] # 限制行数
示例:
-- 创建一个表,并添加数据 DROP TABLE IF EXISTS student; CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255), `age` int(5), `sex` varchar(10) ); -- 往表单中插入数据 INSERT INTO student(id,name,age,sex) VALUE(1,'张三','35','boy'),(2,'李四','26','girl'),(3,'王五','13','boy'); -- 使用selct命令所有表的所有数据信息 SELECT * FROM student;
子句 | 说明 | 是否必须使用 |
---|---|---|
select | 要返回的列或表达式 | 是 |
from | 从中检索数据的表 | 仅从表选择数据时使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在按组计算聚合时使用 |
having | 组级过滤 | 否 |
order by | 输出排序顺序 | 否 |
limit | 要检索的行数 | 否 |
替换列的名称 as
# as后就是更改后的列名 SELECT col_name AS '名称' FROM tbl_name;
示例:
SELECT name AS '姓名' FROM student;
替换查询结果中的数据 case
SELECT col_name, case where col_sex='man' then '男' # 将数据为man的输出为"男" else '女' # 除man以外的数据,输出为"女" end as 性别 # 列表的名称 FROM tbl_name;
计算列值
SELECT xx_id+100,xx_name,xx_sex FROM tbl_name; # 输出后xx_id的数据增加100 # 例:xx_id=1,输出结果为101
聚合函数
函数名 | 说明 |
---|---|
count | 求组中,返回int类型整数 |
max | 最大值 |
min | 最小值 |
sum | 求和 |
avg | 求平均值 |
std 或 srddev | 返回给定表达式中所有值得标准值 |
variance | 方差 |
group_concat | 返回由属于一组的列值连接组合而成的结果 |
bit_and | 逻辑与 |
bit_or | 逻辑或 |
bit_xor | 逻辑异或 |
比较运算符
比较运算符 | 说明 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
<=> | 不会返回unknow |
判定范围
判定符 | 说明 | 示例 |
---|---|---|
between | 在....之间 | where id between 901 and 902; |
in | 枚举 | where id in(901,902); |
is null | 空值 | where id is null; |
子查询 in
SELECT * FROM tbl_name1 WHERE tbl_name1.xx_id IN( SELECT tbl_name2.xx_id FROM tbl_name2 WHERE xx_name='mike' ); # xx_id分别为tbl_name1,tbl_name2的主/外键
基本语法group by
SELECT xx_id,xx_sex,count(*) as "人数" FROM tbl_name group by xx_id,xx_sex; # 输出相同xx_id和xx_sex的人数
分组汇总 with rollup
SELECT xx_id,xx_sex,count(*) as "人数" FROM tbl_name group by xx_id,xx_sex with rollup; # 输出相同xx_id和xx_sex的人数 # with rollup输出xx_id,xx_sex,count的总数
过滤分组
SELECT xx_id,xx_name FROM tbl_name group by xx_id,xx_name having count(*) < 3; # 输出相同xx_id和xx_sex的少于3人的数据
排序 oder by col_name
;ASC,升序;DESC,降序
SELECT * FROM tbl_name WHERE xx_sex='man' order by xx_id DESC; # 输出xx_sex为man的人数,排列顺序为降序
输出数据的行数 limit
# 输出从第五行(4)开始,后三行(3)的数据 # 计算机计数从0开始 SELECT * FROM tbl_name limit 4,3;
cross join
SELECT * FROM tbl_name 1 cross join tbl_name2; # 或者 SELECT * FROM tbl_name1,tbl_name2;
当tbl_name1
的主键和tbl_name2
的外键相等的时候,需要使用内连接:inner join...on...
# FROM 表1 inner join 表2 on 键名称|外键=主键 SELECT * FROM tbl_name1 inner join tbl_name2 on some conditions; # some conditions 可以这样表示 # tbl_name1.xx_name = tbl_name2.xx_name # 或者 # xx_name='mike'
以左表为基表left join
# FROM 表1 left join 表2 on 键名称|外键=主键 SELECT * FROM tbl_name1 left join tbl_name2 on some conditions; # 输出tbl_name1的表数据
以右表为基表right join
# FROM 表1 right join 表2 on 键名称 SELECT * FROM tbl_name1 right join tbl_name2 on some conditions; # 输出tbl_name2的表数据
作用:用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
基本语法 grant
GRANT priv_type [column_list] ON [object_type] priv_level TO user_specification [with grant option]; # priv_type:指定权限名称,如SELECT、insert、delete等 # column_list:指定权限要授予表中的那些具体列 # object_type:指定权限授予对象和级别;可以看到哪些表 # user_specification:用户名,用于指定被授予权限的用户user # with grant option:用户实现权限的转移或限制
示例:
-- 创建一个表 DROP TABLE IF EXISTS student; CREATE TABLE student ( `id` int(11) NOT NULL, `name` varchar(255), `age` int(5) ) ; -- 授予mike在数据库db_name的表tbl_name上,拥有列xx_id、xx_name的SELECT、update权限 GRANT SELECT,UPDATE(id,name) ON student TO 'mike'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES;
grant
语句授权时,可以同时创建用户
-- 授权给 mike 用户,关于 tbl_name 表的 SELECT 权限 GRANT SELECT # 授予表的SELECT权限 ON db_name.tbl_name # 授予的表名称 TO 'user_name'@'host_name' identified by 'password'; # 用户名称及密码 -- 刷新权限 FLUSH PRIVILEGES;
授予数据库所有权限
-- 授予mike 的db_name库中所有表的所有权限 GRANT ALL # 所有操作权限 ON db_name.* # db_name的所有表 TO 'user_name'@'host_name'; -- 刷新权限 FLUSH PRIVILEGES;
查看某个用户所授予的权限
-- 查询给 'mike'@'host_name' 所授予的所有权限 SHOW GRANTS FOR 'user_name'@'host_name';
示例:
SHOW GRANTS FOR 'mike'@'loaclhost';
基本语法 revoke
REVOKE priv_type [column_list] ON [object_type] priv_level FROM user_specification;
示例:
-- 回收用户mike,在数据库db_name的tbl_name表,delete的权限 REVOKE UPDATE ON student FROM 'mike'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES;
基本语法 SELECT into ... outfile
SELECT * into outile 'file_name' export_options;
示例:
# 导出名为backupfile.txt的备份, # 字段值如果是字符用双引号标注 optionally enclosed # 字段值之间用逗号隔开 fields terminated # 每行以问号结束 lines terminated SELECT * FROM db_name.tbl_name into outfile 'C:/backupfile.txt' fields terminated by ',' optionally enclosed by "" lines terminated by ? ;
基本语法 load data ... infile
load data infile 'file_name' into table tbl_name;
示例:
load data infile 'C:/backupfile.txt' into table db_name.tbl_name fields terminated by ',' optionally enclosed by "" lines terminated by '?' ;
导出数据库
# 将本地mysql服务器上的bs_audit数据库导出到本地的bs_audit.bak文件中: use <数据库名>; mysqldump -uroot -p123456 --databases bs_audit > bs_audit.bak;
导出表
# 将本地主机上的stranger_info数据库的tb2数据表导出到本地的stranger_info.bak文件中: mysqldump -uroot -pAnkki_mySQL123 bs_audit stranger_info > stranger_info.bak;
导入数据库
# 进入mysql中,使用source指令完成数据库导入,如下: # 将原有的数据库删除 drop database bs_audit; # 创建全新的数据库 create database bs_audit; # 进入数据库环境 use bs_audit; # 导入备份文件恢复 source /root/bs_audit.bak;
导入表
# 进入数据库环境 use bs_audit; # 若没有此表,则需创创建;若存在,不需执行 create database stranger_info; # 导入备份文件恢复 source /root/data/stranger_info.bak;