Mysql 基础
基础语法
启动开启mysql(win平台)
- 启动mysql
1
2
3
cd C:\mysql-5.0.45-win32\bin
mysqld --console
- 关闭Mysql
1
mysqladmin -uroot shutdown
- 启动Mysql 服务
1
C:\Program Files\MySQL\MySQL Server 5.0\bin>net start mysql
- 关闭Mysql 服务
1
C:\Program Files\MySQL\MySQL Server 5.0\bin>net stop mysql5
Mysql 关键字
- DDL: create、drop、alter (字段)
- DML: insert、delete、udpate、select(查询)
- DCL: grant、revoke(安全)
DDL 语句
- 连接数据库
1
mysql -uroot -p
在以上命令行中,mysql代表客户端命令,-u后面跟连接的数据库用户,-p表示需要输入密码。
- 创建数据库 (CREATE DATABASE dbname)
1
2
3
4
5
6
7
create database test1;
如果数据库已存在报错
mysql> create database test1;
ERROR 1007 (HY000): Can't create database 'test1'; database exists
成功提示:Query OK, 1 row affected (0.00 sec)
Tip:所有的DDL和DML(不包括SELECT)操作执行成功后都显示“Query OK。
- 选择数据库(USE dbname)
1
mysql> use test1
- 查看所有数据表
1
show tables
- 删除数据库(drop database dbname)
1
drop database test1
- 创建表
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE tablename (column_name_1 column_type_1 constraints,column_name_2 column_type_2 constraints,......column_name_n column_type_n constraints)
example:
create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2))
设置主键?
设置外键?
设置自增?
- 查看表(DESC tablename)
1
desc emp
- 查看创表语句
1
show create table emp \G
- 删除表
1
DROP TABLE tablename
- 修改表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
Example:
更改字段
alter table emp modify ename varchar(20)
插入字段
alter table emp add column age int(3)
删除表字段 ( ALTER TABLE tablenameDROP [COLUMN]col_name )
alter table emp drop column age
字段改名 ( LTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition[FIRST|AFTER col_name] )
alter table emp change age age1 int(4)
Tip:
change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便。但是change的优点是可以修改列名称,modify则不能。
修改字段位置
alter table emp add birth date after ename
alter table emp modify age int(3) first(修改字段age,将它放在最前面)
改表名( ALTER TABLE tablename RENAME [TO] new_tablename )
alter table emp rename emp1
DML语句
- 插入语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
INSERT INTO tablename (field1,field2,......fieldn) VALUES(value1,value2,......valuesn)
insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1)
不用指定字段名称,但是values后面的顺序应该和字段的排列顺序一致
insert intoemp values('lisa','2003-02-01','3000',2)
部分插入(没有提及的插入为空或者默认自增去自增)
insert into emp(ename,sal) values('dony',1000)
一次插入多条
INSERT INTO tablename (field1,field2,......fieldn)
VALUES(record1_value1,record1_value2,......record1_valuesn),
(record2_value1,record2_value2,......record2_valuesn),
......
(recordn_value1,recordn_value2,......recordn_valuesn)
insert into dept values(5,'dept5'),(6,'dept6')
- 更新数据
1
2
3
4
5
6
7
8
9
10
11
12
UPDATE tablename SET field1=value1,field2.=value2,......fieldn=valuen [WHERE CONDITION]
update emp set sal=4000 where ename='lisa'
同时更新多个表
UPDATE t1,t2...tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]
update emp a,dept b
set
a.sal=a.sal*b.deptno,b.deptname=a.ename
where
a.deptno=b.deptno;
- 删除数据
1
2
3
4
5
6
7
8
9
10
DELETE FROM tablename [WHERE CONDITION]
delete from emp where ename='don'
一次删除多个表中的数据
DELETE t1,t2...tn FROM t1,t2...tn [WHERE CONDITION]
delete a,b
from emp a,dept b
where a.deptno=b.deptno and a.deptno=3
- 查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT * FROM tablename [WHERE CONDITION]
select ename,hiredate,sal,deptno from emp
查询不重复字段
select distinct deptno from emp
条件查询
select *from emp where deptno=1
select * from emp where deptno=1 and sal<300
排序
SELECT * FROM tablename [WHERE CONDITION]
[
ORDER BY field1 [DESC|ASC],field2
[DESC|ASC],......fieldn [DESC|ASC]
]
select * from emp order by sal 升序
select * from emp order by deptno,sal desc sal字段降序
SELECT ......[LIMIT offset_start,row_count]
前三条
select * from emp order by sal limit 3
第二条记录开始显示三条记录
select * from emp order by sal limit 1,3
- 聚合
1
2
3
4
5
SELECT [field1,field2,......fieldn]
fun_name
FROM tablename[WHERE where_contition]
[GROUP BY field1,field2,......fieldn[WITH ROLLUP]]
[HAVING where_contition]
fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。</br>
GROUP BY关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面。</br>
WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总。</br>
HAVING关键字表示对分类后的结果再进行条件的过滤
having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。
1
2
3
4
5
6
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
select ename,deptname from emp left join dept on emp.deptno=dept.deptno
select ename,deptname from dept right join emp on dept.deptno=emp.deptno
(两者等价)
子查询 (用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists)
1
2
3
4
5
6
7
8
从 emp表中查询出所有部门在 dept 表中的所有记录:
select * from emp where deptno in(select deptno from dept);
子查询记录数唯一,还可以用=代替 in
可以转化为表连接
select * from emp where deptno in(select deptno from dept)
记录联合 将两个表的数据按照一定的查询条件查询出来后,将结果合并 到一起显示出来,这个时候,就需要用 union 和 union all 关键字
1
2
3
4
5
6
SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2 …… UNION|UNION ALL SELECT * FROM tn;
UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将 UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。
DCL
- 创建用户添加权限
1
2
3
创建一个数据库用户 z1,具有对 sakila 数据库中所有表的 SELECT/INSERT 权限
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
- 回收用户权限
1
2
3
4
5
mysql -uroot
revoke insert on sakila.* from 'z1'@'localhost'
exit
使用帮助
- 用“?contents”命令来显示所有可供查询的的分类
- 看 MySQL 中都支持哪些数据类型,可以执行“? data types”命令
- int 类型的具体介绍: ? int
- 快速查询帮助:? show ? create table
Mysql数据类型
常用函数
图形化操作
- 数据库备份
- 数据库导出
表类型(存储引擎)
数据选择
- Text || BlOB</br> 一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR; 而在保存较大文本时, 通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能用来保存二进制数据,比 如照片;而 TEXT 只能保存字符数据,比如一篇文章或者日记。 </br> TEXT 和 BLOB 中有分别包括 TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型,它们 之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足需求的最小存储类型。本节主要对 BLOB 和 TEXT 存在的一些常见问题进行介绍。 </br> BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。 删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上 会有影响。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理,避 免因为“空洞”导致性能问题。
字符集
索引
在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。 索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。 廖雪峰:https://www.liaoxuefeng.com/wiki/1177760294764384/1218728442198976
1
2
3
4
5
6
7
使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引
ALTER TABLE students
ADD INDEX idx_score (score);
ALTER TABLE students
ADD INDEX idx_name_score (name, score);
- 特性:索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。 </br>可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。 </br>对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一
Mysql面试:https://juejin.im/post/5baafdccf265da0af93b05e4 https://juejin.im/post/5ba1f32ee51d450e805b43f2