MySQL语言概述
MySQL语言主要分为以下几种:
(1)DDL(Data Definition Language):
数据定义语言.用于数据库、数据表的定义
(2)DML(Data Manipulation Language):
数据操作语言.用于操作表格记录(插入、更新、删除)
(3)DCL(Data Control Language):
数据控制语言.创建用户、分配权限、设置安全级别
(4)DQL(Data Query Language):
数据查询语言
注意:所有的语句可根据自己的喜好大写小写都可以
所有语句以英文字符的 " ; "结尾
DDL(Data Definition Language)数据定义语言的语法
显示所有数据库
SHOW DATABASES;
创建数据库
GREATE DATABASE[IF NOT EXISTS] 数据库名;
删除数据库
DROP DATABASE[IF EXISTS] 数据库名;
修改数据库的编码
ALTER DATABASE 数据库名 CHARACTER SET 字符集名;
创建表
#首先得切换到需要建表的数据库下:
USE 数据库名;
#创建表
GREATE TABLE[IF NOT EXISTS] 表名 (
列名1 数据类型1;
列名2 数据类型2;
...............
);
查看表结构
DESC 表名;
删除表格
DROP 表名;
修改表
a.往表内添加列
ALTER TABLE 表名 ADD (
列名 数据类型,
列名 数据类型,
...........
);
b.修改列的数据类型:
ALTER TABLE 表名 MODIFY 列名 新数据类型;
c.修改列名:
ALTER TABLE 表名
CHANGE 原列名 新列名 数据类型;
d.删除列:
ALTER TABLE 表名 DROP 列名;
e.修改表名称:
ALTER TABLE 原表名 RENAME TO 新表名;
DML(Data Manipulation Language) 数据操作语言的用法
插入数据
#向指定列插入数据
#插入的数据的顺序必须对应列名的顺序
INSERT INTO 表名 (列名1,列名2,....) VALUES (列1对应的数据,列2对应的数据.....);
#向所有列插入数据时可以不用写列名,但是数据必须与列的顺序相对应
INSERT INTO 表名 VALUES (列1对应的数据,列2对应的数据.....);
修改数据
# WHERE 语句写入修改条件,没有条件可以不写
UPDATE 表名 SET 列名1 = 值1, … 列名n = 值n [WHERE 条件];
删除数据
# 删除满足条件的记录:
# 若没有where子句,则删除表格中的所有记录,保留表结构
DELETE [列名1,列名2,...] FROM 表名 [WHERE 条件];
# 删除数据:
TRUNCATE TABLE 表名;
注:
DELETE 和 TRUNCATE 的区别
(a)TRUNCATE 删除过程是先drop table,然后再create Table 效率比 DELETE 高
(b)TRUNCATE 删除无法回滚, DELETE 删除可以回滚
DCL(Data Control Language) 数据控制语言
创建用户
CREATE USER '用户名'@地址 IDENTIFIED BY '密码';
DQL(Data Query Language) 数据查询语言
基础查询
# 查询所有列
SELECT * FROM 表名;
# 查询指定列
SELECT 列名1,列名2... FROM 表名 ;
#有条件的查询
SELECT [列名1,列名2...] FROM 表名 WHERE [条件] ;
条件查询
条件运算符:
> (大于),< (小于),>= (大于等于),<= (小于等于),<> (不等于),= (等于)
谓词:
# 两个值之间,包含两个值
BETWEEN a AND b ;
#存在于
IN
#不存在于
NOT IN
#或者
OR
#和
AND
#非
NOT
#为空
IS NULL;
模糊查询
类似于Java中的字符串匹配,可以匹配一个字符,也可以匹配多个字符
#使用模糊查询的时候主要使用 'LIKE' 进行匹配
% :表示0个或多个字符,可以匹配任意类型和长度的字符
SELECT * FROM table WHERE name LIKE '刘%';(从table中查询name列为'刘'开头的所有行
_ :表示任意单个字符
SELECT * FROM table WHERE name LIKE '刘_';(从table中查询name列为'刘*'的所有行
字段控制查询
#去重主要使用'DISTINCT'关键字
SELECT DISTINCT name FROM Stu;
在Stu表中查询所有不重复的名字
#查询时对列进行计算
SELECT Score*10 FROM Stu;
将Score列的所有值分别*10
#查询时使用'IFNULL'将null值转为0
SELECT Score IFNUll FROM Stu;
从Stu表中查询Score,如果 Score值为NUll 则表现为0
#给列添加别名
SELECT c.Score core FROM Stu c;
'c'是表Stu的别名 core是 c.Score 的别名
#使用'ORDER BY'对查询数据进行排序;'DESC'为降序,'ASC'为升序;不写默认为升序
SELECT * FROM Stu ORDER BY score DESC;
查询结果根据score的降序排列
SELECT * FROM Stu ORDER BY score ASC;
查询结果根据score的升序排列
聚合函数·
# COUNT(列名) 计算有多少条记录
SELECT COUNT(Score) FROM Student;
#SUM(列名) 计算列所有值的和
SELECT SUM(Score) FROM Student;
#AVG(列名) 计算列的所有值的平均值
SELECT AVG(Score) FROM Student;
#MAX(列名) 计算列的所有值的最大值
SELECT MAX(Score) FROM Student;
#MIN(列名) 计算列的所有值的最小值
SELECT MIN(Score) FROM Student;
分组查询
#使用'GROUP BY'进行分组
SELECT * FROM Stu GROUP BY (Score);
以Score的值进行分组查询
#'GROUP BY' 搭配 'HAVING' 进行查询,'HAVING' 后跟条件
SELECT * FROM Stu GROUP BY (Score) HAVING Score>80;
以Score的值进行分组查询,选其中Score值大于80的
分页查询
使用'LIMIT'关键字进行查询
SELECT * FROM Stu LIMIT 0,2;
查询前两行
多表连接查询
#表与表的并集使用 'UNION'
#把具有**相同字段数目和字段类型**的两个或多个表合并到一起
SELECT * FROM dept UNION SELECT * FROM dept;
#连接(JOIN):
#内连接(INNER JOIN... ON):INNER JOIN...ON...
SELECT * FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;
通过两个表的deptno值相等,将两个表连接起来
#左外连接(LEFT JOIN....ON....):
又称为左连接。保留左表中的所有记录,右表中没有匹配的记录显示为Null
SELECT * FROM emp LEFT JOIN dept ON emp.deptno=dept.deptno;
#右外连接(RIGHT JOIN....ON....):
#又称为右连接。保留右表中的所有记录,左表中没有匹配的记录显示为Null
SELECT * FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno;
多表连接查询的缺点:性能差.(先进行两个表的笛卡尔积,然后再从笛卡尔积中找出满足条件的记录)
子查询
子查询就是查询语句的嵌套
(1)from子句中的子查询:返回一个临时的表,然后从临时表查询符合条件的记录
SELECT * FROM (SELECT * FROM emp);
#将'SELECT * FROM emp'查询出的当作一个表
(2)where子句中的子查询:子查询的返回值作为主查询的查询条件
SELECT sid FROM emp WHERE sid IN (SELECT sid FROM stu);
SELECT sid FROM emp WHERE sid =ANY (SELECT sid FROM stu);
SELECT sid FROM emp WHERE sid IN ALL(SELECT sid FROM stu);
SELECT sid FROM emp WHERE sid EXISTS (SELECT sid FROM stu);
#将'sid IN (SELECT sid FROM stu)'作为条件
子查询常用关键字:
IN,ANY,ALL,EXISTS
#'IN' 'ANY' 意为'存在'
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept);
SELECT * FROM emp WHERE deptno =ANY(SELECT deptno FROM dept);
#'=ANY'与'IN'的查询意义是一样的
#'ALL'
SELECT * FROM emp WHERE deptno =ALL(SELECT deptno FROM dept);
#'EXISTS'
SELECT empno FROM emp WHERE EXISTS(SELECT empno FROM emp WHERE job='SALESMAN');