深入浅出MySQL笔记(一)

时间:2022-06-09 16:17:50

本笔记为学习该书所记,便于复习。
包含第一、二章笔记。

第一部分 基础篇

第1章 mysql的安装与配置

MySQL的下载 :

分为windows平台,Linux平台两种

MySQL的安装

MySQL的配置

启动和关闭MySQL

第2章 SQL基础

SQL简介

Structure Query Language(结构化查询语言)

(My)SQL使用入门

SQL分类

DDL—(Data Definition Languages)语句—(数据定义语言)
DML—(Data Manipulation Language)语句—(数据操作语句)
DCL—(Data Control Language)语句—(数据控制语句)

DDL语句

1 创建数据库

1.1 连接到mysql服务器
在安装好Mysql后,要创建数据库,首先要连接到MySQL服务器。
在MAC中打开终端,输入

mysql -u root -p

然后输入密码,即可连接。
这时候会显示一些信息。包括:
命令结束符”;”或者”\g”
客户链接ID,记录了到目前为止的连接次数
版本
显示帮助

1.2 建库

CREATE DATABASE dbname;

1.3查看数据库

show databases;

1.4 选择数据库

USE dbname

1.5 查看数据库中的表

show tables;

必须先选择数据库后才能看表。

2 删除数据库
drop database dbname;
3 创建表

3.1 建表
语法

CREATE TABLE tablename( column_name_1 column_type_1 constraints, column_name_n column_type_n constraints);

案例

create table emp( ename varchars(10), hiredate date, sal decimal(10,2), deptno int(2) );

3.2 查看表定义

DESC tablename

3.3 查看创建表的SQL语句

show create table emp \G;
4 删除表
DROP TABLE tablename
5 修改表

5.1 修改表类型

ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST|AFTER col_name]

例子

alter table emp modify ename varchar(20);

5.2 增加表字段

ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST|AFTER col_name]

例子

alter table emp add column age int(3);

5.3 删除表字段

ALTER TABLE tablename Drop [COLUMN] col_name

例子

alter table emp drop column age;

5.4 字段改名

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]

例子

alter table emp change age age1 int(4)

注意,change和modify都可以修改表定义,不同的是change修改表名,所以需要写两次表名,modify不能修改表名。

5.5 修改字段排列顺序
ADD/CHANGE/MODIFY都有可选项first|after column
ADD增加的新字段默认加在最后位置。
用FIRST可以放在最前面
例如

alter table emp modify age int(3) first;

用after放在某个字段之后
例如

alter table emp add birth data after ename;

CHANGE/FIRST|AFTER COLUMN 这些关键字都属于Mysql在标准SQL上的扩展,其他数据库不一定适用。

5.6 更改表名

ALTER TABLE tablename RENAME[TO] new_tablename

例子

alter table emp rename emp1;

DML语句

1插入记录

insert

INSERT INTO tablename(field1,field2..) VALUES(value1,value2..)

也可以不指定字段名

insert into emp values('lisa','2003-03-03','3000',2);

一次性插入多条记录

INSERT INTO tablename (field1,field2..)
VALUES
(record1_value1,record1_value2...record1_valuen),
...
(recordn_value1,recordn_value2...recordn_valuen)
;
2更新记录

update

UPDATE tablename SET field1=values,field2=value2..fieldn=valuen[WHERE CONDITION]

可以同时更新多个表中的数据

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;

注意,多表更新的语法更多地用在了根据一个表的字段来动态地更新另外一个表的字段

3删除记录

delete

DELETE FROM tablename [WHERE CONDITION]

例子

delete from emp where ename='dony';

一次删除多个表的记录

DELETE t1,t2...tn FROM t1,t2...tn [WHERE CONDITION]

如果from后面的表名用别名,则delete后面也要用相应的别名。
例子

delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

不管单表还是多表,不加where条件将会把所有表的所有记录删除,因此操作小心。

4 查询记录

4.1 select

SELECT * FROM tablename [WHERE CONDITION]

