MySQL常用语句总结

一、SQL的分类

1、DDL:数据定义语言
2、DML:数据操作语言
3、DCL:数据控制语言
4、DQL:数据查询语言(从DML中抽取出来的)

二、DDL

(一)操作数据库

1、创建数据库查看所有数据库名称:

CREATE DATABASE [IF NOT EXISTS] mydb1;

2、切换数据库:

USE mydb1,  -- 切换到mydb1数据库;

3、查看所有数据库名称:

SHOW DATABASES;

4、删除数据库

DROP DATABASE [IF EXISTS] mydb1;

5、修改数据库编码

ALTER DATABASE mydb1 CHARACTER SET utf8
(二)操作表

1、创建表

CREATE TABLE stu(
	sid	    CHAR(6),
	sname	VARCHAR(20),
	age		INT,
	gender	VARCHAR(10) 
);

2、查看当前数据库中所有表名称

SHOW TABLES;

3、查看指定表的创建语句

SHOW CREATE TABLE emp	-- 查看emp表的创建语句;

4、查看表结构

DESC emp 	-- 查看emp表结构;

5、删除表

DROP TABLE emp 	-- 删除emp表;

6、修改表

1.修改之添加列:给stu表添加classname列:
	ALTER TABLE stu ADD (classname varchar(100));
2.修改之修改列类型:修改stu表的gender列类型为CHAR(2):
	ALTER TABLE stu MODIFY gender CHAR(2);
3.修改之修改列名:修改stu表的gender列名为sex:
	ALTER TABLE stu change gender sex CHAR(2);
4.修改之删除列:删除stu表的classname列:
	ALTER TABLE stu DROP classname;
5.修改之修改表名称:修改stu表名称为student:
	ALTER TABLE stu RENAME TO student;

三、DML

1、插入数据

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');

INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

2、修改数据

UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;
UPDATE stu SET gender=’female’ WHERE gender IS NULL
UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;

3、删除数据

DELETE FROM stu WHERE sid=’s_1001’003B

DELETE FROM stu;

4、查询数据(在后面有详细总结)

四、DCL

1、创建用户

CREATE USER 用户名@地址 IDENTIFIED BY '密码';

CREATE USER user1@localhost IDENTIFIED BY ‘123’; 
	-- user1用户只能在localhost这个IP登录mysql服务器
CREATE USER user2@’%’ IDENTIFIED BY ‘123’;
	-- user2用户可以在任何电脑上登录mysql

2、给用户授权

GRANT 权限1, … , 权限n ON 数据库.* TO 用户名

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
GRANT ALL ON mydb1.* TO user2@localhost;

3、查看用户权限

SHOW GRANTS FOR 用户名

SHOW GRANTS FOR user1@localhost;

4、撤销授权

REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名

REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;

5、删除用户

DROP USER 用户名

DROP USER user1@localhost;

6、修改用户密码

USE mysql;
UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;
FLUSH PRIVILEGES;

USE mysql;
UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;
FLUSH PRIVILEGES;

五、DQL

(一)数据查询语法
SELECT selection_list 			/*要查询的列名称*/
FROM table_list 				/*要查询的表名称*/
WHERE condition 				/*行条件*/
GROUP BY grouping_columns 	 	 /*对结果分组*/
HAVING condition 				/*分组后的行条件*/
ORDER BY sorting_columns 		 /*对结果分组*/
LIMIT offset_start, row_count 	 /*结果限定*/

(二)常见查询方式

1、基础查询

SELECT * FROM stu;				 -- 查询所有列

SELECT sid, sname, age FROM stu;  -- 查询指定列

2、条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL;
AND;
OR;
NOT;

/*查询性别为女,并且年龄50的记录*/
SELECT * FROM stu 
WHERE gender='female' AND ge<50;

/*查询学号为S_1001,S_1002,S_1003的记录*/
SELECT * FROM stu 
WHERE sid IN ('S_1001','S_1002','S_1003');

