一、简介
1、概述
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
1
2
3
4# 1. MySQL是一个数据库,数据的仓库,用于存储数据,存储程序中的数据(注册时的用户名、密码、邮箱等、网站上的数据-当当网用户的信息、商品的信息) 数据库泄露 xx
目的:持久化存储 用户和密码
# 2. Oracle公司:收购了MySQL -自己也有一款数据库:oracleMySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL系统结构是 “库” “表” “行” “列”,每个库中有多张表,每张表中有多个行,每个行中有多个列。
1
2# 1. MySQL结构是由库、表、行、列来组成的
# 2. MySQL是一个大的数据仓库,在大仓库中又分了很多个小库(每个库都有一个名字),在每个小库中又包含了很多个表,而每个表中又有很多个行和列
2、安装
(1)在 MySQL 下载中下载 Windows 版本的 MySQL 安装包
(2)双击安装并配置环境变量
手动配置环境变量: 右击计算机–属性-高级系统设置-环境变量-系统环境变量-path : 加入 mysql安装目录下的bin路径:D:\Software\MySQL Server 5.5\bin
(3)检查是否安装成功 (打开Dos窗口)
1 | mysqladmin --version //查看Mysql服务器版本 |
1 | # 安装步骤: |
3、密码设置
3.1 设置初始密码(跳过)
1 | mysqladmin -u root password "123456" #安装过程中设置过密码 则可跳过 |
3.2 修改密码
1 | mysqladmin -u用户名 -p旧密码 password 新密码 |
3.3 重置root密码
1 | 1. 关闭正在运行的MySQL服务。 net stop mysql |
4、登录和退出
4.1 登录mysql
1 | mysql -uroot -p123456 #在dos窗口中操作 |
4.2 退出mysql
1 | mysql> quit; #在mysql的交互式界面中 |
二、数据库管理
1、显示所有的数据库
1 | mysql> show databases; |
2、创建数据库
1 | mysql> create database 数据库名 charset=utf8; #万国码 解决中文乱码 |
3、删除数据库
1 | mysql> drop database 数据库名; |
4、选择数据库/查看当前选中的库
1 | mysql> use db_name; //使用某个数据库 |
5、显示数据库中的表
1 | mysql> show tables; |
三、简单建表操作
1、创建表
1 | mysql> create table 表名(列名1 数据类型 约束...,列名2...) |
2、简单数据类型
1 | int / integer 整数 |
3、简单约束
1 | auto_increment 自动增长 由mysql自动维护(插入值时,可以不用给值) 默认从1开始 |
4、简单示例
1 | mysql> create database userDB charset=utf8; |
查看表结构
1
mysql> desc table_name; # desc -- description
插入数据
1
insert into t_user(name,age,birthday) values("Mr_lee",18,"2000-07-11");
查询数据
1
select * from t_user; -- 表示所有列
也可以查询指定列
1
select name,age form t_user;
5、可视化工具navicat

