MySQL数据库学习(一)

一、简介

1、概述
  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
  • MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
  • MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  • MySQL系统结构是 “库” “表” “行” “列”,每个库中有多张表,每张表中有多个行,每个行中有多个列。
1. MySQL是一个大的数据仓库,在大的数据仓库中是包含了很多个小库,每个小库中包含了多个表,每个表中包含了多个行和列
2、安装

(1)在 MySQL 下载中下载 Windows 版本的 MySQL 安装包

(2)双击安装并配置环境变量

​ 手动配置环境变量: 右击计算机–属性-高级系统设置-环境变量-系统环境变量-path : 加入 mysql安装目录下的bin路径:D:\Software\MySQL Server 5.5\bin

(3)检查是否安装成功 (打开Dos窗口)

mysqladmin --version                 //查看Mysql服务器版本
安装MySQL时,需要注意的几个问题:
	1. 安装时选择“custom” 自定义安装 -- 可以选择安装位置
	2. 输入root的密码
	3. 勾选环境变量(如果忘记勾选,后续再单独配置即可)
	4. 安装路径不要有中文
如果安装失败了:
	卸载重装
在今天晚上6点前安装好MySQL	
3、密码设置
3.1 设置初始密码(跳过)
mysqladmin -u root password "123456"    #安装过程中设置过密码 则可跳过
3.2 修改密码
mysqladmin -u用户名 -p旧密码 password 新密码 
3.3 忘记root密码(重置root密码)
1. 关闭正在运行的MySQL服务。 net stop mysql
2. 打开DOS窗口,转到mysql\bin目录 -- 如果配置了环境变量,则该步骤可以跳过。 
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),输入mysql回车,如果成功,将出现MySQL提示符 >。
5. 连接权限数据库: use mysql; 。
6. 改密码:update user set password=password("新密码") where user="root";(别忘了最后加分号) 。
7. 刷新权限(必须步骤):flush privileges; 。
8. 退出  quit。
4、登录和退出
4.1 登录mysql
mysql -uroot -p123456      #在dos窗口中操作
4.2 退出mysql
mysql> quit;                #在mysql的交互式界面中

二、数据库管理

1、显示所有的数据库
mysql>  show databases;     
2、创建数据库
mysql> create database 数据库名  charset=utf8;   #万国码 解决中文乱码       
3、删除数据库
mysql> drop database 数据库名;  
4、选择数据库/查看当前选中的库
mysql> use db_name;           //使用某个数据库

mysql> select database();     //查看当前选中的数据库
5、显示数据库中的表
mysql>  show tables;

三、简单建表操作

1、创建表
mysql>  create table 表名(列名1 数据类型 约束...,列名2...)
       # create table t_user(id int auto_increment,name varchar(20))     
2、简单数据类型
int / integer 整数

varchar(n)  字符,n是字符长度

datetime 日期
3、简单约束
auto_increment 自动增长  由mysql自动维护(插入值时,可以不用给值) 默认从1开始

primary key 主键  唯一标识数据库表中的每条记录    不重复且非空   primary key == unique + not null

not null 非空

unique 唯一 但可以为空 
4、简单示例
mysql> create database userDB charset=utf8;

mysql> use userDB;

mysql> create table t_user (id int auto_increment primary key,name varchar(20) not null ,age int,birthday datetime);
  • 查看表结构

    mysql> desc table_name;         # desc -- description
    
  • 插入数据

    mysql> insert into t_user(name,age,birthday) values("Mr_lee",18,"2000-07-11");
    
  • 查询数据

    mysql> select * from t_user;  --  表示所有列  
    

    也可以查询指定列

    mysql> select name,age form t_user;
    
5、可视化工具navicat
	一款比较好的数据库工具,推荐使用该软件,初学者建议使用黑窗口进行编辑。

四、SQL查询语句

结构化查询语言SQL(Structured Query Language):用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。

1、查询表中的列
  • 查询所有列

    select * from 表名;     # select * from t_user;
    
  • 查询指定列–部分列

    select 列名1,列名2 ... from 表名;
    
2、列操作
  • 列运算:列查询支持算术运算【+ - * /】 运算中出现null 结果也为null

    select id+1,age * 2 from t_user;
    
  • 列拼接

    select concat(age,"岁") from t_user;
    
  • 列别名

    select name as 姓名 from t_user;
    -- select 列名 as 别名 from t_user;
    

    注意: as可省略

  • 列去重(了解)

    select distinct age from t_user;
    
3、where子句
3.1 条件查询

如需有条件地从表中选取一部分数据行,可将 WHERE 子句添加到 SELECT 语句中。

基本语法:

	select ... from 表名  where 表达式 ;

如:查询年龄大于20的用户信息

	select * from t_user where age > 20;
  • 比较运算符:【= != > < >= <= <>】
  • 逻辑运算符:【and or】
  • 范围 :【in(xxx,xxx,xxx…) between… and】
# 查询“id大于3” 且 “年龄小于19” 或者 “名字是JJ” 的用户的 id,name,age
select id,name,age from t_user where id > 3 and age < 19 or name = 'JJ'

# 查询生日在‘2018-3-08 00:00:00’之后的用户
select id,name from t_user where birthday > '2018-3-08 00:00:00';

# 查询年龄大于18 并且id在(1,3,5,7)其中之一的用户
select id,name,age from t_user where age > 18 and id in(1,3,5,7);

