方式一: 数据放到内存
优点:
1)擦写数据的效率很高!
缺点:
1)无法永久保存,当程序关闭了,数据丢失
方式二: 数据放到普通文件
优点:
1)可以永久保存
缺点:
1)频繁地进行IO操作,效率比较低
2)查询数据不方便的!!!
方式三: 数据放到数据库软件
优点:
1)数据永久保存下来
2)查询数据非常方便的!!
3)效率不能低
数据库软件,存储和管理数据的仓库。
Oracle: 是甲骨文公司的产品。满足中大型应用。和java语言兼容性非常好的。
SQL Server: 是微软公司的产品。和net平台(c#语言)兼容最好。
DB2: 是IBM的产品。
mysql:开源的数据库产品。和java语言兼容非常好。满足中小型应用。
mangoDB: noSQL数据库
mysql: 满足中小型应用
oracle:满足中大小应用
C:\Users\APPle>mysql -u root -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.5.40 MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> |
※数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
※数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
※ 数据查询语言(DQL),例如:SELECT语句。(一般不会单独归于一类,因为只有一个语句)。
※数据控制语言(DCL),例如:GRANT、REVOKE等语句。
※事务控制语言(TCL),例如:COMMIT、ROLLBACK等语句。
SQL语言包括四类种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)还有事务控制语言(TCL)。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | 数据库的元数据 | mysql | 数据库用户信息或软件配置信息 | performance_schema | 数据库软件运行的性能数据 | test | 测试数据库 +--------------------+ 4 rows in set (0.00 sec) |
create database user;
指定字符集 create database user default character set gbk;
修复数据库的字符集 alter database user default character set utf8;
drop database admin_user;
操作表之前,需要切换数据库: use 数据库名称 例如 use admin_user;
create table student(id int,name varchar(20),age int);
create table 表名(字段名称 字段类型,字段名称 字段类型.....);
添加字段:alter table student add column gender varchar(1);
修改字段类型:alter table student modify column gender varchar(2);
修改字段名称:alter table student change column gender sex varchar(2);
删除字段:alter table student drop column age;
修改表名称:alter table student rename to teacher;
desc student;
show tables: 查看当前数据库的所有表
drop table teacher;
1.1插入数据(insert into)
需求: 往学生表插入数据
INSERT INTO student VALUES(1,‘张三‘,20);
1)插入的字段值顺序一定是按照表的字段顺序
INSERT INTO student VALUES(‘张三‘,1,20);报错
2)字段的数据一定要和值的数量要一致
INSERT INTO student VALUES(2,20); 报错
3)插入部分字段
INSERT INTO student(id,NAME) VALUES(2,‘李四‘);
1.2 修改数据(update)
需求: 修改学生表
1)批量操作(不建议经常使用这种)
UPDATE student SET NAME=‘张三‘;
2)按条件修改,修改一个字段
需求: 修改id为2的学生姓名
UPDATE student SET NAME=‘李四‘ WHERE id=2;
需求: 修改id为1的学生姓名和年龄
3)修改多个字段
UPDATE student SET NAME=‘王五‘,age=40 WHERE id=1;
1.3 删除数据(delete from)
1) 全表数据删除
DELETE FROM student;
2)按条件删除数据
DELETE FROM student WHERE id=2;
3)truncate table也可以删除全表数据
TRUNCATE TABLE student;
注意:delete from 和 truncate table 的区别?
1)delete from删除全部,也可以按条件删除,但是truncate table只能全表删除,不能按条件删除
2)delete from删除的数据可以回滚,truncate table删除的数据不能回滚。
3)delete from不可以把自增长约束(auto_increment)重置,truncate table可以把自增长约束(auto_increment)重置
truncate table student where id=1; 错误的语法
1.4 查看所有数据(重点中的重点)
SELECT * FROM student;
5.1 查询所有字段 SELECT * FROM student;
5.2 查询指定的字段 SELECT id,NAME FROM student;
5.3 查询时指定别名(AS可以省略) SELECT id AS ‘编号‘,NAME AS ‘姓名‘ FROM student;
5.4 查询时添加常量列
临时使用的列可以通过查询时动态添加进去
需求: 查询学生数据时添加一个"班级"列。值为“java就业班”
SELECT id AS ‘编号‘,NAME AS ‘姓名‘,‘java就业班‘ AS ‘班级‘ FROM student;
5.5 查询时合并列
需求: 查询每个学生的总分。
SELECT NAME AS ‘姓名‘,(servlet+mysql) AS ‘总成绩‘ FROM student;
注意: 合并列的字段必须是数值类型的字段。非数值类型合并没有效果
SELECT NAME AS ‘姓名‘,(servlet+NAME) FROM student;
5.6 查询去除重复记录
需求: 查询有哪些的地区学生
SELECT DISTINCT address FROM student;
另一种语法
SELECT DISTINCT(address) FROM student;
5.7 条件查询
1)逻辑条件: and(与) or(或)
当出现两个或两个以上的条件,那么这两个条件直接一定会存在逻辑关系。要么是与关系,要么或关系
需求:查询学生的id为1,且姓名为张三的学生
SELECT * FROM student WHERE id=1 AND NAME=‘张三‘; -- (交集,结果数小于或等于任何一个条件的结果数)
需求:查询学生的id为2,或姓名为张三的学生
SELECT * FROM student WHERE id=2 OR NAME=‘张三‘; -- (并集,结果数一定会大于或等于任何一个条件的结果数)
2)比较条件: > < >= <= = <> (between and)
需求: 查询servlet分数大于80分的学生
SELECT * FROM student WHERE servlet>80;
需求:查询mysql分数小于或等于85分的学生
SELECT * FROM student WHERE mysql<=85;
SELECT * FROM student WHERE mysql<85 OR mysql=85;
需求: 查询servlet分数大于或等于80分,且小于或等于85分的学生
SELECT * FROM student WHERE servlet>=80 AND servlet<=85;
上面sql代替的语法
SELECT * FROM student WHERE servlet BETWEEN 80 AND 85; -- 在..。之间(包前包后)
需求:查询年龄不等于30岁的学生
SELECT * FROM student WHERE age<>30;
3)判空条件: is null , is not null, =‘‘ , <>‘‘
null: 表示没有数据 is null =‘‘
空字符:有数据 is not null <>‘‘
需求:查询没有性别数据的学生(数据‘男’或‘女’)
SELECT * FROM student WHERE gender IS NULL OR gender=‘‘;
需求: 查询有性别数据的学生
SELECT * FROM student WHERE gender IS NOT NULL AND gender<>‘‘;
4)模糊条件: like
模糊替代符号:
%: 替代任意个字符
_: 替代一个字符
需求: 查询姓‘李’的学生
SELECT * FROM student WHERE NAME LIKE ‘李%‘;
需求: 查询姓名中包含‘四’字的学生
SELECT * FROM student WHERE NAME LIKE ‘%四%‘;
需求:查询姓‘李’,全名只有两个字的学生
SELECT * FROM student WHERE NAME LIKE ‘李_‘;
5.8 聚合查询
用于统计结果
max() min() avg() count()
需求: 查询servlet的最高分
max() 取最大值
SELECT MAX(servlet) FROM student;
需求: 查询mysql的最低分
min(): 取最小值
SELECT MIN(mysql) FROM student;
需求: 查询servlt的平均分
avg(): 平均函数
SELECT AVG(servlet) FROM student;
需求:查询当前有几个学生
count(): 统计表的记录数量
SELECT COUNT(*) FROM student;
count(id): 统计有值的id字段的数量(排除null的数据)
SELECT COUNT(id) FROM student;
使用count统计表的数据,不要使用存在null的字段
SELECT COUNT(gender) FROM student;
5.9 分页查询
limit 起始行数,查询的行数
起始行数从0开始
SELECT * FROM student;
需求:学生共20条数据,每页显示5条,共4页
看第3页(第11到15条)的学生数据sql:select * from student limit 10,5;
看第4页(第16到20条)的学生数据sql: select * from student limit 15,5;
知道: 当前页码,每页显示条数
结论分页查询当前页数据的sql: select * from student limit (当前页码-1)*每页显示条数,每页显示条数;
需求: 查询第1,2条数据
SELECT * FROM student LIMIT 0,2;
需求: 查询第3,4条数据
SELECT * FROM student LIMIT 2,2;
需求:查询第5,6条数据
SELECT * FROM student LIMIT 4,2;
5.10 查询后排序(order by)注意:orderby一般都放在sql语句的最后
desc: 降序。数值从大到小,字母z-a
asc: 升序。数值从小到大,字母a-z
默认情况下,按照插入的顺序排序
SELECT * FROM student;
需求:按照id的升序排序
SELECT * FROM student ORDER BY id ASC;
需求: 按照servlet成绩降序排序
SELECT * FROM student ORDER BY servlet DESC;
多个排序条件的情况:先按照前面的条件排序,当出现重复记录,再按照后面的条件排序
需求: 按照age升序,按照servlet成绩升序排序
SELECT * FROM student ORDER BY age ASC,servlet ASC;
select * from student order by username asc;
5.11 分组查询(group by)
需求: 查询每个地区有多少人
预期结果:
男 3
女 1
SELECT address,COUNT(*) FROM student;
1)对地区进行分组 2)在分组的基础可以进行统计,统计的是每组的数据
SELECT address,COUNT(*) FROM student GROUP BY address;
需求: 统计男女的人数
注意:order by 必须放在分组之后; where条件必须放在group by分组之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>‘‘ GROUP BY gender;
5.12 分组查询后筛选(having)
需求: 查询哪些地区的人数大于2个的地区
1)查询哪些地区多少人 2)筛选人数大于2的地区
注意: having使用在group by分组之后的,对分组后的条件进行筛选
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2 ;
char(20) vs varchar(20)
char(20): 固定长度的字符串。不管实际存储的数据的大小,一定占用20个字符空间
varchar(20): 可变长度的字符串。占用的空间大小就是实际存储的数据大小。
int vs int(4)
int: 默认最多11位,长度根据实际存储的数值的长度
int(4): 固定的数组长度
CREATE TABLE test(
id1 INT,
id2 INT(4) ZEROFILL -- zerofill: 零填充
)
INSERT INTO test VALUES(1,1);
SELECT * FROM test;
date vs datetime vs timestamp
date: 日期
datetime: 日期+时间
timestamp: 时间戳,用于记录当前数据的插入或更新的时间
CREATE TABLE test_date(
date1 DATE,
date2 DATETIME,
date3 TIMESTAMP
)
INSERT INTO test_date(date1,date2) VALUES(‘2018-06-17 17:35:45‘,‘2018-06-17 17:35:45‘);
SELECT * FROM test_date;
UPDATE test_date SET date2=‘2018-06-17 17:40:45‘;
分类 |
数据类型 |
说明 |
数值类型 |
BIT(M) bit bit(8) TINYINT [UNSIGNED] [ZEROFILL] byte BOOL,BOOLEAN boolean SMALLINT [UNSIGNED] [ZEROFILL] short INT [UNSIGNED] [ZEROFILL] int BIGINT [UNSIGNED] [ZEROFILL] long FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] float DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] double |
位类型。M指定位数,默认值1,范围1-64 带符号的范围是-128到127。无符号0到255。 使用0或1表示真或假 2的16次方 2的32次方 2的64次方 M指定显示长度,d指定小数位数 表示比float精度更大的小数 |
文本、二进制类型 |
CHAR(size) char(20) max—255 abc VARCHAR(size) varchar(20) 65535 abcde String BLOB LONGBLOB 大的二进制数据 TEXT(clob) LONGTEXT(longclob) 大文本数据 |
固定长度字符串 可变长度字符串 二进制数据 大文本 |
时间日期 |
DATE/DATETIME/TimeStamp |
日期类型(YYYY-MM-DD) (YYYY-MM-DD HH:MM:SS),TimeStamp表示时间戳,它可用于自动记录insert、update操作的时间 |
原文:https://www.cnblogs.com/lldsgj/p/10801286.html