一.DML数据:数据库操作语句:操作表的记录
前提:需要创建库,或指定使用的库,在使用的库中创建表,从而
操作表中的数据
在本次对表中数据的操作中我们创建一个库
步骤一:创建库
方式一:
语法格式:create database if not exists 库名;
举例:create database if not exests myee_2203;
方式二:
语法格式:create database 库名;
举例:create database myee_2203;
步骤二:使用库
语法格式:use 库名;
举例: use myee_2203;
步骤三:创建表
举例:
CREATE TABLE student(
id INT,
NAME VARCHAR(10),
age INT,
gener VARCHAR(5),
address VARCHAR(50)
);
1.插入数据
1)插入整条数据:
①方式一:一次插入一条数据
语法格式:insert into 表名 values (值1,值2,值3.....值n);
举例:给student表中插入[220304,"文章",35,"男","西安"]
INSERT INTO student VALUES(220304,"文章",35,"男","西安");
-- 查询表中的数据
SELECT*FROM student;
注意事项:插入这些值必须和表中的字段对应上先后顺序保持一致;
②方式二:一次性插入多条数据
语法格式:
insert into表名 values(值1,值2,值3.....值n),(值1,值2,值3.....值n),(值1,值2,值3.....值n);
举例:
INSERT INTO student VALUES(2245,"姚笛",33,"女","上海"),(182,"马伊琍",38,"女","上海");
-- 查询表中的数据
SELECT*FROM student;
2)插入部分字段数据,没有插入的字段,默认值就是null,也支持一次插入多条数据
语法格式:insert into 表名(字段名称1,字段名称2.....)values(值1,值2.....);
①方式一:插入部分字段:一条
语法格式:insert into 表名(字段名称) values(值);
INSERT INTO student(id,NAME,age,gener)VALUES(1,'文爱马',13,'女');
结果显示如下:
②
方式二插入部分字段,多条(其中字段名称数量可选,你想加几条加几条,但是后面的字段数据必须和前面字段名对应)
语法格式:
insert into 表名(字段名称1,字段名称2.....)values(值1,值2.....);
INSERT INTO student(id,NAME,age,gener,address)VALUES(2,'邓超',48,'男','南昌'),(3,'孙俪',48,'女','上海');
INSERT INTO student(id,NAME,age,gener,address)VALUES(2,'等等',13,'男','上海');
结果显示如下:
注意事项:
1)我们所插入的数据必须和字段相互对应,先后顺序保持一致;
2)目前没有加入"数据约束",可以插入非法字符,举例:id重复;(后期需要使用数据约束来限定此行为);
2.修改数据
我们需要注意一般开发中的修改都是带条件修改(推荐使用);
1)一次修改一个字段
语法格式:update 表名 set 字段名 = 值 where 条件;
举例:
UPDATE student SET id = 4 WHERE NAME='等等'; -- 操作一
-- 此处我们应该注意,因为在实际开发中我们的姓名可能出现重复,也就是我们常说的业务字段会出现重复,所以在条件语句中,我们的条件一般使用我们的非业务字段(也就是值是唯一的,不会出现重复数据的字段)作为条件.举例:
UPDATE student SET NAME = '小明' WHERE id = 4; -- 操作二
-- 查询表中数据
SELECT * FROM student;
结果显示如下:
操作一:
操作二:
2)一次性修改多个字段
语法格式:update 表名 set 字段名称1=值1,字段名称2=值2,......字段名称n=值n,where 条件;
举例:
UPDATE student SET NAME='小红' ,age = 8, address = '北京'WHERE id = 4;
-- 查询表中数据
SELECT * FROM student;
表中数据结果显示如下:
3)不带条件 属性批量修改(部分场景可以使用,但是不推荐使用)
语法格式:update 表名 set 字段名称 = 值 ;
UPDATE student SET address = '上海';
结果显示如下:
3.删除数据
1)删除表中单个数据
语法格式:delete from 表名 where 条件;
DELETE FROM student WHERE id =182;
结果显示如下:
2)一次性删除全部数据(一共有两种语法格式)
方式一:
语法格式 :delete from 表名;
方式二:
语法格式: truncate table 表名;
举例:
-- 创建一个新的学生表student02; 其中id加入了主键和自增长约束(在本次用次只是为了证明delete和truncate之间的区别,在mysql三种我们会详细讲解)
CREATE TABLE student02(
id INT PRIMARY KEY AUTO_INCREMENT,-- id主键并且自增长;
NAME VARCHAR(20),
age INT
);
-- 一次插入4条信息
INSERT INTO student02 (NAME,age) VALUES ('高圆圆',42),('张佳宁',32),('文章',35),('王宝强',38) ;
DELETE FROM student02; -- 删除表中数据
-- 重新插入新的数据
INSERT INTO student02(NAME,age) VALUES('高圆圆02',42);
INSERT INTO student02 (NAME,age) VALUES ('姚笛',35);
SELECT*FROM student02; -- 操作一结果
TRUNCATE TABLE student02; -- 删除表中数据
-- 重新插入新的数据
INSERT INTO student02 (NAME,age) VALUES('高圆圆02',42);
INSERT INTO student02 (NAME,age) VALUES ('姚笛',35);
SELECT*FROM student02; -- 操作二结果
操作一结果显示如下:
操作二结果显示如下:
从数据结果显示来看我们不难发现delete 与 truncate之间的区别:
1>相同点:他们都可以删除表中的数据;
2>不同点:
①
delete from 表名;仅仅只是将标的全部记录删除了表还在,
它主要针对id(非业务字段:设置主键并且自增长),它不影响自增长主键的这个值;
②truncate table 表名;将表中所有的数据删除,而且还会在删除之后,自创一张一模一样的表,影响自增主键的值!
二.DQL语句:(数据库查询语句)
1.基本条件查询(select 关键字)
-- 建立一个表student03
CREATE TABLE student03(
id INT,-- 编号
NAME VARCHAR(20),-- 姓名
age INT,-- 年龄
sex VARCHAR(5), -- 性别
address VARCHAR(10), -- 地址
math INT,
english INT
);
-- 插入字符段
INSERT INTO student03 (id,NAME,age,sex,address,math,english)VALUES
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'男','深圳',98,88),
(3,'王健林',68,'男','北京',100,68),
(4,'赵云',79,'男','四川',89,45),
(5,'柳青',20,'女','湖南',76,83),
(6,'柳岩 ',20,'女','湖南',76,65),
(7,'王嘉尔',25,'男','香港',89,100),
(8,'刘嘉玲',50,'女','香港',60,63);
1)查看不表中所有数据
语法一:select*from 表名;
注意:*代表所有字段,仅仅是自己图方便时可以使用,实际开发中不能使用*,应把所有的字段名称写上;
举例:
SELECT * FROM student03;
结果显示如下:
语法二:实际开发中查询全部字段,把字段名称全部写上
select 字段列表 from 表名;
举例:
SELECT
id,
NAME,
age,
sex,
address,
math,
english
FROM
student03 ;
结果显示如下:
2)
查询全部字段的时候,给字段起个别名 as'别名名称',其中as可以省略
SELECT
id AS '编号',
NAME AS '姓名',
age AS '年龄',
sex AS '性别',
address AS '住址',
math AS '数学成绩',
english AS '英语成绩'
FROM
student03 ;
-- as 可以省略
SELECT
id '编号',
NAME '姓名',
age '年龄',
sex '性别',
address '住址',
math '数学成绩',
english '英语成绩'
FROM
student03 ;
两种操作结果如下:
3)当表名比较长的时候,可以给表起一个别名;
语法格式:表名 as 别名;其中as可以省略
举例:
SELECT
s.`id` '学生编号',
s.`name` '学生姓名',
s.`age` '学生年龄',
s.`sex` '学生性别',
s.`address` '家庭住址',
s.`math` '数学成绩',
s.`english` '英语成绩'
FROM
student03 s ;-- 给student起了一个别名.
结果显示如下:
4)可以查询部分字段
语法格式: select 字段名称列表(自己想要查询的字段) from 表名;
举例
SELECT
NAME '姓名',
age '年龄',
english '英语',
math '数学'
FROM
student03;
结果显示如下:
5)
可以查询单个字符段
语法格式:
select 字段名称 from 表名;
举例
SELECT
address
FROM
student03 ;
结果显示如下:
6_ 发现:字段冗余(重复度大),字段去重distinct;
语法select disrinct 字段名称 from 表名;
SELECT DISTINCT address'住址' FROM student03;
结果显示:
三.DQL语句:条件查询 where关键字
1.使用赋值运算符=,比较运算符<,<=,>,>=,!=
1>对于单个范围来讲
SELECT
*
FROM
student03
WHERE age > 30 ;
结果显示:
2>针对两个范围的查询
①
方式一: java中逻辑符号&&,||;
-- 需求:查询student03中年龄在20至30岁之间的学生姓名,年龄,住址
SELECT
NAME '姓名',
age '年龄',
address '住址'
FROM
student03
WHERE
age<30 && age>20;-- 逻辑双与&&
结果显示:
②方式二"使用mysql自己提供的逻辑运算符and(连接并列关系),or(或关系)
SELECT
NAME '姓名',
age '年龄',
address '住址'
FROM
student03
WHERE age > 20
AND age < 30 ;
结果显示:
③
方式三:between 值1 and 值2;
SELECT
NAME '姓名',
age '年龄',
address '住址'
FROM
student03
WHERE age BETWEEN 15
AND 25 ;
结果显示:
注意:between 值1 and 值2,表示的是 <=值1,>=值2
3.或的使用
1)方式一:可以使用Java中逻辑运算符 ||
-- 需求:查询student03中年龄是18岁,或者是20岁,或者是45岁的所有学生
SELECT
*
FROM
student03
WHERE age = 18 || age = 20 || age = 45 ;
结果显示:
2)
方式二:使用mysql中提供的逻辑运算符or
SELECT
*
FROM
student03
WHERE age = 18
OR age = 20
OR age = 45 ;
结果显示:
3)
方式三:以上这种格式可以优化为in(值1,值2...);in集合语句
SELECT
*
FROM
student03
WHERE age IN (18, 20, 45) ;
结果显示:
3.查询不等于的条件
语法格式:
select
字符名称1,
字符名称2,
.....
from
表名
where
条件语句;
1)方式一:使用java中的比较运算符!=;
-- 需求:查询student03中不等于20岁的学生所有信息
SELECT
*
FROM
student03
WHERE age != 20 ;
结果显示:
2)方式二:使用mysql中的不等运算符"<>";
SELECT
*
FROM
student03
WHERE age <> 20 ;
结果显示:
4.判断某个条件是否为null,mysql不支持java中"变量==null"这种格式;
1)在mysql中判断某字段为mull,使用的语句时 is nill;
UPDATE student03 SET english = NULL WHERE NAME="刘嘉玲"; -- 改变指定的字段值
SELECT*FROM student03;
-- 需求:查询student03中english为null的学生全部信息
-- select*from student03 where english == null;此方法不可用
SELECT*FROM student03 WHERE english IS NULL;
结果显示:
2)在mysql中判断某字段不为null的信息,使用的语法是 is not null;
-- 需求查询student03中english不为null的学生全部信息;
SELECT*FROM student03 WHERE english IS NOT NULL;
结果显示
注意:int类型字段求和的时候,注意:int类型的值 + null 值 = null;
举例:
--需求:查询student03中学生姓名以及数学和英语的总分
SELECT
NAME "姓名",
(math + english) "总分"
FROM
student03 ;
结果显示:
针对上述情况,mysq l提供一个函数ifnull(字段名称,值);
3)fnull(字段名称,值);表示如果字段名称是null,给一个初始化值;
SELECT
NAME '姓名',
(math + IFNULL(english, 0)) '总分'
FROM
student03 ;
结果显示:
5.DQL语句之 where条件后面加入模糊查询---关键字 like;
1)语
法 select 字段列表 from 表名 where 字段名称 like %xxx%;
%:代表任何多个字符或某个字符(第一个%可以不写)
-- 需求:查询student03中所有姓马的学生信息
-- 方式一:
SELECT
*
FROM
student03
WHERE NAME LIKE '%马%' ;
--方式二
SELECT
*
FROM
student03
WHERE NAME LIKE '马%' ;
方式一和方式二的操作结果显示都为:
2)_代表:某个单个字符
SELECT
*
FROM
student03
WHERE NAME LIKE '马_' ;
结果显示如下:
注意:" _"个数代表:字符个数;
-- 需求查询姓名为三个字符的学生信息;
SELECT
*
FROM
student03
WHERE NAME LIKE '___' ;
结果显示如下:(
注意:空格也代表一个字符;)
6.聚合函数查询:针对int类型(单行单列数据)
语法:select 聚合函数 from 表名 where 还可以指
定条件;
1)count(字段名称):查询表中记录,
-- 字段名称使用的都是id(非业务字段)
SELECT
COUNT(english) '英语总记录数'
FROM
student03 ;
-- 使用业务字段来查询的话应嵌套ifnull();(不嵌套ifnull()会出现问题)
SELECT
COUNT(IFNULL(english, 0)) '英语总记录数'
FROM
student03 ;
SELECT
COUNT(id) '总记录数'
FROM
student03 ;
结果显示:
第一次查询:
第二次:
第三次
2) avg(字段名称):查询这个字段中平均值;
语法格式:select avg(字段名称) from 表名;
-- 查询表中所有学生的数学成绩平均值
SELECT
AVG(math) '数学平均分'
FROM
student03 ;
SELECT
AVG(IFNULL(english,0)) '英语平均成绩'
FROM
student03 ;
结果显示:
3)sum(字段列表):求和函数;
语法格式:select sum(字段名称) from 表名;
-- 需求查询所有学生数学成绩总和
SELECT
SUM(math) "数学总成绩"
FROM
student03 ;
-- 需求查询全部学生的总分;
SELECT
SUM(math + IFNULL(english, 0))'总分'
FROM
student03 ;
结果显示:
4) max(字段名称):最大值;
-- 需求查询所有有学生中数学成绩最好的学生
SELECT
MAX(math) '数学最高分'
FROM
student03 ;
结果显示:
5)min(字段名称):最小值;
-- 需求查询所有有学生中数学成绩最差的学生
SELECT
MIN(IFNULL(english,0)) "数学最低分"
FROM
student03;
结果显示:
6)select语句嵌套select语句---子查询;
-- 使用where 条件 比较运算符;
-- 为了方便后续方法的使用,我们将student03中刘嘉玲的英语成绩增加上;
UPDATE student03 SET english = 69 WHERE NAME='刘嘉玲';
SELECT*FROM student03;-- 查询表中所有数据
-- 需求:查询student03中数学成绩最高分的学生信息;
-- 分步走
-- 1)先查询除数学成绩最好是多少
-- 2)根据数学成绩最好的值,查询该学生信息
-- 步骤一
SELECT
MAX(math)
FROM
student03 ;
-- 步骤二
SELECT
*
FROM
student03
WHERE math = 100 ;
-- 一步走(使用嵌套)
SELECT
*
FROM
student03
WHERE math =
(SELECT
MAX(math)
FROM
student03) ;
结果显示:
7.DQL之排序查询 order by
语法格式:
select 字段列表 from 表名 order by 字段名称 顺序规则(asc(默认值就是升序))或的desc 降序;
-- 需求:按照数学成绩升序排序
SELECT
*
FROM
student03
ORDER BY math ;-- 默认不写排序规则为升序,升序也可以使用关键字asc
结果显示:
-- 需求:按照英语成绩升序排序
SELECT
*
FROM
student03
ORDER BY english ASC ;
结果显示:
-- 需求按照数学成绩降序排序
SELECT
*
FROM
student03
ORDER BY math DESC ;
结果显示
注意:同时条件和order by,order by在where的后面
-- 需求:数学成绩大于56分的学生进行数学的降序排序
SELECT
*
FROM
student03
WHERE math > 90 -- 先满足条件才能够进行排序;
ORDER BY math DESC;
结果显示
注意:多个字段要同时排序,首先第一个字段排序规则,然后才是第二个字段
-- 需求:数学成绩降序,英语成绩升序排序
SELECT
*
FROM
student03
ORDER BY math DESC,
english ASC;
结果显示