1 | 1. 先安装好navicate,不要打开 |
四、SQL查询语句
结构化查询语言SQL(Structured Query Language):用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。
1、查询表中的列
查询所有列
1
select * from 表名; # select * from t_user;
查询指定列–部分列
1
select 列名1,列名2 ... from 表名;
2、列操作
列运算:列查询支持算术运算【+ - * /】 运算中出现null 结果也为null
1
select id+1,age * 2 from t_user;
列拼接
1
select concat(age,"岁") from t_user;
列别名
1
2select name as 姓名 from t_user;
-- select 列名 as 别名 from t_user;注意: as可省略
列去重(了解)
1
select distinct age from t_user;
3、where子句
3.1 条件查询
如需有条件地从表中选取一部分数据行,可将 WHERE 子句添加到 SELECT 语句中。
基本语法:
1 | select ... from 表名 where 条件表达式 ; |
如:查询年龄大于20的用户信息
1 | select * from t_user where age > 20; |
- 比较运算符:【= != > < >= <= <>】
- 逻辑运算符:【and or not】
- 范围 :【in(xxx,xxx,xxx…) between.. and】
1 | # 查询“id大于3” 且 “年龄小于19” 或者 “名字是JJ” 的用户的 id,name,age |
3.2 空值判断
语法:
select … from 表名 where 列名 IS NULL and 列名 IS NOT NULL
1 | select id,name,age from t_user where name is null and age is not null; |
注意:不能用如下语句进行空值判断
1 | select * from t_user where birthday = null; -- error |
3.3 模糊查询
- % 任意多个字符
- _ 一个字符
语法:
1 | select ... from 表名 where 列名 like '%..%' |
示例:
1 | 查询名字中包含o的数据 |
- like “%abc%” 含有abc
- like “%abc” 以abc结尾
- like “abc%” 以abc开头
- like “ab%_” 以ab开头,且ab后至少有一个字符
- like “%__%” 至少有2个字符 或 length(列名) >=2
4、分页查询
1 | 从第一条开始查询,共查询3条数据 == limit 0,3 |
5、ORDER BY子句:排序
语法:
1 | select ... from 表名 ORDER BY 列名 |
- ASC : 升序(默认)
- DESC : 降序
1 | 根据id降序排列 |
6、聚合函数:组函数
- MAX( ) 最大值
- MIN( ) 最小值
- SUM( ) 求和
- AVG( ) 求平均值
- COUNT( ) 总数
1 | 查询最大id和年龄的平均值(结果只有一行) |
注意:
1 | select max(age),name from t_user |
7、GROUP BY:分组统计
语法:
1 | select ... from 表名 group by 列名 |
示例:
- 查询每个部门的最高工资,最低工资,最大年龄,部门id
1 | select max(salary),min(salary),max(age),detp_id from t_employee group by dept_id; |
- 查询每个部门的平均工资,最低工资,工资总和,部门id
1 | select avg(salary),min(salary),sum(salary),dept_id from t_employee group by dept_id; |
- 查询每个部门的员工总数
1 | select count(id),dept_id from t_employee group by dept_id; |
- 聚合统计:将dept_id和age都相同的数据分到一组
1 | select age,dept_id from t_employee group by dept_id,age; |
注意:分组查询中除了组函数外,只能查询分组条件的字段

8、having子句:分组限制
语法:
1 | select ... from 表名 group by 列名 HAVING .. ; |
在group形成临时表之后,最终确定结果之前执行,即对每个临时表做筛选,满足having条件的临时表才可以将一条数据放入最终结果。
示例:
- 查询每个部门的平均工资大于10000的员工的平均年龄和最高工资
1 | select avg(age),max(salary),dept_id from t_employee group by dept_id having avg(salary) >10000; |
- 查询最小年龄小于20的部门员工总数和部门id
1 | select count(id),dept_id from t_employee group by dept_id having min(age) < 20; |
重点理解:HAVING的作用时刻
注意:和where的区别是:
- where先执行,用来对总表做数据筛选
- having在where之后的group之后执行,对分组过程中的临时表做筛选,每个临时表筛选一次
补充:如果一个需求,where和having都可以实现,建议使用where,效率更高
1 | 1. where是对总表做筛选,having是对分组表做筛选 |
9、case子句
语法:
1 | select |
示例:
1 | select |
10、子查询
将一个查询结果作为另一个查询的一部分,称为子查询
- 查询工资大于平均工资的员工信息
1 | select * from t_employee where salary > (select avg(salary) from t_employee); |
- 查询工资小于平均值的员工数量
1 | select count(id) from t_employee where salary < (select avg(salary) from t_employee) |
- 查询平均工资大于10000的部门的员工信息
1 | select id,name,age,salary from t_employee where dept_id in |
- 注意:子查询的执行效率,很低
五、补充
- LENGTH() 获取长度
- LCASE() 转为小写字符 abcd
- UCASE() 转为大小字符 ABCD
- TRIM() 去除头部和尾部的空格
- NOW() 当前日期和时间
- CURDATE() 当前日期
- CURTIME() 当前时间
- DATE_FORMAT(NOW(),’%Y/%m/%d %H:%i:%s’) 日期格式化
- DATABASE() 当前的数据库名称
- USER() 当前用户名
- VERSION() 当前服务器版本