1 数据库简介
数据在内存:
优点:读写速度快
缺点:程序结束后数据丢失
保存到文件
优点:数据可以永久保存
缺点:
1、频繁的IO操作,效率不高
2、数据的管理非常不方便,需要把所有的数据整体都读取出来才能操作
数据库:
1、数据永久保存
2、数据管理非常方便
卸载:
1、控制面板-管理工具-服务,停掉MySql服务。
2、控制面板-程序和功能,卸载MySql
3、到C:\Program Files安装目录把MySql目录删除
4、C:\ProgramData删除MySql目录
数据库是以表为组织单位存储数据的。
2 单表
PRIMARY KEY
主键
,不能重复,唯一确定一条记录 (unique+not null)
表中的任何列都可以作为主键,只要它满足一下条件:
1、任意两行都不具有相同的主键值
2、每一行都必须具有一个主键值(主键列不允许空置NULL)
3、主键列中的值不允许修改或更新
4、主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
Duplicate entry '1' for key 'PRIMARY'
AUTO_INCREMENT
自动增长
varchar(10)
char(10)
区别:
相同点:都可以最大放10个字符
不同点:char(10)不管输入的是多少都会占10个字符,例如输入名字“张三”只有两个字符,
但是使用char(10)在数据库里面还是占10个字符的空间。
使用varchar(10)最大支持是10个字符,但是实际长度就是输入字符长度,例如输入名字“张三”只有两个字符,
那么在varchar(10)里面就只占两个字符。
select
数据库中以表为组织单位存储数据。
表类似我们的Java类,每个字段对应类里面的属性。
那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。
类--------------------表
类中属性-------------表中字段(列)
对象------------------记录(行)
字段(列)可以当成变量(类中属性时变量)
变量是可以计算(操作)的
1.1 数据库操作
-- 列出所有的数据库
SHOW DATABASES;
-- 创建数据库
CREATE DATABASE study DEFAULT CHARACTER SET utf8;
-- 删除数据库
DROP DATABASE study;
-- 切换数据库
USE study;
1.2 表基本操作
-- 创建表
CREATE TABLE student(
id INT,
`name` CHAR(10),
age INT,
gender CHAR(1)
);
-- 查看所有表
SHOW TABLES;
-- 查看表的结构
DESC student; -- description
-- 删除表
DROP TABLE student;
-- 修改表的结构 --
-- 添加字段
ALTER TABLE student ADD COLUMN address CHAR (10);
-- 删除字段
ALTER TABLE student DROP COLUMN addr;
-- 修改字段
ALTER TABLE student CHANGE address addr char(10);
-- 修改表的名字
ALTER TABLE student RENAME TO stu;
-- 创建表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` CHAR(10),
age INT,
gender CHAR(1)
);
-- SELECT查询 *代表所有的字段(列)
SELECT * FROM student;
SELECT id,`name` FROM student;
SELECT `name` FROM student;
-- 插入数据
-- INSERT INTO student(id, `name`, age, gender) VALUES(1, '王五', 23, '女');
-- Duplicate entry '1' for key 'student.PRIMARY'
INSERT INTO student(`name`, age, gender) VALUES('王五', 23, '女');
INSERT INTO student(id, `name`, age, gender) VALUES(6, '王五', 23, '女');
INSERT INTO student VALUES(8, '王五', 23, '女');
-- INSERT INTO student VALUES('王五', 23, '女');
-- Column count doesn't match value count at row 1
-- 一次插入多条数据
INSERT INTO student(`name`, age, gender) VALUES('王五1', 23, '女'), ('王五2', 23, '女');
-- 修改数据
UPDATE student SET age = age + 1;
UPDATE student SET age = age + 1, `name` = 'ww' WHERE id = 8;
-- 删除数据
DELETE FROM student;-- 删除表里面所有的数据,非常危险的操作 id 就那么个特点
DELETE FROM student WHERE id = 9;
DELETE FROM student WHERE age = 23;
TRUNCATE TABLE student;-- TRUNCATE删除表里面所有数据,自增的id会重新初始化为初始值1
-- 查询数据
-- 显示所有列(字段)数据
-- 学习时候可以写*,但是在企业开发中需要什么字段就写什么字段,检索不需要的列会降低检索速度和应用程序的性能
SELECT id,`name`,age,gender FROM student;
-- 查询指定列
SELECT `name`,age FROM student;
SELECT id,`name`,age,gender FROM student;
-- 查询的时候增加常量列
SELECT id,`name`,age AS '年龄','Java2403' AS 'classname' FROM student;
SELECT id,`name` '姓名',age '年龄','Java2403' AS '班级名' FROM student;
SELECT id,`name`,(php+java) AS '总成绩' FROM student;
SELECT DISTINCT address FROM student;
-- 条件查询 where ,数据库表一般包含大量的数据,很少需要检索表中所有行
SELECT * FROM student WHERE gender='女';
-- 逻辑条件: and(同时成立) or(只要有一个成立)
SELECT * FROM student WHERE `name`='王五';
SELECT * FROM student WHERE `name`='王五' AND gender='女';
-- 比较运算: > < >= <= != 不等于也可以写成:<>
SELECT * FROM student WHERE java>=80 AND java<=99;
SELECT * FROM student WHERE java BETWEEN 80 AND 99;-- 包含等号
-- 查询address不是青岛的学生
SELECT * FROM student WHERE address!='青岛';
SELECT * FROM student WHERE address<>'青岛';
-- 空值NULL:无值(no value),它与字段包含0、空字符串或紧紧包含空格不同
-- SELECT * FROM student WHERE address=NULL; -- IS NOT NULL
SELECT * FROM student WHERE address IS NULL; -- IS NOT NULL
SELECT * FROM student WHERE address IS NOT NULL; -- IS NOT NULL
1.3 聚合查询
-- 聚合查询
-- 聚合查询函数:sum(),avg(),max(),min(),count()
-- 统计学生php的总成绩(sum求和)
SELECT SUM(php) AS 'php总成绩' FROM student;-- 不存在 叫 计算列
-- 统计学生php的平均值
SELECT AVG(php) AS 'php平均值' FROM student;
-- 统计学生php的最大值
SELECT MAX(php) AS 'php最大值' FROM student;
-- 统计学生php的最小值
SELECT MIN(php) AS 'php最小值' FROM student;
-- 统计学生表里面一共有多少学生
SELECT COUNT(*) AS '总人数' FROM student;-- 空不空都数
SELECT COUNT(id) AS '总人数' FROM student;-- 非空
SELECT COUNT(address) AS '总人数' FROM student;-- 非空
-- 注意:如果指定列名,则COUNT会忽略指定列的值为NULL的行,用*则不忽略。
1.4 查询排序
-- 查询排序 desc:descending asc:ascending
-- 语法:order by 字段 asc/desc 默认是asc升序,可以不写
SELECT * FROM student ORDER BY php;
SELECT * FROM student ORDER BY php ASC;
SELECT * FROM student ORDER BY php DESC;
-- 多个条件排序
-- 需求:先按照php降序,java升序(整体是按照php降序,如果php相同的数据再按照java标准排序)
SELECT * FROM student ORDER BY php DESC, java ASC;
-- order by要放在sql语句的最后
1.5 分组查询
-- 分组查询(group by)
-- 需求:查询男女分别有多少人
-- 性别 人数
-- 男 2
-- 女 1
SELECT gender AS '性别',COUNT(*) AS '人数'
FROM student GROUP BY gender;
SELECT gender AS '性别',COUNT(*) AS '人数'
FROM student GROUP BY gender HAVING COUNT(*)>1;-- 分组后不用where
SELECt gender,COUNT(gender)
FROM student GROUP BY gender;