软件安装
- MySQL安装过程的步骤:按照上述链接一步一步安装即可
- MySQL端口号是:3306
- 管理员名字:root
-
采用cmd窗口命令登录
打开cmd窗口,使用mysql命令,使用root用户登录 mysql -uroot -pxxx
- 使用root用户,以ip地址形式登录数据库 mysql -h 127.0.0.1 -u root -pxxxx
SQL语句分类
```plsql SQL特点 sql语句是一个非过程性的语言,每一条sql执行完都会有一个具体的结果出现。多条语句之间没有影响过程性语言:例如java。 int a = 10; int b = 23; int sum = a + b; SQL的作用 sql语句主要是操作数据库,数据表,数据表中的数据记录 - DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create drop alter truncate(清空数据记录) show等
- DML(Data Manipulation Language)数据操作语言★★★ 在数据库表中更新,增加和删除记录。如 update(更新), insert(插入), delete(删除) 不包含查询
- DQL(Data Query Language) 数据查询语言★★★★★ 数据表记录的查询。关键字select。
- DCL(Data Control Language)数据控制语言(了解)
是用来设置或更改数据库用户或角色权限的语句,如grant(设置权限),revoke(撤销权限),begin transaction等。这个比较少用到。
<a name="DaHTI"></a>
#### sql字段类型
<br /> 1.数据型<br /> 1.Java<br /> 整型byte short int long(1 2 4 8)字节<br /> 浮点型 float double<br /> 2,sql<br /> 整型 tinyint smallint int bigint (1 2 3 4 8 )字节<br /> 浮点型(int double)<br /> 常用(int double)<br /> 2.字符型<br /> 1.Java<br /> char:2个字节<br /> String:字符串<br /> 2.sql<br /> char:字符 name char(10) 表示字符长度固定为10 ,如果不足自动用空格补足<br /> varchar:可变的字符variable char, name varchar(10) 表示字符长度最大为10,按实际占用计算<br /> varchar 省存储空间,但是char效率更高一些<br /> (varchar常用 char 可能用到)<br /> 3.日期型<br /> 1.date:年月日<br /> 2.time:时分秒<br /> 3.datetime:年月日时分秒<br /> 4.timestamp:年月日时分秒系统当前时间
<a name="LJlQC"></a>
#### 练习:
<a name="zS78f"></a>
#### 创建数据库练习
```sql
# 0.创建数据库练习
# 1.直接创建数据库db3
create database db3;
# 2.判断是否存在并创建数据库db4
create database if not exists db4;
# 查看仓库的创建语句
show create database db4;
# 3.查看所有的数据库
show databases ;
# 4.删除db3数据库 remove delete drop truncate
drop database db3;
# 5.查看正在使用的数据库
select database();
# 6.使用db4数据库
use db4;
创建表练习
- 需求:设计一张学生表,请注重数据类型、长度的合理性
1.编号
2.姓名,姓名最长不超过10个汉字
3.性别,因为取值只有两种可能,因此最多一个汉字
4.生日,取值为年月日
5.入学成绩,小数点后保留两位
6.邮件地址,最大长度不超过 64
7.家庭联系电话,不一定是手机号码,可能会出现 -
8.学生状态(用数字表示,正常、休学、毕业…)create table student(
id int,
name varchar(10),
sex char(1),
birthday date,
score double,
email varchar(64),
tel varchar(20),
status int
);
相当于class Student {
private int id;
private String name;
}更改表练习
```sql— 1.修改student表名为stu
alter table student rename to stu;— 2.给学生表添加一列remark,类型为varchar(20)
alter table stu add remark varchar(20);— 3.修改remark列的类型是varchar(100)
alter table stu modify remark varchar(100);— 4.修改remark列的名变为intro,类型varchar(30)
alter table stu change remark intro varchar(30);— 5.删除intro列
alter table stu drop intro;
— 查询所有的表 show tables; — 查询表创建语句 show create table stu; — 查询表结构 desc stu; — description 详情 — 删除 drop table stu;
<a name="aXQuM"></a>
#### 添加数据
```sql
# -- 1.创建表
create table student2(
id int,
name varchar(20),
age int,
birthday date,
sex char(2),
address varchar(100)
);
show tables;
# -- 2.插入部分数据,给id name age sex赋值
/*
1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号
2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以
*/
insert into student2(id,name,age,sex) values(1,'zs', 18 , '男');
# -- 3.插入所有的字段,不写字段名
insert into student2 values(2,'ls',19,'1995-01-01','女','上海');
# -- 4.插入所有的字段,写出字段名
insert into student2(id, name, age, birthday, sex, address)
values(3,'ww',19,'1996-01-01','男','杭州');
# -- 5.批量插入数据
insert into student2
values (4,'ml',21,'1996-01-01','男','杭州'),(5,'qq',22,'1997-01-01','男','南京');
# -- 插入数据注意
# -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null
insert into student2
values (6,'sb',22,'1998-01-01','男',null);
修改数据
# -- 1.修改数据:修改性别都变为女(不安全:如果修改语句不加条件,默认是全选)
update student2 set sex = '女';
# -- 2.修改数据:带条件修改id是2的学生性别变为男
update student2 set sex = '男'
where id = 2;
# -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京
update student2 set age = 26,address = '北京'
where id = 3;
删除数据
# -- 1.带条件删除数据,删除id是3的记录
delete from student2
where id = 3;
# -- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2
delete from student2
where id in (1,2); /* where id 1 or 2; 也行 */
# -- 3.不带条件删除
# -- 还可以使用:DDL
# -- 这里的table可以省略
delete from student2; -- 删除表中所有的数据(可以撤销)
truncate table student2; -- 删除表中所有的数据(不可以撤销)
start transaction ;
delete from student2; -- DML
rollback ;
start transaction ;
truncate table student2; -- DDL
rollback ;
查询数据
写出查询每列的名称:
# 7.带条件的查询
# -- 1.查询数学成绩大于80学生
select * from student3 where math > 80;
# -- 2.查询英语成绩小于等于80学生
select * from student3 where english <= 80; -- 小于或等于
# -- 3.查询年龄等于20的学生
select * from student3 where age = 20;
# -- 4.查询年龄不等于20的学生
select * from student3 where age != 20;
select * from student3 where age <> 20; -- 大于或小于,就是不等于
# -- 5.查询年龄大于35并且性别是男的学生
select * from student3 where age > 35 and sex = '男'; -- && 与
# -- 6.查询年龄大于35或者性别是男的学生
select * from student3 where age > 35 or sex = '男'; -- || 或
# -- 7.查询id是1 3 5的学生
select * from student3 where id = 1 and id = 3 and id = 5;
select * from student3 where id in (1 , 3 , 5); -- 简写
# -- 8.查询id不是1 3 5的学生
# -- not in 是in的取反,表示不在什么其中
select * from student3 where id != 1 and id != 3 and id != 5;
select * from student3 where id not in (1 , 3 , 5); -- 简写
# -- 范围查询
# -- 9.英语成绩在75和90之间
select * from student3 where english >= 75 and english <= 90;
select * from student3 where english between 75 and 90; -- between:在...之间,
排序
聚合函数:
— 介绍:多个数据进行计算,结果只有一个
— 常用:sum(求和) avg(平均) count(统计)max(最大值)min(最小值)
— 注意: null不是数据,表示没有数据,不会被聚合函数列入运算
# -- 16.查询学生总数即有多少名学生
select count(id) from student3; -- 8个
select count(english) from student3; -- 7个 柳青没考 english的值为null
select count(*) from student3; -- * 表示所有 只有一行数据有一个列有值就会列入运算
# -- 17.查询数学成绩总分数
select sum(math) from student3; -- 636
# -- 18.查询数学成绩最高分数
select max(math) from student3; -- 99
# -- 19.统计数学和英语总和值
# -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加
select sum(math) from student3; -- 636
select sum(english) from student3; -- 570
select sum(math) + sum(english) from student3; -- 1206
# -- 实现二:分别统计每个人的数学和英语成绩,然后将每个人的数学和英语成绩相加
select sum(math + english) from student3; -- 1120
select math + english from student3; -- 先求每个人的数据成绩总和,然后聚合运算
select math,english from student3;
select math ,ifnull(english , 0) from student3; -- if english is null then english = 0;
select math + ifnull(english , 0) from student3;
select sum(math + ifnull(english , 0)) from student3; -- 1260
/*
结果是:380 少了柳岩的90
sum(math+english):
问题原因:
解决上述问题:使用mysql自带函数:ifnull(字段值,默认值)
说明:
ifnull(字段值,默认值)
如果字段值是null,那么使用默认值作为ifnull函数的整体结果
如果字段值不是null,那么使用字段值作为ifnull函数的整体结果
举例:
ifnull(english,0):
1)假设english的值是null===>ifnull(null,0)===>整体结果是0
2)假设english的值是80===>ifnull(80,0)===>整体结果是80
*/
分组
// 准备数据
create table car(
id int,
color char(2),
price float
);
insert into car(id,color,price) values(1,'黄色',16);
insert into car(id,color,price) values(2,'黄色',16);
insert into car(id,color,price) values(3,'蓝色',5);
insert into car(id,color,price) values(4,'红色',60);
insert into car(id,color,price) values(5,'白色',8);
insert into car(id,color,price) values(6,'红色',60);
# -- 1.查询每种颜色车辆的总价
select sum(price) from car; -- 查询所有汽车的总价
select * from car group by color; -- 查询每种颜色车的单价
select color , sum(price) from car group by color; -- 查询每种颜色车的总价
# -- 2.查询每种颜色车辆总价大于30车辆的颜色和总价
select color , sum(price) from car group by color
having sum(price) > 30; -- having 后面跟聚合函数 (因为此时聚合函数还没执行)
select语句执行顺序
<br /> select 字段 聚合函数 五<br /> from 表名 一<br /> where 条件 二<br /> group by 字段分组 三(聚合函数在分组之后运行的)<br /> having 条件2 四(一般跟分组一起使用,对分组结果进行过滤)<br /> order by 排序字段 六<br /> limit 限制 七<br /> 1,select语句必须有select 和 from关键字<br /> 2.其他关键字可以有可以没有,但是如果有,书写必须按照指定顺序<br /> 3.每个关键字后的数字表示其执行的顺序<br /> 4.where效率比having高的,但是where中不能使用聚合函数
-- 4.查询车的单价大于15的每种颜色车辆总价大于30车辆的颜色和总价
select color,sum(price)
from car
where price > 15
group by color
having sum(price) > 30;
分页
select * from car; -- 查询所有 在开发中不会用
-- 1.数据量太多,服务器压力大
-- 2.用户也不需要
-- 分页查询:比如一页显示2条数据,总共6条分3页
select * from car limit 0 , 2; -- 从0索引开始,查询最多2条记录
select * from car limit 0 , 2; -- 第一页
select * from car limit 2 , 2; -- 第二页
select * from car limit 4 , 2; -- 第三页
-- 假设limit index , count: 且当前页码为page
-- 已知count和page的前提下求index
-- index = (page - 1) * count