/*查询年龄为null的记录*/
SELECT * FROM stu
WHERE age IS NULL;

3、模糊查询

/*查询姓名以“z”开头的学生记录*/
SELECT * 
FROM stu
WHERE sname LIKE 'z%';

/*查询姓名中第2个字母为“i”的学生记录*/
SELECT * 
FROM stu
WHERE sname LIKE '_i%';

4、字段控制查询

/*去除重复记录*/
SELECT DISTINCT sal FROM emp;

/*查看雇员的月薪与佣金之和*/
SELECT *,sal+comm FROM emp;

/*comm列如果有记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:*/
SELECT *,sal+IFNULL(comm,0) FROM emp;

/*给列名添加别名*/
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
SELECT *,sal+IFNULL(comm,0) total FROM emp; -- 省略AS关键字

5、排序

/*查询所有学生记录,按年龄降序排序*/
SELECT *
FROM stu
ORDER BY age DESC;

/*查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序*/
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;

6、聚合函数

聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

/*查询emp表中月薪大于2500的人数*/
SELECT COUNT(*) FROM emp
WHERE sal > 2500;

/*查询最高工资和最低工资*/
SELECT MAX(sal), MIN(sal) FROM emp;

/*查询所有雇员月薪和*/
SELECT SUM(sal) FROM emp;

/*统计所有员工平均工资*/
SELECT AVG(sal) FROM emp;

7、分组查询

/*查询每个部门的部门编号以及每个部门的人数*/
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;

/* HAVING子句 */
/*查询工资总和大于9000的部门编号以及工资和*/
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

-- 或者
SELECT deptno, SUM(sal) total
FROM emp
GROUP BY deptno
HAVING total > 9000;

8、LIMIT

-- LIMIT用来限定查询结果的起始行,以及总行数。

/*查询5行记录,起始行从0开始*/
SELECT * FROM emp LIMIT 0, 5;

/*查询10行记录,起始行从3开始*/
SELECT * FROM emp LIMIT 3, 10;

(三)多表查询

1、合并结果集

作用:合并结果集就是把两个select语句的查询结果合并到一起!

合并结果集有两种方式:
UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

要求:被合并的两个结果:列数、列类型必须相同

SELECT * FROM cd
UNION 
SELECT * FROM ab;

2、内连接

-- 特殊用法(不建议使用)
SELECT e.ename, e.sal, d.dname
FROM emp e, dept d  
WHERE e.deptno = d.deptno;

-- 标准用法(建议使用)
SELECT e.ename, e.sal, d.dname
FROM emp e INNER JOIN dept d 
ON e.deptno=d.deptno

3、外连接(左连接、右连接)
外连接的特点:查询出的结果存在不满足条件的可能。
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

-- 左外连接
SELECT e.ename, e.sal, d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno

右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

-- 右外连接
SELECT e.ename, e.sal, d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno

-- 全外连接(mysql不支持全外连接,但是我们可以使用合并结果集来达到同样的效果),了解即可
SELECT e.ename, e.sal, d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno
UNION
SELECT e.ename, e.sal, d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno

4、自然连接
两张连接的表中名称和类型完成一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!

-- 自然连接(可读性较差,不建议使用)
/* 自然连接的原理:使用该方法,mysql会自动的去找两张表中相同的列,然后列值相同的记录进行匹配后输出*/
SELECT e.ename, e.sal, d.dname
FROM emp e NATURAL JOIN dept d

-- 自然连接其他的查找条件的方式
SELECT * FROM emp NATURAL JOIN dept;
SELECT * FROM emp NATURAL LEFT JOIN dept;
SELECT * FROM emp NATURAL RIGHT JOIN dept;

5、子查询
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
where后,作为条件的一部分;
from后,作为被查询的一条表;

/* 找出本公司工资最高的员工信息 */		-- 单行单列
SELECT * FROM emp where sal=(SELECT max(sal) FROM emp)	

/* 找出本公司中高于30部门所有员工工资的员工信息 */	-- 多行一列
SELECT * 
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)

/* 查询工资和部门与殷天正完全相同的员工信息 */
/* 即:找出殷天正所在部门中,和他工资相同的员工信息 */	-- 单行多列
SELECT * 
FROM emp
WHERE (sal, deptno) IN (SELECT sal,deptno FROM emp WHERE ename='殷天正')

/* 可以对查询出的表进行二次查询 */
/*例如:先找出30部门的所有员工,然后找出奖金不为空的员工姓名和工资*/ 	-- 多行多列
SELECT e.ename, e.sal 
FROM (SELECT * FROM emp WHERE deptno=30) e		
WHERE comm IS NOT NULL;

/*
1、单行单列:表示条件,相当于聚合函数的作用,通常用于where中
2、单行多列:相当于一个对象,比较少见
3、多行单列:相当于一个集合
4、多行多列:表示一个查询出来的表,通常用在from中,进行二次查询
*/

六、完整性约束

1、主键约束
当某一列添加了主键约束后,具有以下特点:
a. 非空
b. 唯一
c. 被其他表引用

/*创建表:定义列时指定主键*/
CREATE TABLE stu(
	sid	    CHAR(6) PRIMARY KEY,
	sname	VARCHAR(20),
	age		INT,
	gender	VARCHAR(10) 
);

/*创建表:定义列之后独立指定主键*/
CREATE TABLE stu(
	sid	    CHAR(6),
	sname	VARCHAR(20),
	age		INT,
	gender	VARCHAR(10),
	PRIMARY KEY(sid)
);

/*修改表时指定主键*/
ALTER TABLE stu
ADD PRIMARY KEY(sid);

/*删除主键(只是删除主键约束,而不会删除主键列)*/
ALTER TABLE stu 
DROP PRIMARY KEY;

2、主键自增长
MySQL提供了主键自动增长的功能!这样用户就不用再为是否有主键,是否重复而烦恼了。当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。

/*创建表时设置主键自增长(主键必须是整型才可以自增长)*/
CREATE TABLE stu(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname	VARCHAR(20),
	age		INT,
	gender	VARCHAR(10)
);

/*修改表时设置主键自增长*/
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

/*修改表时删除主键自增长*/
ALTER TABLE stu CHANGE sid sid INT;

3、非空约束
指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。

指定非空约束:
CREATE TABLE stu(
		sid INT PRIMARY KEY AUTO_INCREMENT,
		sname VARCHAR(10) NOT NULL,
		age		INT,
		gender	VARCHAR(10)
);

4、唯一
还可以为字段指定唯一约束!当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!

CREATE TABLE tab_ab(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(10) UNIQUE
);

5、外键约束
主外键是构成表与表关联的唯一途径!
外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。

/*创建t_user表,指定uid为主键列*/
CREATE TABLE t_user(
	uid	INT PRIMARY KEY AUTO_INCREMENT,
	uname	VARCHAR(20) UNIQUE NOT NULL
);

/*创建t_section表,指定sid为主键列,u_id为相对t_user表的uid列的外键*/
CREATE TABLE t_section(
	sid	INT PRIMARY KEY AUTO_INCREMENT,
	sname	VARCHAR(30),
	u_id	INT,
	CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
);

/*修改t_section表,指定u_id为相对t_user表的uid列的外键*/
ALTER TABLE t_section 
ADD CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid);

/*修改t_section表,删除u_id的外键约束*/
ALTER TABLE t_section
DROP FOREIGN KEY fk_t_user;

七、编码相关命令

1、查看MySQL编码
SHOW VARIABLES LIKE 'char%';
2、修改character_set_client变量
set character_set_client=gbk;
3、修改character_set_results变量
set character_set_results=gbk;

原文地址:https://www.cnblogs.com/Java-biao/p/12763575.html