MySQL基本使用
客户登录操作
-
登录服务器:mysql -uroot -p123 -hlocalhost
-u:后面跟随用户名 -p:后面跟随密码 -h:后面跟随IP
-
退出服务器:exit或quit
SQL语句分类
-
DDL(Data Definition Language):数据定义语言
创建、删除、修改 库、表结构
-
DML(Data Manipulation Language):数据操作语言
增、删、改 表记录
-
DCL(Data Control Language):数据控制语言
用来定义访问权限和安全级别
-
DQL(Data Query Language):数据查询语言
用来查询记录
DDL 数据定义语言
1. 数据库
- 查看所有数据库:SHOW DATABASES
- 切换(选择要操作的)数据库:USE 数据库名
- 创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb [CHARSET=utf8]
- 删除数据库:DROP DATABASE [IF EXISTS] mydb
- 修改数据库编码:ALTER DATABASE mydb CHARACTER SET utf8
2. 表
-
创建表:
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型,
列名 列类型,
…
列名 列类型
); -
查看当前数据库中所有表名称:SHOW TABLES;
-
查看指定表的创建语句:SHOW CREATE TABLE 表名;
-
查看表结构:DESC 表名;
-
删除表:DROP TABLE 表名;
TRUNCATE TABLE 表名:它是先drop该表,再create该表。事务 无法回滚
-
修改表:ALTER TABLE 表名
-
添加列:
ALTER TABLE 表名 ADD ( 列名 列类型, 列名 列类型, ... );
-
修改列类型:
如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据 ALTER TABLE 表名 MODIFY 列名 列类型;
-
修改列名:
ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
-
删除列:
ALTER TABLE 表名 DROP 列名;
-
修改表名称:
ALTER TABLE 原表名 RENAME TO 新表名;
-
DML 数据操作语言
1. 插入数据
-
INTERT INTO 表名(列名1,列名2, …) VALUES(列值1, 列值2, …);
在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
-
INTERT INTO 表名 VALUES(列值1, 列值2)
没有给出要插入的列,那么表示插入所有列。 值的个数必须是该表列的个数。 值的顺序,必须与表创建时给出的列的顺序相同。
2. 修改数据
-
UPDATE 表名 SET 列名1=列值1, 列名2=列值2, … [WHERE 条件]
-
条件(条件可选的):
条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1'; 运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND ------------------------------------------------------------------------------------------- WHERE age >= 18 AND age <= 80 WHERE age BETWEEN 18 AND 80 WHERE name='zhangSan' OR name='liSi' WHERE name IN ('zhangSan', 'liSi') WHERE age IS NULL WHERE age IS NOT NULL
3. 删除数据
- DELETE FROM 表名 [WHERE 条件];
DCL 数据控制语言
1. 创建用户
-
CREATE USER 用户名@IP地址 IDENTIFIED BY ‘密码’;
用户只能在指定的IP地址上登录
-
CREATE USER 用户名@’%’ IDENTIFIED BY ‘密码’;
用户可以在任意IP地址上登录
2. 给用户授权
-
GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP地址
权限、用户、数据库 给用户分派在指定的数据库上的指定的权限 例如;GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb.* TO user001@localhost; 给user001用户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限
-
GRANT ALL PRIVILEGES ON 数据库.* TO 用户名@IP地址;
给用户分派指定数据库上的所有权限 PRIVILEGES可省略
-
GRANT ALL ON *.* TO 用户名@IP地址;
给用户分派所有数据库上的所有权限
3. 撤销授权
-
REVOKE 权限1, … , 权限n ON 数据库.* FROM 用户名@IP地址;
撤消指定用户在指定数据库上的指定权限 例如;REVOKE CREATE,ALTER,DROP ON mydb.* FROM user001@localhost; 撤消user001用户在mydb数据库上的create、alter、drop权限
4. 查看权限
- SHOW GRANTS FOR 用户名@IP地址
5. 删除用户
- DROP USER 用户名@IP地址
DQL 数据查询语言
练习的表
DROP DATABASE exam;
CREATE DATABASE exam;
USE exam;
/*创建部门表*/
CREATE TABLE dept(
deptno INT PRIMARY KEY,
dname VARCHAR(50),
loc VARCHAR(50)
);
/*创建雇员表*/
CREATE TABLE emp(
empno INT PRIMARY KEY,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
1. 基本查询
字段控制
-
查询所有列
SELECT * FROM 表名; -
查询指定列
SELECT 列1 [, 列2, … 列N] FROM 表名; -
记录去重
当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
SELECT DISTINCT * | 列1 [, 列2, … 列N] FROM 表名;
SELECT * FROM 表名 GROUP BY 某列; /*MySQL独有*/ -
列运算
-
数量类型的列可以做加、减、乘、除运算
SELECT sal*1.5 FROM emp;
-
字符串类型可以做连接运算
SELECT CONCAT('$', sal) FROM emp;
-
转换NULL值
SELECT IFNULL(comm, 0)+1000 FROM emp;
–> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。
-
给列起别名
你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
–> 其中AS可以省略
-
条件控制
-
条件查询
与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL; SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000; SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
-
模糊查询
当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询SELECT * FROM emp WHERE ename LIKE '张_';
–> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配 一个 字符而不是多个。
–> 上面语句查询的是姓张,名字由两个字组成的员工。SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/
如果我们想查询姓张,名字几个字都可以的员工时就要使用“%”了。
SELECT * FROM emp WHERE ename LIKE '张%';
–> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。
SELECT * FROM emp WHERE ename LIKE '%阿%';
–> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。
SELECT * FROM emp WHERE ename LIKE '%';
–> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!
2. 排序
- 升序
–> 按sal排序,升序SELECT * FROM emp ORDER BY sal ASC;
–> 因为默认是升序,所以ASC是可以省略的 - 降序
–> 按comm排序,降序SELECT * FROM emp ORDER BY comm DESC;
–> 其中DESC不能省略 - 使用多列作为排序条件
–> 使用sal升序排,如果sal相同时,使用comm的降序排SELECT * FROM emp ORDER BY sal ASC, comm DESC;
3. 常用的聚合函数
聚合函数用来做某列的纵向运算。
- COUNT
–> 计算emp表中所有列都不为NULL的记录的行数SELECT COUNT(*) FROM emp;
–> 云计算emp表中comm列不为NULL的记录的行数SELECT COUNT(comm) FROM emp;
- MAX
–> 查询最高工资SELECT MAX(sal) FROM emp;
- MIN
–> 查询最低工资SELECT MIN(sal) FROM emp;
- SUM
–> 查询工资合SELECT SUM(sal) FROM emp;
- AVG
–> 查询平均工资SELECT AVG(sal) FROM emp;
4. 分组查询
分组查询是把记录使用某一列进行分组,然后查询组信息。
-
GROUP BY
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
–> 使用deptno分组,查询部门编号和每个部门的记录数
SELECT job, MAX(SAL) FROM emp GROUP BY job;
–> 使用job分组,查询每种工作的最高工资
-
HAVING
以部门分组,查询每组记录数。条件为记录数大于3SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
5. LIMIT子句
LIMIT用来限定查询结果的起始行,从起始行开始查询多少行。
例如:查询起始行为第5行,一共查询3行记录
SELECT * FROM emp LIMIT 4, 3;
–> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。
分页查询:
- 一页的记录数:10行
- 查询第3页
起始行 = (当前页-1) * 每页记录数
代码中常用:startRowIndex = (currentPage - 1) * pageSize
-- 20 = (3-1) * 10
select * from emp limit 20, 10;
字段约束
1. 主键约束
特点:唯一、非空、可被外键引用
-
创建表指定主键
CREATE TABLE stu( sid CHAR(6) PRIMARY KEY, sname VARCHAR(20), age INT, gender VARCHAR(10) -- 或用如下方式 -- PRIMARY KEY(sid) );
-
为指定的字段添加主键约束
CREATE TABLE stu( sid CHAR(6), sname VARCHAR(20), age INT, gender VARCHAR(10), ); -- 添加主键 ALTER TABLE stu ADD PRIMARY KEY(sid); -- 删除主机 ALTER TABLE stu DROP PRIMARY KEY;
-
主键自增长
CREATE TABLE stu( -- AUTO_INCREMENT 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;
2. 非空约束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
-- NOT NULL
sname VARCHAR(20) NOT NULL,
age INT,
gender VARCHAR(10)
);
3. 唯一约束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
-- UNIQUE
sname VARCHAR(20) UNIQUE,
age INT,
gender VARCHAR(10)
);
4. 外键约束
- 外键必须是另一表的主键的值(外键要引用主键)
- 外键可以重复
- 外键可以为空
- 一张表中可以有多个外键
语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
- 创建表时指定外键约束
create talbe emp (
empno int primary key,
...
deptno int,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
- 修改表时添加外键约束
ALERT TABLE emp
ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);
- 修改表时删除外键约束
ALTER TABLE emp
DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
多表查询
1. 合并结果集
- 要求被合并的表中,列类型和列数相同
- UNION,去除重复行
- UNION ALL,不去除重复行
2. 连接查询
- 内连接
方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx 标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
- 外连接
- 左外连接
SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
- 右外连接
SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx 右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
- 全外连接(MySQL不支持)
可以使用UNION来完成全连接
- 左外连接
3. 子查询
查询中有查询(查看select关键字的个数!)
- where后作为条件存在
- 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
- 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
- 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
- from后作为表存在
- 多行多列:SELECT * FROM 表1 别名1 , (SELECT …) 别名2 WHERE 条件
- select后
- 单行单列:SELECT d.*, (SELECT COUNT(*) FROM emp WHERE deptno= d.deptno) AS countNum FROM dept AS d;