常见的数据库软件
数据库软件,存储和管理数据的仓库。1、Oracle: 是甲骨文公司的产品。满足中大型应用。和java语言兼容性非常好的。
2、SQL Server: 是微软公司的产品。和net平台(c#语言)兼容最好。
3、DB2: 是IBM的产品。
4、mysql:开源的数据库产品。和java语言兼容非常好。满足中小型应用。
5、mangoDB: noSQL数据库
注:mysql:满足中小型应用
oracle:满足中大小应用
oracle:满足中大小应用
sql语句分类
1、数据库定义语句(DDL):create、alter、drop
2、数据库操作语句(DML):insert、update、delete、truncate
3、数据库查询语句(DQL):select、show
MySQL数据库基本使用
连接MySQL:mysql -u root -p管理数据库
1、查看所有数据库:show databases;2、创建新的数据库:create database day14;
指定字符集:create database day15 default character set gbk;
3、修改数据库(修复数据库的字符集):alter database day15 default character set utf8;
4、删除数据库:drop database day15;
管理表
操作表之前,需要切换数据库: use 数据库名称 例如 use day14;1、创建新的表(create table):create table 表名(字段名称 字段类型,字段名称 字段类型.....);
create table student(
id int,
name varchar(20),
age int
);
2、修改表(alter 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;
3、查看表:desc student;
查看当前数据库的所有表:show tables;
4、删除表:drop table teacher;
管理数据
1、插入数据(insert into)往学生表插入数据:INSERT INTO student VALUES(1,'张三',20);
插入部分字段:INSERT INTO student(id,NAME) VALUES(2,'李四');
2、修改数据(update)
批量操作(不建议经常使用这种):UPDATE student SET NAME='张三';
按条件修改,修改一个字段:修改id为2的学生姓名:UPDATE student SET NAME='李四' WHERE id=2;
修改多个字段:修改id为1的学生姓名和年龄:UPDATE student SET NAME='王五',age=40 WHERE id=1;
3、删除数据(delete from)
全表数据删除:DELETE FROM student;
按条件删除数据:DELETE FROM student WHERE id=2;
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)重置
4、查询数据(select)
1)查询所有字段:SELECT * FROM student;
2)查询指定的字段:SELECT id,NAME FROM student;
3)查询时指定别名:SELECT id AS '编号',NAME AS '姓名' FROM student;
as可以省略:SELECT id '编号',NAME '姓名' FROM student;
4)查询时添加常量列
临时使用的列可以通过查询时动态添加进去
查询学生数据时添加一个"班级"列。值为“java就业班”:SELECT id AS '编号',NAME AS '姓名','java就业班' AS '班级' FROM student;
5)查询时合并列:查询每个学生的总分:SELECT NAME AS '姓名',(servlet+mysql) AS '总成绩' FROM student;
注:合并列的字段必须是数值类型的字段。非数值类型合并没有效果:SELECT NAME AS '姓名',(servlet+NAME) FROM student;
6)查询去除重复记录(distinct):查询有哪些的地区学生:SELECT DISTINCT address FROM student;
7)条件查询(where)
(1)逻辑条件: and(与) or(或)
查询学生的id为1,且姓名为张三的学生:
SELECT * FROM student WHERE id=1 AND NAME='张三'; -- (交集,结果数小于或等于任何一个条件的结果数)
查询学生的id为2,或姓名为张三的学生:
查询学生的id为2,或姓名为张三的学生:
SELECT * FROM student WHERE id=2 OR NAME='张三'; -- (并集,结果数一定会大于或等于任何一个条件的结果数)
(2)比较条件: > < >= <= = <> (between and)
查询servlet分数大于80分的学生:
(2)比较条件: > < >= <= = <> (between and)
查询servlet分数大于80分的学生:
SELECT * FROM student WHERE servlet>80;
查询mysql分数小于或等于85分的学生:
查询mysql分数小于或等于85分的学生:
SELECT * FROM student WHERE mysql<=85;
SELECT * FROM student WHERE mysql<85 OR mysql=85;
查询servlet分数大于或等于80分,且小于或等于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岁的学生:
上面sql代替的语法:SELECT * FROM student WHERE servlet BETWEEN 80 AND 85; -- 在..。之间(包前包后)
查询年龄不等于30岁的学生:
SELECT * FROM student WHERE age<>30;
(3)判空条件: is null , is not null, ='' , <>''
查询没有性别数据的学生(数据‘男’或‘女’):
(3)判空条件: 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 '李_';
8)聚合查询
查询所有学生servlet的总分 (SUM: 求和函数):SELECT SUM(servlet) FROM student;
查询所有学生servlet的平均分(AVG; 平均函数):SELECT AVG(servlet) FROM student;
查询最高的servlet分数(MAX:最大值函数):SELECT MAX(servlet) FROM student;
查询最低的servlet分数(MIN:最小值函数):SELECT MIN(servlet) FROM student;
查询学生数量(COUNT: 统计数量函数):
(4)模糊条件: like
模糊替代符号:
%: 替代任意个字符
_: 替代一个字符
查询姓‘李’的学生:SELECT * FROM student WHERE NAME LIKE '李%';
查询姓名中包含‘四’字的学生:SELECT * FROM student WHERE NAME LIKE '%四%';
查询姓‘李’,全名只有两个字的学生:SELECT * FROM student WHERE NAME LIKE '李_';
8)聚合查询
查询所有学生servlet的总分 (SUM: 求和函数):SELECT SUM(servlet) FROM student;
查询所有学生servlet的平均分(AVG; 平均函数):SELECT AVG(servlet) FROM student;
查询最高的servlet分数(MAX:最大值函数):SELECT MAX(servlet) FROM student;
查询最低的servlet分数(MIN:最小值函数):SELECT MIN(servlet) FROM student;
查询学生数量(COUNT: 统计数量函数):
SELECT COUNT(*) FROM student;
SELECT COUNT(id) FROM student; -- 效率会比count(*)效率稍高
注意:聚合函数,会排除null值的数据
9)分页查询(limit)
limit 起始行数,查询的行数(起始行数从0开始)
学生共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;
10)查询后排序(order by)
desc: 降序。数值从大到小,字母z-a
asc: 升序。数值从小到大,字母a-z
按照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;
11)分组查询(group by)
查询每个地区有多少人
(1)对地区进行分组
(2)在分组的基础可以进行统计,统计的是每组的数据
SELECT address,COUNT(*) FROM student GROUP BY address;
统计男女的人数:注:where条件必须放在group by分组之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
SELECT COUNT(id) FROM student; -- 效率会比count(*)效率稍高
注意:聚合函数,会排除null值的数据
9)分页查询(limit)
limit 起始行数,查询的行数(起始行数从0开始)
学生共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;
10)查询后排序(order by)
desc: 降序。数值从大到小,字母z-a
asc: 升序。数值从小到大,字母a-z
按照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;
11)分组查询(group by)
查询每个地区有多少人
(1)对地区进行分组
(2)在分组的基础可以进行统计,统计的是每组的数据
SELECT address,COUNT(*) FROM student GROUP BY address;
统计男女的人数:注:where条件必须放在group by分组之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
12)分组查询后筛选(group by + having(条件))
查询哪些地区的人数大于2个的地区
注:having使用在group by分组之后的,对分组后的条件进行筛选
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2 ;
2、varchar(20): 可变长度的字符串。占用的空间大小就是实际存储的数据大小。
3、int: 默认最多11位,长度根据实际存储的数值的长度
4、int(4):固定的数组长度
CREATE TABLE test(
id1 INT,
id2 INT(4) ZEROFILL -- zerofill: 零填充
)
结果:id1:1
id2:0001
5、float/double:浮点数。
7、date: 日期
7、datetime: 日期+时间
8、timestamp: 时间戳,用于记录当前数据的插入或更新的时间,会自动进行时区的转换
9、time: 时间
10、year: 年份
11、blob:二进制数据
12、text:字符数据
查询哪些地区的人数大于2个的地区
注:having使用在group by分组之后的,对分组后的条件进行筛选
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2 ;
MySQL字段类型
1、char(20): 固定长度的字符串。不管实际存储的数据的大小,一定占用20个字符空间2、varchar(20): 可变长度的字符串。占用的空间大小就是实际存储的数据大小。
3、int: 默认最多11位,长度根据实际存储的数值的长度
4、int(4):固定的数组长度
CREATE TABLE test(
id1 INT,
id2 INT(4) ZEROFILL -- zerofill: 零填充
)
结果:id1:1
id2:0001
5、float/double:浮点数。
7、date: 日期
7、datetime: 日期+时间
8、timestamp: 时间戳,用于记录当前数据的插入或更新的时间,会自动进行时区的转换
9、time: 时间
10、year: 年份
11、blob:二进制数据
12、text:字符数据