4.2 查询不重复的记录
distinct

select distinct deptno from emp;

4.3 条件查询
where

select * from emp where deptno=1;
select * from emp where deptno=1 and sal<3000;

4.4 排序和限制
排序order by
DESC降序ASC升序

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DES|ASC]...fieldn[DESC|ASC]]

限制limit

SELECT...[LIMIT offset_start,row_count]
##其中offset_start表示记录的起始偏移量,row_count表示显示的行数

例子

select * from emp oeder by sal limit 1,3;
输出排序后从第二条记录开始的3条记录

limit经常和order by一起配合使用来进行记录的分页显示
limit属于Mysql扩展sql92后的语法,在其他数据库上并不能通用

4.5 聚合

SELECT [field1,field2...fieldn] fun_name   ##fun_name表示聚合函数
FROM tablename
[WHERE where_contition]
GROUP BY field1,field2...fieldn     ##GROUP BY后是待聚合字段
[WITH ROLLUP]     ##可选,表示对聚合后结果进行再汇总
[HAVING where_condition]   #表示对结果再进行条件过滤

注意,having和where的区别在于,where在聚合前对记录进行过滤,having是对聚合后的结果进行条件过滤。
尽可能先用where先过滤记录,这样结果集减小,对聚合效率大大提高
例子

select deptno,count(1) from emp group by deptno with rollup ##统计各部门人数后汇总统计总人数

4.6 表连接
内连接
关键字
where…=…
from…inner join…on
from…left join…on

select ename,deptname from emp,dept where emp.deptno=dept.deptno;
select field1...fieldn from tablename inner join table on join_condition;

外连接
左连接
查询emp中所有用户名和所在部门名称

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;

4.7 子查询
关键字
in,
not in,
=,
!=,
exists,
not exists

select * from emp where deptno in(select deptno from dept);

某些条件下,子查询可转化为表连接,条件的、外连接、内连接都可以使用

select emp.* from emp,dept where emp.deptno=dept.deptno;

书上说表关联的效率要高于子查询,因为子查询走的是笛卡尔积。而培训班老师所子查询效率高于表连接。。。
表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询。

4.8 记录联合
关键字,union,union all
union是将union all结果去重DISTINCT

SELECT * FROM t1 UNION|UNION ALL SELECT * FROM t2

例子

select deptno from emp union all select deptno from dept;

DCL语句

用的比较少,简单写下
创建一个数据库用户z1,具有对sakila数据库中所有表的SELECT/INSERT权限
关键词grant

grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';

权限变更,需要收回z1的INSERT权限
关键词revoke

revoke insert on sakila.* from 'z1'@'localhost';

帮助的使用

按照层次看帮助

?contents

?+类别名称
例如

? data types

快速查阅帮助

? 关键字

例如

? show;
? create table;

常用的网络资源

查询元数据信息

information_schema数据库

元数据信息,数据的数据,虚拟数据库,物理上并不存在相关目录文件。库里show tables显示的表全部是视图

常见场景

1删除数据库test1下所有前缀为tmp的表
select concat ('drop table test1.,'table_name,';') from tables where table_schema = 'test1' and table_name like 'tmp%';
## concat 将多个数组组合成新的数组
2将数据库test1下所有存储引擎为mysiam的表改为innodb
select concat ('alter table test1.',table_name,'engine = innodb;') from tables where table_schema = 'test1' and engine = 'MyISAM';
3常用视图

SCHEMATA:
提供了当前mysql实例中所有数据库的信息
show databases的结果取自此表
TABLES:
提供了关于数据库中表的信息(包括视图),详述了某个表属于哪个schema、表类型、表引擎、创建时间等信息
show tables from schemaname的结果取之此表
COLUMNS:
提供了表中的列信息,详述了某张表的所有列以及每个列的信息
show columns from schemaname.tablename的结果取自此表
STATISTICS:
该表提供了关于表索引的信息
show index from schemaname.tablename的结果取自此表