一、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;