SQL语言
SQL语言分类
DDL:数据定义语言,用来定义数据库对象:库,表,列等等。创建,删除,修改表和库的结构
DML:数据操作语言,用来操作数据库记录进行更新,增删改表的记录
DQL:数据查询语言,用来对表的记录进行查询
DCL:数据控制语言,用来定义表的访问权限和安全级别,对用户的创建及授权
DDL
1.数据库
查看所有数据库:SHOW DATABASES;
切换数据库:USE 数据库名;
创建数据库:CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET=utf8];
删除数据库:DROP DATABASE [IF EXISTS] 数据库名;
修改数据库编码:ALTER DATABASE 数据库名 CHARACTER SET utf8;
2.数据类型(列类型)
int:整形
double:浮点型,例如double(5,2) 意味最多五位,其中包含两位小数,即最大为999.99
decimal:浮点型,在表示钱方面比较好,因为不会出现精度缺失
char:固定长度字符串类型,例char(255)。最长255,数据长度不足指定长度会补足到指定长度
varchar:可变长度字符串类型。在内存中会至少花一个字节来记录长度。虽然好,但是相比char来说会浪费一定的空间。
text(clob):字符串类型,分为很小,小,中,大,四种长度。
blog:字节类型,分为很小,小,中,大,四种长度。
data:日期类型,格式为yyyy-mm-dd
time:时间类型,格式为hh:mm:ss
timestamp:时间戳类型,既有日期,又有时间
3.表
创建表
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
......
列名 列类型
);
1 CREATE TABLE TB_STU( 2 NUMBER CHAR(8), 3 NAME VARCHAR(50), 4 AGE INT, 5 GENDER VARCHAR(10) 6 );
查看当前数据库中所有表的名称
SHOW TABLES;
查看表结构
DESC 表名称;
删除表
DROP 表名称;
修改表
前缀:ALTER TABLE 表名
添加列:
ALTER TABLE 表名
ADD(
列名 列类型,
列名 列类型,
.......
列名 列类型
);
修改列类型:
ALTER TABLE 表名
MODIFY 列名 列新的类型;
修改列名:
ALTER TABLE 表名
CHANGE 原类名 新类名 列类型;
删除列:
ALTER TABLE 表名
DROP 列名;
修改表名称:
ALTER TABLE 表名
RENAME TO 新表名;
DML
插入数据
INSERT INTO 表名(列名1,列名2....) VALUES (列值1,列值2.....);
插入部分列,没插入的数据默认为NULL
没指定插入列,默认插入所有列,且值的顺序应为表中列的顺序。
修改记录
UPDATE 表名 SET 列名1=列值1,列名2=列值2; 更新列中所有的值
UPDATE 表名 SET 列名1=列值1,列名2=列值2 WHERE 条件; 更新符合特定条件的列中的值
条件必须是一个BOOLEAN类型的值或表达式,运算符:=,!=,<>,>,<,>=,<=,BETWEEN...AND,IN(.....),OR,AND,NOT,IS NULL,IS NOT NULL
注意,xxx=null,这个结果一定是false,如果想要找出某一个元素是NULL,要使用IS NULL这个运算符
删除数据
DELETE FROM 表名 (WHERE 条件);
DCL
一个项目创建一个用户,一般一个项目对应的数据库只有一个,这个用户只能对这个数据库有权限,其他的数据库操作不了。
创建用户
CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
用户只能在指定的IP地址上登录
CREATE USER 用户名@‘%’IDENTIFIED BY ‘密码';
用户可以在任意IP地址上登录
给用户授权
GRANT 权限1, 权限2.....权限n ON 数据库 .* TO 用户名@IP地址
例如 GRANT SELECT, ALTER, DELETE, INSERT, UPDATE........... ON MYDB1.* TO ZHANGSAN@LOCALHOST;
要想赋予全部权限,可以写成 GRANT ALL ON MYDB1.* TO ZHANGSAN@LOCALHOST;
撤销权限
REVOKE 权限1,权限2......权限n ON 数据库.* FROM 用户名@IP地址
查看用户的权限
SHOW GRANTS FOR 用户名@IP地址;
删除用户
DROP USER 用户名@IP地址;
DQL
DQL是数据查询语言
基本查询
字段控制
查询所有列
SELECT * FROM 表名; 其中*表示所有列
指定列查询
SELECT 列1,列2,列3..... FROM 表名;
完全重复的记录只记录一次
SELECT DISTINCT 列1,列2..... FROM 表名;
列运算
数量类型的列可以加减乘除
SELECT 列1*1.2, 列2+列3..... FROM 表名;
无法转换为整数的数据会被当成0来计算,如果有NULL数值加入计算,则结果为NULL,如果不想要NULL,可以把NULL转化为其他的值,方法为 SELECT 列1*IFNULL(列名 , 想转化的值) FROM 表名;
字符串不能用加减乘除运算,会被当成0,如果想合并字符串,需要用特殊的函数
CONCAT(列1,列2,字符串.....)
给列起别名 SELECT 列名 AS 别名 FROM 表名;
AS可以省略
条件查询
SELECT 列名 FROM 表名 WHERE 条件;
模糊查询
SELECT 列名 FROM 表名 WHERE 某列 LIKE 'XXX';
表示在表中利用模糊条件查询,查询的条件是某一列的值类似于XXX。
XXX中有两个特殊符号,一种是_另一种是%,下划线表示的是单个字符,百分号表示0到无穷个字符。如果限定省略的字符数量,可以用_来表示,如果不限定省略的字符数量,用%表示。
排序
单条件查询
SELECT 列名 FROM 表名 ORDER BY 列名 ASC;
SELECT 列名 FROM 表名 ORDER BY 列名 DESC;
ASC表示升序查询,DESC表示降序查询。
多条件查询
SELECT 列名 FROM 表名 ORDER BY 列名1 ASC/DESC, 列名2 ASC/DESC, 列名3 ASC/DESC.....;
表示按照多种条件排序,排序权重按照从左到右依次递减,当高权重排序方式排出的两个元素相同时,继续按照下一权重排序方式排序。
如下所示,先按照性别顺序排序,再按照年龄降序排序
聚合函数
查询数量
SELECT COUNT(列名) FROM 表名;
查询某一列的数量,当括号内为*时,查询整个表中元素数量。当所选列的某一行的该列的值为NULL时,计数器不会加一。当括号内为*时,当且仅当某一行的所有列的值都是NULL时计数器才不会加一。
特殊情况,当括号内是一个数字的时候,这个数字没有任何意义,它在这里的作用和*一摸一样。
查询总和
SELECT SUM(列名) FROM 表名;
将每一行的指定列的值相加求和,非数值变量当作1来看待
查询最大最小值
SELECT MAX/MIN(列名) FROM 表名;
查询平均值
SELECT AVG(列名) FROM 表名;
同时查询
在后面添加多个条件即可,同时可以设置显示栏目名称。
分组查询
SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名;
表示分组查询,按组别显示聚合函数。
为什么前后两个列名要一致呢?因为如果不一致分组就没有意义,既然按照后面的列分组了,前面就要显示这个列的名字。当然可以交换顺序,但是保持前后列名一致是很有必要的。
除了分组列,能查询的就只有聚合函数了。别的列和你分的组对不上号,没有任何意义!
在这个基础上,可以增加一些条件,例如:
HAVING 关键字
表示筛选包含某种条件的元素。
例如:
分组前条件用WHERE,分组后条件用HAVING
Mysql特有语句
LIMIT语句:
SELECT 列名 FROM 表名 LIMIT a,b;
表示从第a行开始,查询b行数据,如果b超过了总行数,那么查询到末尾即可。
关键字顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY