SQL语句分类:
DDL:Data Defination Language 数据定义语言
CREATE,DROP,ALTER
创建 删除 修改
DML:Data Maipulation Language 数据修改语言
INSERT,DELETE,UPDATE,SELECT
插入 删除 修改 查询
GRANT:权限新增
REVOKE:权限删除
数据类型:
字符型:
定长字符型:CHAR(#)不区分字符大小,BINARY(#)区分字符大小写,#号为可选项,可以指定长度
变长字符型:VARCHAR(#)不区分字符大小写,VARBINARY(#)区分字符大小写,#号为可选项,可以指定长度
对象存储:
TEXT:不区分大小
BLOB:区分字符大小写
内置类型:
ENUM:枚举类型
SET:集合
数值型:
精确数值型:
整型:int
tinyint:1byte
smallint:2bytes
mediumint:3bytes
int:4bytes
bigint:8bytes
十进制:decimal
近视数值型:
单精度浮点型:
float
双精度浮点型:
double
日期时间型:
日期:DATE
时间:TIME
日期时间:DATETIME
时间戳:TIMESTAMP
年份:YEAR(2),YEAR(4)
修饰符:
所有类型使用:
NOT NULL,非空约束
DEFAULT VALUE,设定默认值
PRIMARY KEY,主键
UNIQUE KEY,唯一键
数值型使用:
UNSIGNED,无符号,即正数
AUTO_INCREMENT,自增字段
数据库操作语句:
创建数据库:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
例:
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS mydb; // 此条命令产生的效果为:如果mydb数据库不存在,就创建一个名为mydb的新数据库
删除数据库:
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
例:
MariaDB [(none)]> DROP DATABASE IF EXISTS mydb; // 此条命令产生的效果为:如果mydb存在,就删除这个数据库
设置默认数据库:
USE DB_NAME;
MariaDB [(none)]> USE mydb;
设置字符集:
CHARACTER SET 'CHAR SET NAME';
例:
MariaDB [(none)]> CHARACTER SET gb2312; // 设置字符集为gb2312
查看支持的所有字符集:
SHOW CHARACTER SET;
例:
MariaDB [(none)]> SHOW CHARACTER SET; // 查看可用字符集
设置排序规则:
COLLATE 'COLLATE NAME';
例:
MariaDB [(none)]> COLLATE big5_bin; // 设置排序规则为big5_bin
查看支持的所有排序规则:
SHOW COLLATION;
例:
MariaDB [(none)]> SHOW COLLATION; // 查看支持的所有排序规则
获取命令使用帮助:
HELP KEYWORD;
例:
MariaDB [(none)]> HELP CREATE DATABASE; // 获取CREATE DATABASE命令的相关帮助信息
查看数据库信息:SHOW DATABASES;
查看表信息:SHOW TABLES;
NOTE:删除操作不可逆且不可恢复。
表操作语句:
创建表:
CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (col1 datatype 修饰符,col2 datatype 修饰符...) [ENGINE=''];
例:
MariaDB [mydb]> CREATE TABLE IF NOT EXISTS mytb1 (id int NOT NULL,name varchar (100) NOT NULL,age int); // db_name位数据库名,创建表时需要指定表属于哪个数据库,如果设置了默认数据库,则无需使用 此命令 // col1为列名 // datatype为数据类型 // 修饰符有NULL,NOT NULL,PRIMARY KEY,UNIQUE KEY等 // ENGINE为数据引擎 MariaDB [mydb]> CREATE TABLE students(id int UNSIGNED NOT NULL PRIMARYKEY,name VARCHAR(20) NOT NULL,age Tinyint UNSIGNED); // 定义id字段为无符号整数,并且要求为非空,且为主键 // 定义name字段为可变字符,长度限制为20,并且要求为非空 // 定义age字段为无符号Tinyint
可以定义单个字段为主键,也可以定义多个字段为主键,只要多个字段联合起来不相同即可
例:
MariaDB [mydb]> CREATE TABLE tbl2(id int UNSIGNED NOT NULL,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name)); // PRIMARY KEY(id,name) // 这里定义id和name同时为主键,只要id+name不重复即可
获取帮助:
MariaDB [mydb]> HELP CREATE TABLE;
ENGINE即数据库引擎,也称之为表类型,查看表类型列表命令如下:
MariaDB [mydb]> SHOW ENGINES;
表格存储格式:
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
查看表:
SHOW TABLES [FROM db_name];
例:
MariaDB [mydb]> SHOW TABLES FROM mydb;
查看表结构:
MariaDB [mydb]> DESC [DB_NAME.]tb_name;
例:
MariaDB [mydb]> DESC mydb.mytb1;
查看表创建命令:
MariaDB [mydb]> SHOW CREATE TBALE tbl_name;
例:
MariaDB [mydb]> SHOW CREATE TABLE mytb1;
查看表状态:
MariaDB [mydb]> SHOW TABLE STATUS LIKE 'tbl_name'[\G]
例:
MariaDB [mydb]> SHOW TABLE STATUS LIKE mytb1 \G; // \G表示竖排显示
删除表:NOTE:删除操作不可逆且不可恢复。
DROP TABLE [IF EXISTS] tb_name;
例:
MariaDB [mydb]> DROP TABLE IF EXISTS mytb1;
修改表操作:
使用ALTER TABLE命令,这个命令下有很多子命令
添加字段:
ALTER TABLE tbl_name ADD col1 data_type [FIRST|AFTER col_name]
例:
MariaDB [mydb]> ALTER TABLE students ADD age ENUM('m','f') FIRST; 即在students表中添加一个字段age,其字符类型为枚举型,只能为m或f,且位于第一个字段
ADD子命令还可以单独添加字段的约束
例:
Maria DB [mydb]> ALTER TABLE students ADD UNIQUE KEY(name);
删除字段:
ALTER TABLE students DROP COLUMN col_name;
例:
MariaDB [mydb]> ALTER TABLE students DROP COLUMN age; 意为删除students表中的age字段
修改字段名和字段属性:(无法单独修改字段属性)
ALTER TABLE students CHANGE col_name col_name_new data_type options;
例:
MariaDB [mydb]> ALTER TABLE students CHANGE age ages int UNSIGGNED NOT NULL; 意为修改students表的字段age为ages,并且设置类型为int的无符号,不能为空
NOTE:需要注意的是,CHANGE命令修改字段属性时,必须修改字段名,不能只修改字段属性,而不修改字段名,但修改字段名时,可以不修改字段属性。
修改字段属性:
ALTER TABLE MODIFY col_name data_type options;
例:
MariaDB [mydb]> ALTER TABLE MODIFY age int; 只修改字段属性
索引:
索引是特殊数据结构,定义在查找时作为查找条件的字段;可加速查询速度,缺点是会占据额外空间
索引可以有额外名称;如果不设置名称,并且是单键索引,那么索引名称默认为字段名
创建索引:
CREATE INDEX index_name ON tbl_name (index_col_name,...);
例:
MariaDB [mydb]> CREATE INDEX myindex ON students (id); // 这里是为students表的id字段创建索引,且命名为myindex MariaDB [mydb]> CREATE INDEX myindex2 ON students (age,name); // 这里是为students表达age和name字段创建联合索引,且命名为myindex2
删除索引:
DROP INDEX index_name ON tbl_name;
例:
MariaDB [mydb]> DROP INDEX myindex ON students; // 这里是删除表students中的名为myindex索引
ALTER TABLE tbl_name DROP INDEX(col_name);
例:
MariaDB [mydb]> ALTER TABLE students DROP INDEX(age); // 这里是删除表students中的age字段上的索引
添加索引:
ALTER TABLE tbl_name ADD INDEX(col_name);
MariaDB [mydb]> ALTER TABLE students ADD INDEX(age); // 这里是给表students的age字段添加索引
查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
MariaDB [mydb]> SHOW INDEXES FROM mydb.students; // 这里是显示出mydb数据库下的students表中的所有索引
数据操作:
插入数据:
INSERT [INTO] tbl_name [(col_name,...)] (VALUES | VALUE) (VAL1,...),(...),...
例:
MariaDB [mydb]> INSERT INTO students VALUES (1,'li','m'),(2,'wa','f'); 可以一次性插入所有字段的数据 MariaDB [mydb]> INSERT INTO students (sid,name) VALUES (3,'zz'),(4,'dd'); 也可以插入指定字段的数据
查询数据:
SELECT col1,col2,...FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
ORDER BY 'col_name' 根据col_name升序排序
ORDER BY 'col_name' DESC 根据col_name降序排序
ORDER BY 'col_name' DESC LIMIT 4 根据col_name降序排序,只显示4个
ORDER BY 'col_name' DESC LIMIT 1,2 根据col_name降序排序,并且偏移1个,显示2个
col_name可用'*'指代所有字段
as:字段别名,col1 AS alias_name
例:
MariaDB [mydb]> select sid AS stuid,name AS stuname FROM students; 查询students表中sid和name的所有字段数据,并将sid临时改名为stusid,将name临时改名为stuname
操作符:
(1)<,>,>=,<=,==,!=
(2)BETWEEN...AND...
例:
MariaDB [mydb]> SELECT * FROM students WHERE sid>=2 and sid<=4; MariaDB [mydb]> SELECT * FROM students WHERE sid BETWEEN 2 AND 4; // 上面两个示例的作用相同,都是删选sid大于等于2,小于等于4的所有数据。
(3)LIKE
通配符:% 表示任意长度的任意字符;
_ 表示任意单个字符;
例:
MariaDB [mydb]> SELECT * FROM students WHERE name LIKE 'z%'; // 这里表示在students表中查找name字段为z开头的任意长度的任意字符的数据
(4)RLIKE
基于正则表达式作字符匹配
例:
MariaDB [mydb]> SELECT * FROM students WHERE name RLIKE '.*u.*'; // 这里表示在students表中查找name字段中包含u字母的数据
(5)IS NULL 为空
IS NOT NULL 为非空
例:
MariaDB [mydb]> SELECT * FROM students WHERE name IS NULL; // 这里表示在students表中查找name字段为空的数据 MariaDB [mydb]> SELECT * FROM students WHERE name IS NOT NULL; // 这里表示在students表中查找name字段为非空的数据
条件逻辑操作:
and 与
or 或
not 非
例:
MariaDB [mydb]> SELECT * FROM students WHERE sid >=2 AND sid <= 4; // 这里表示查找students表中sid小于等于4且大于等于2的数据 MariaDB [mydb]> SELECT * FROM students WHERE sid >=2 OR name == 'zi'; // 这里表示查找students表中sid大于等于2或者name为zi的数据 MariaDB [mydb]> SELECT * FROM students WHERE NOT sid >=2; // 这里表示查找students表中sid小于2的数据,即sid>=2取反
删除数据:
DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m],n];
例:
MariaDB [mydb]> DELETE FROM students where sid == 3; // 这里表示删除students表中sid为3的所有行数据
NOTE:需要注意的是,如果DELETE FROM tbl_name后不接条件语句,那么默认会删除整张表的数据。
更新数据:
UPDATE tbl_name SET col1=new_val1,col2=new_val2,...[WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m],n];
例:
MariaDB [mydb]> UPDATE students SET name='zi',age=16 WHERE id == 4; // 这里表示修改students表中的id为4的行的name字段为zi,age为16
用户帐号及权限管理:
用户帐号格式:USERNAME@HOST
USERNAME:用户名
HOST:此用户访问mysqld服务时允许通过哪些主机远程创建连接:其中可以是IP,主机名,通配符(%和_);
创建用户:
CREATE USER USERNAME@HOST [IDENTIFIED BY 'PASSWORD'];
例:
MariaDB [mydb]> CREATE USER user1@localhost IDENTIFIED BY 'redhat'; 这里表示创建一个用户名为user1且密码为redhat的用户,且此用户只能通过本机登录
删除用户:
DROP USER 'USERNAME@LOCALHOST;
例:
MariaDB [mydb]> DROP USER user1@localhost; 这里表示删除可以通过本机登录的用户user1
用户授权:
权限分类:管理,数据库,表,字段,存储例程(存储过程,存储函数,触发器)等;
GRANT priv_type,...ON [object_type] db_name.tb_name TO 'USERNAME@HOST' [IDENTIFIED BY 'PASSWORD'] [WITH GRANT OPTION];
意为:给予指定登录位置的指定用户在指定数据库的指定表中的指定权限;
选项:
priv_type:ALL | [PRIVILEGES],ALL表示所有权限
db_name.tb_name:
*.*:所有数据库的所有表;
db_name.*:制定库的所有表;
db_name.tb_name:指定库的指定表;
db_name.routing_name:制定库的存储例程;
WITH GRANT OPTION:意味着指定用户可以把自己的所有权限转授(复制)到其他的用户;
例:
MariaDB [mydb]> GRANT SELECT,DELETE ON mydb.students TO user1@localhost; // 这里表示给只能在本机登录的user1用户赋予在mydb数据库中的students表的查询及删除权限
NOTE:需要注意的是,如果用户不存在,这可以在指定用户的时候加上IDENTIFIED BY PASSWORD即可创建新用户并同时指定密码
查看用户权限:
SHOW GRANTS FOR USERNAME@HOST;
查看指定用户的权限
SHOW GRANTS FOR CURRENT_USER;
查看当前用户的权限
例:
MariaDB [mydb]> SHOW GRANTS FOR user1@localhost // 这里表示查看限制本机登录的用户user1的权限
回收用户权限:
REVOKE priv_type,...ON db_name.tb_name FROM USERNAME@HOST;
例:
MariaDB [mydb]> REVOKE DELETE ON mydb.students FROM user1@localhost; // 这里表示从限制本机登录的用户user1权限中回收在mydb数据库中的students表的DELETE权限
注意:MariaDB服务进程启动时会读取mysql数据库中的所有授权表至内存中;
(1)GRANT或REVOKE等执行权限操作会保存于授权表中,MariaDB的服务进程会自动重读授权表;
(2)对于不能够或不能及时重读授权表的命令执行后,可手动让MariaDB的服务进程重读授权表;
重读授权表命令:FLUSH PRIVILEGES;
写的比较潦草,如有遗漏错误和争议之处,欢迎大家的批评指正和讨论,谢谢。