MySQL
1、数据库相关概念
数据库:存储数据的仓库,数据是有组织地进行存储。DataBase,简称DB
数据库管理系统:管理数据库的大型软件。DataBase Management System,DBMS。可以根据这个软件创建数据库,并且进行增删改查等操作。如MySQL。
SQL:Structured Query Language,SQL,结构化查询语言;操作关系型数据库的编程语言;定义操作所有关系型数据库的统一标准。
常见的关系型数据库管理系统:Oracle,mysql,SQL server,PostgreSQL,DB2,SQLite,MariaDB
2、MySQL基本命令
注册mysql服务:mysqld -install
启动mysql服务:net start mysql ,自动启动
停止mysql服务:net stop mysql
计算机上安装好mysql了,那么本台计算机即MySQL服务器
登录MySQL:mysql -uroot -p123456 这里是连接本机的,可能会需要连接别的主机
登录参数mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1即本机) -P端口号(默认3306)
退出mysql:exit,或quit
卸载:net stop mysql停掉服务-mysql -remove mysql-删除mysql目录及相关环境变量
3、MySQL数据模型
关系型数据库:是建立在关系模型基础上的数据库,即是由多张能互相连接的二维表组成的数据库。
数据库以文件夹形式存储,一个数据库可以存放多个表,一个表中可以存放多条数据
4、SQL
4.1 简介
结构化查询语言,一门操作关系型数据库的编程语言
定义所有关系型数据库的统一标准
存在方言
4.2 通用语法
- SQL语句可以单行或者多行书写,以分号结尾
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 注释:多行/* */;单行 -- 注释内容 或 #注释内容()MySQL特有
show databases;-- 查询所有数据库名称
4.3 SQL分类
- DDL Data Definition Language 数据定义语言,用来定义数据库对象:数据库、表、列等。
- DML Data Manipulation Language 数据操作语言,用来对数据库中表的数据进行增删改。
- DQL Data Query Language 数据查询语言,用来查询数据库中表的记录(数据)。
- DCL Data Control Language 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。
4.4 DDL
4.4.1 操作数据库
① 查询 SHOW DATABASES
information_schema:记录MySQL中有哪些库,有哪些表;以视图的形式存储表,并不存在物理实体
mysql: 存储数据库核心信息,如权限、安全
performance_schema :性能相关信息
sys :系统相关信息
ibm:我自己的数据库
② 创建 CREATE DATABASE [NAME]; 不能创建相同名字的数据库
判断:CREATE DATABASE IF NOT EXISTS [NAME];
③ 删除 DROP DATABASE [NAME] 判断:DROP DATABASE IF EXISTS [NAME];
④ 使用 USE [NAME];
⑤ 查看 SELECT DATABASE() 查看当前使用的数据库
4.4.2 操作表
-
查询
查询当前数据库下所有表名称
SHOW TABLES查询某一表的结构
DESC 表名称DESC是description的缩写
-
创建
CREATE TABLE 表名( 字段名1 数据类型1, 字段名2 数据类型2, 字段名3 数据类型3, 字段名4 数据类型4 # 最后一行不能有逗号 ); #分号
-
修改
修改表名
ALTER TABLE 表名 RENAME TO 新的表名;添加一列
ALTER TABLE 表名 ADD 列名 数据类型;修改数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;修改列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;删除列
ALTER TABLE 表名 DROP 列名; -
删除
DROP TABLE 表名DROP TABLE IF EXISTS 表名
4.5 数据类型
大体上分为3类:数值、日期、字符串。。。。
age int
score double(总长度,小数点后保留的位数),double一般要指定精度。如(5,2)0-100分,2位小数
birthday date,只有年月日
name char(最大字符个数),定长字符串,空格补齐,存储性能更高;但浪费空间;能确定字符个数用char
name varchar(最大字符个数),变长字符串,没有空格补齐,根据长度存储数据;存储性能更低
创建案例:
create student(
id int,
name varchar(10),
gender char(1),
birth date,
score double(5,2),
mailaddress varchar(64),
phone varchar(15),
status int //状态较少,因此改int用tinyint类型
);
4.6 图形化客户端工具
Navicat,官网www.navicat.com.cn
打开Navicat是一个客户端,需要与mysql服务相连接
选择左上角“连接”,选择“MySQL”,
写SQL语句:点击上方的查询,选择“新建查询”,就可以写SQL语句了
4.7 DML-对数据进行增删改
① 添加
-
指定列
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...); -
全部列,省略列名列表,但不建议省略
INSERT INTO 表名 VALUES(值1,值2,...); -
批量,VALUES部分多写几个
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...),(值1,值2,...);INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
② 修改
UPDATE 表名 SET 列名1=值1,列名2=值2,...[WHERE 条件];不加条件的话则所有数据都修改
③ 删除
DELETE FROM 表名 [WHERE 条件];不加条件的话则所有数据都删除
4.8 DQL-对数据查询
-
语法
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件 ORDER BY 排序字段 LIMIT 分页限定
① 基础查询
-
查询多个字段
SELECT 字段名,字段名,... FROM 表名;SELECT * FROM 表名;查询所有列数据;但不要使用 -
去除重复记录
SELECT DISTINCT 字段名 FROM 表名;DISTINCT关键字 -
起别名
SELECT 字段名 AS 别名,字段名 AS 别名,... FROM 表名;AS也可以省略
② 条件查询 WHERE
SELECT 字段列表 FROM 表名 WHERE 条件列表;
SELECT * FROM STU WHERE age>20;
SELECT * FROM STU WHERE age>=20;
SELECT * FROM STU WHERE age>=20 && age<=30;# 不建议使用&&
SELECT * FROM STU WHERE age>=20 AND age<=30;# 建议用AND
SELECT * FROM STU WHERE age BETWEEN 20 AND 30;
SELECT * FROM STU WHERE age=18;# 不能使用==
SELECT * FROM STU WHERE age!=18;
SELECT * FROM STU WHERE age=18 OR age=20 OR age=22;#可以用|| 但不推荐
SELECT * FROM STU WHERE age in (18,20,22); #集合
# null值比较不能使用= != ,要使用is is not
SELECT * FROM STU WHERE age is NULL;
SELECT * FROM STU WHERE age is not NULL;
-
模糊查询
关键字:LIKE
通配符:_单个任意字符,%任意多个字符
SELECT * FROM STU WHERE name LIKE '马%';
SELECT * FROM STU WHERE name LIKE '_花%';# 第二个字是花
SELECT * FROM STU WHERE name LIKE '%德%';# 包含“德”这个字
③ 排序查询 ORDER BY
- 语法
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1[排序方式1],排序字段名2[排序方式2]...; - 排序方式:ASC升序排列(默认值);DESC(降序排列)
- 有多个排序条件,当前面的条件值一样时,才会根据第二条件进行排序
SELECT * FROM STU ORDER BY age ASC;
SELECT * FROM STU ORDER BY math DESC english asc;#数学成绩一样,再按英语升序排列
④ 分组查询 GROUP BY
-
聚合函数
概念:将一列数据作为一个整体,进行纵向计算
分类:
count(列名),统计数量,统计的列名不能为null,即不统计为null的;写主键或*
max(列名),最大值
min(列名),最小值
sum(列名),求和
avg(列名),平均值
语法:
SELECT 聚合函数名(列名) FROM 表名;null值不参与所有聚合函数的计算
-
分组查询
语法:
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];分组之后,查询的字段为聚合函数和分组字段,查询其他字段无意义
SELECT sex,avg(math) FROM stu GROUP BY sex;# 男女分别数学平均分
SELECT sex,avg(math),count(*) FROM stu GROUP BY sex;# 男女分别数学平均分,各自人数
SELECT sex,avg(math),count(*) FROM stu WHERE math>70 GROUP BY sex;# 分数低于70,不参与分组
SELECT sex,avg(math),count(*) FROM stu WHERE math>70 GROUP BY sex HAVING count(*) >2;# 分数低于70,不参与分组,分组人数>2
WHERE和HAVING 的区别:执行时机不同;where不能对聚合函数进行判断,having可以
执行顺序:WHERE>聚合函数>HAVING
⑤ 分页查询 LIMIT
- 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数; - 起始索引从0开始,起始索引=(当前页码-1)*每页显示的条数
- LIMIT 是MySQL的方言;Oracle使用rownumber...
# 从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0,3;
# 每页显示3条数据,查询第一页,012
SELECT * FROM stu LIMIT 0,3;
# 每页显示3条数据,查询第二页,345
SELECT * FROM stu LIMIT 3,3;
# 每页显示3条数据,查询第三页,678
SELECT * FROM stu LIMIT 6,3;