# 查询年龄大于18 并且id在2-4之前的用户
select id,name,age from t_user where id between 2 and 4;
3.2 空值判断

语法:

​ select … from 表名 where 列名 IS NULL and 列名 IS NOT NULL

select id,name,age from t_user where name is null and age is not null;

注意:不能用如下语句进行空值判断

select * from t_user where birthday = null;     -- error
select * from t_user where birthday = 'null';   -- error
3.3 模糊查询
  • % 任意多个字符
  • _ 一个字符

语法:

select ... from 表名 where 列名 like '%..%'

示例:

查询名字中包含o的数据

select * from t_user where name like "%o%"
  • like “%abc%” 含有abc
  • like “%abc” 以abc结尾
  • like “abc%” 以abc开头
  • like “ab%_” 以ab开头,且ab后至少有一个字符
  • like “%__%” 至少有2个字符
4、分页查询
从第一条开始查询,共查询3条数据  == limit 0,3 
select ... from 表名  limit 3;   

从第一条开始,共查询2条
select ... from 表名 limit 0,2;

从第三条开始,共查询3条
select ... from 表名 limit 2,3;

每页显示n条,查询第m页
select ... from 表名 limit (m-1)*n,n;
5、ORDER BY子句:排序

语法:

   select ... from 表名  ORDER BY 列名
  • ASC : 升序(默认)
  • DESC : 降序
根据id降序排列
select * from t_user order by id desc;

根据age升序排列,年龄相同按薪水升序排序
select * from t_user order by age asc,salary asc;
6、聚合函数:组函数
  • MAX( ) 最大值
  • MIN( ) 最小值
  • SUM( ) 求和
  • AVG( ) 求平均值
  • COUNT( ) 总数
查询最大id和年龄的平均值(结果只有一行)
select max(id), avg(age) from t_user;

查询共有多少个id(总数)
select count(id) from t_user;

查询年龄总和,和平均年龄
select count(age),avg(age) from t_user;

注意:

select max(age),name from t_user 
-- 得到的结果是逻辑扭曲的 --
7、GROUP BY:分组统计

语法:

select ... from 表名  group by 列名  

示例:

  • 查询每个部门的最高工资,最低工资,最大年龄,部门id
select max(salary),min(salary),max(age),detp_id from t_employee group by dept_id;
  • 查询每个部门的平均工资,最低工资,工资总和,部门id
select avg(salary),min(salary),sum(salary),dept_id from t_employee group by dept_id;
  • 查询每个部门的员工总数
select count(id),dept_id from t_employee group by dept_id;

注意:分组查询中除了组函数外,只能查询分组条件的字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z78zjv8X-1578311684991)(MySQL_01.assets/group_liucheng.png)]

8、having子句:分组限制
条件筛选: 
	1. where   对总表做筛选 对所有数据做筛选
    2. having  对分组表进行筛选

语法:

select ... from 表名 group by 列名 HAVING .. ;   

在group形成临时表之后,最终确定结果之前执行,即对每个临时表做筛选,满足having条件的临时表才可以将一条数据放入最终结果。

示例:

  • 查询每个部门的平均工资大于10000的员工的平均年龄和最高工资
select avg(age),max(salary),dept_id from t_employee group by dept_id having avg(salary) >10000;
  • 查询最小年龄小于20的部门员工总数和部门id
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,效率更高

什么时候使用Where,什么时候使用having??
1. 需要对总表做筛选使用where,对分组表做筛选用having
2. where后面只能接列名,不能接组函数 而having后都可以
    如果条件中用到了组函数,则使用having
9、case子句

语法:

select 
case  

	when bool表达式 then 结果1
	when bool表达式 then 结果2
	...
	else
		默认结果
end,
列名1,列名2...
from 表名  ...

示例:

select 
case 
	when age < 20 then '青少年'
	when age >=20 and age < 40 then '中年'
	ELSE	'老年'
end as '年龄段',
age,name
from t_employee order by age;
10、子查询

将一个查询结果作为另一个查询的一部分,称为子查询

  • 查询工资大于平均工资的员工信息
select * from t_employee where salary > (select avg(salary) from t_employee);
  • 查询工资小于平均值的员工数量
select count(id) from t_employee where salary < (select avg(salary) from t_employee)
  • 查询平均工资大于10000的部门的员工信息
select id,name,age,salary from t_employee where dept_id in 
(select dept_id from t_employee group by dept_id having avg(salary)>10000)
-- 平均工资大小10000的部门有哪些 显示的部门id  1 3 5
  • 注意:子查询的执行效率,很低

五、补充

  • LENGTH() 获取长度 select * from t_user where length(name)>2;
  • LCASE() 转为小写字符 abcd
  • UCASE() 转为大小字符 ABCD
  • TRIM() 去除头部和尾部的空格
  • NOW() 当前日期和时间
  • CURDATE() 当前日期
  • CURTIME() 当前时间
  • DATE_FORMAT(NOW(),’%Y/%m/%d %H:%i:%s’) 日期格式化
  • DATABASE() 当前的数据库名称
  • USER() 当前用户名
  • VERSION() 当前服务器版本

信息

select id,name,age,salary from t_employee where dept_id in 
(select dept_id from t_employee group by dept_id having avg(salary)>10000)
-- 平均工资大小10000的部门有哪些 显示的部门id  1 3 5
  • 注意:子查询的执行效率,很低
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值