java_day14
MySQL数据库
数据库是按照特定的格式将数据存储在⽂件中,通过SQL语句可以⽅便的对⼤量数据进⾏增、删、改、
查操作,数据库是对⼤量的信息进⾏管理的⾼效的解决⽅案
SQL语句
结构化查询语⾔(Structured Query Language)简称SQL,SQL语句就是对数据库进⾏操作的⼀种语
⾔
SQL语句分类
1. DDL(Data Definition Language)数据定义语⾔
⽤来定义数据库对象:数据库,表,列等。关键
字:create, drop,alter等
2. DML(Data Manipulation Language)数据操作语⾔
⽤来对数据库中表的数据进⾏增删改。关键
字:insert, delete, update等
3. DCL(Data Control Language)数据控制语⾔
⽤来定义数据库的访问权限和安全级别,及创建⽤户。关键字:GRANT, REVOKE等
4. DQL(Data Query Language) 数据查询语⾔
DQL语⾔并不是属于MYSQL官⽅的分类,但是对数据库的操作最多就是查询,所以
我们的程序员把查询语句的语句称作为DQ
SQL通⽤语法
1. SQL语句可以单⾏或多⾏书写,以分号结尾。
2. 可使⽤空格和缩进来增强语句的可读性。
3. MySQL数据库的SQL语句不区分⼤⼩写,关键字建议使⽤⼤写。
4. 3种注释 单⾏注释: -- 注释内容 或 # 注释内容(mysql特有) 多⾏注释: /* 注释 */
DDL操作数据库
创建数据库
关键字:CREATE,ALTER,SHOW,DROP
-- 直接创建数据库 CREATE DATABASE 数据库名; -- 判断是否存在并创建数据库 CREATE DATABASE IF NOT EXISTS db1; -- 创建数据库并指定字符集 CREATE DATABASE db3 DEFAULT CHARACTER SET gbk; -- 查看所有的数据库 SHOW DATABASES -- 修改数据库字符集 ALTER DATABASE db3 DEFAULT CHARACTER SET uft8; -- 删除数据库 DROP DATABASE db1; -- 查看某个数据库的自定义信息 SHOW CREATE DATABASE db3; -- 查看正在使用的数据库 SELECT DATABASE(); -- 切换数据库 USE db3;
CREATE TABLE 表名( 字段名1 字段类型1 字段名2 字段类型2 ); --创--创建student表包含id,NAME,birthday学习 CREATE TABLE student( id INT, NAME VARCHAR(10), birthday DATE ); -- 查看某个数据库的表 SHOW TABLES; -- 查看表结构 DESC student; -- 查看创建表的SQL语句 SHOW CREATE TABLE 表名; -- ``重音符合/飘号,`student`表示字符串
-- 快速创建一个表结构相同的表 CREATE TABLE 表名 LIKE 其他表; -- 直接删除表 DROP TABLE S1; -- 判断表是否存在并删除 DROP TABLE IF EXISTS S1; -- 修改表结构 -- 1.所有的修改表结构的语句都是:ALTER TABLE 表名 XXX; -- 2.添加表一列 ALTER TABLE student ADD remark VARCHAR(20); -- 3.修改类型 ALTER TABLE 表名 MODIFY 字段名 新类型; -- 4.修改字段名和类型 ALTER TABLE 表名 CHANGE 老字段名 新字段名 类型; -- 5.删除一列 ALTER TABLE 表名 DROP 字段名; -- 6.修改表的字符集 ALTER TABLE 表名 DEFAULT CHARACTER SET 新字符集; -- 1.不带条件的修改数据 UPDATE 表名 SET 字段名=新值 -- 2.带条件修改数据 UPDATE student SET sex='男' WHERE id=1; -- 3.带条件修改多个数据 UPDATE student SET brethday='1995-03-23', address('北京') WHERE id=3;
CREATE TABLE student( id INT, name VARCHAR(20). birthday DATE, sex char(2). address varchar(50) ); -- 添加数据 -- 除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号) INSERT INTO 表名 (字段名1, 字段名2, 字段名3, ...) VALUES (值1, 值2, 值3, ...); -- 字段名可以省略,要按照顺序填值 INSERT INTO 表名 VALUES (值1, 值2, 值3, ...); -- 只需要指定要插入数据的字段 没有添加数据的字段会为Null INSERT INTO 表名 (字段名1, 字段名2...) VALUES (字段值1, 字段值2);
-- 1.不带条件修改书籍 UPDATE 表名 SET 字段名=新值; -- 例子:不带条件修改数据,将所有的性别改成女 UPDATE student SET sex='女'; -- 2.带条件修改书籍 UPDATE 表名 SET 字段名=新值 WHERE 条件; -- 例子:带条件修改数据,将id号为2的学生性别改成男 UPDATE student SET sex='男' WHERE id=2; -- 例子:一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 UPDATE student SET age=26, address='北京' WHERE id=3;
DML删除表记录(删除)
-- 1.带条件删除数据 DELETE FROM 表名 WHERE 条件; -- 例子:带条件删除数据,删除id为3的记录 DELETE FROM student WHERE id=3; -- 2.不带条件删除数据 DELETE FROM 表名; -- 例子:不带条件删除数据,删除表中的所有数据 DELETE FROM student
DQL没有条件的简单查询(查询)
-- 查询student表中所有字段 SELECT 字段名1, 字段名2 FROM 表名; -- 例子: SELECT id, NAMAE, age, sex, address FROM student; SELECT * FROM student; -- *代表所有列 -- 别名查询 SELECT 字段名1 AS 别名,字段名2 AS 别名...FROM 表名 AS 表名; SELECT 字段名1 别名,字段名2 别名...FROM 表名 表名; -- AS关键字可以去掉 -- 清除重复值 SELECT DISTINCT 字段名 FROM 表名; -- 例子:查询address列并且结果不出现重复的address SELECT DISTINCT address 城市 FROM student;
查询结果参与运算
-- 1.某列数据和固定值运算 SELECT 字段名 + 值 FROM 表名: -- 2.某数据和其他列数据参与运算 SELECT 字段1 + 字段2 FROM 表名; -- 注意:参与运算的必须是数值类型 -- 例子:修改student表结构,添加数学和英语成绩列 ALTER TABLE student ADD math INT; ALTER TABLE student ADD english INT; -- 查询math列 + english列的和 SELECT math + english FROM student; -- 查询math + english的和使用别名”总成绩” SELECT math + english 总成绩 FROM student;
SELECT * FROM 表名 WHERE 条件; -- 准备数据 CREATE TABLE student3 ( id int, name varchar(20), age int, sex varchar(5), address varchar(100), math int, english int ); INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','杭州',66,78), (2,'马化腾',45,'女','深圳',98,87), (3,'马景涛',55,'男','香港',56,77), (4,'柳岩',20,'女','湖南',76,65), (5,'柳青',20,'男','湖南',86,NULL), (6,'刘德华',57,'男','香港',99,99), (7,'马德',22,'女','香港',99,99), (8,'德玛西亚',18,'男','南京',56,65);
比较运算符
`>`大于 `<`小于 `<=`小于等于 `>=`大于等于 `=`等于 `<>`、`!=`不等于 -- 1.查询math分数大于80分的学生 SELECT * FROM student3 WHERE math>80; -- 2.查询english分数小于或等于80分的学生 SELECT * FROM student3 WHERE english<=80; -- 3.查询age等于20岁的学生 SELECT * FROM student3 WHERE age=20; -- 4.查询age不等于20岁的学生 SELECT * FROM student3 WHERE age!=20; SELECT * FROM student3 WHERE age<>20;
逻辑运算符
and(&&) 多个条件同时满足 or(||)多个条件其中一个满足 not(!)不满足 -- 1.查询age大于35且性别为男的学生(两个条件同时满足) SELECT * FROM student3 WHERE age>35 AND sex='男'; -- 2.查询age大于35或性别为男的学生(两个条件其中一个满足) SELECT * FROM student3 WHERE age>35 OR sex='男'; -- 3.查询id是1或3或5的学生 SELECT * FROM student3 WHERE id=3 OR id=5;
in关键字
SELECT * FROM 表名 WHERE 字段名 in (值1, 值2, 值3); -- in`里面的每个数据都会作为一次条件,只要满足条件的就会显示 -- 1.查询id是1或3或5的学生 SELECT * FROM student3 WHERE id IN(1,3,5); -- 2.查询id不是1或3或5的学生 LELECT * FROM student3 WHERE id NOT IN(1,3,5);
范围
-- 某个范围内的数据 SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2; -- 1.查询english成绩大于等于75,且小于等于90的学生 BETWEEN:在两者之间 SELECT * FROM student3 WHERE english>75 AND english<=90; SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;
-- 通过`ORDER BY`子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序) SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [AsC/DESC] -- 1.查询所有数据,使用年龄降序排序 SELECT * FROM student ORDER BY age DESC; --降序 -- 组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推 SELECT * FROM 表名 WHERE 条件 ORDER BY 字段名 [ASC|DESC], 字段名 [ASC|DESC]; -- 1.查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序 SELECT * FROM student ORDER BY age DESC,math DESC;
-- 每张表都应该有主键,并且每张表只能有一个主键 -- 作用是唯一的区分一条记录 例如id -- 特点:主键必须包含唯一的值,主键不能包含NULL -- 主键:PRIMARY KEY -- 1.在创建表的时候给字段添加主键 CREATE TABLE 表名( 字段名1 字段类型1 PRIMARY KEY, -- 这里是字段1作为主键 字段名2 字段类型2 ); -- 例子:创建表学生表st5, 包含字段(id, name, age)将id做为主键 CREATE TABLE st5 ( id INT PRIMARY KEY, -- id是主键 NAME VARCHAR(20), age INT ); -- 2.在已有表中添加主键 ALTER TABLE 表名 ADD PRIMARY KEY(字段名); -- 例子 INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎'); INSERT INTO st5 (id, NAME) VALUES (2, '周文宾'); -- 3.删除主键 ALTER TABLE 表名 DROP PRIMARY KEY; -- 例子:删除st5表的主键 ALTER TABLE st5 DROP PRIMARY KEY;
主键自动增长
-- 字段名 字段类型 PRIMARY KEY AUTO_INCREMENT -- 例子:创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长 CREATE TABLE st6( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增 NAME VARCHAR(20), age INT ); -- 主键默认从1开始自动增长,删除后按删除前的主键+1 -- 修改自动增长的开始 ALTER TABLE st6 AUTO_INCREMENT = 10086;-- 添加1条数据删除后再次添加数据,按照删除前的值+1,也就是10087 -- DELETE和TRUNCATE的区别 -- 1.DELETE 只会删除数据,表还存在的 DELETE FROM st6; -- 2.TRUNCATE 表名;摧毁表,重新创建一张表结构一样的表 TRUNCATE st6;
CREATE TABLE 表名 ( 字段名 字段类型 UNIQUE, 字段名 字段类型 ); -- 例子:创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生 CREATE TABLE st7( id INT, NAME VARCHAR(20) UNIQUE -- 加UNIQUE );
CREATE TABLE 表名 ( 字段名 字段类型 NOT NULL, 字段名 字段类型 ); -- 例子:创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL CREATE TABLE st7( id INT, NAME VARCHAR(20) UNIQUE NOT NULL, -- 让这个值不能为空 gender CHAR(1) ); -- 一个字段可以同时添加多个约束 -- 主键唯一,非空,普通的字段我们也可以添加唯一和非空,有区别吗? -- 1.主键:一张表只能有一个,主键可以自动增长 -- 2.普通字段:可以可以字段非空唯一
DEFAULT:默认约束
CREATE TABLE 表名( 字段名1 字段类型1 DEFAULT 值,-- 默认值 添加记录给了值就不会使用默认值 字段名2 字段类型2 ); -- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州 CREATE TABLE st9 ( id INT, NAME VARCHAR(20), address VARCHAR(50) DEFAULT '广州' );
FOREIGN KEY:外键约束
一个表中的某个字段引用其他表的主键,这个字段称为外键
主表:主键所在的表
-- 新建表示增加外键约束 CREATE TABLE 表名( 字段名 字段类型, 字段名 字段类型, -- 添加外键 CONSTRAINT 外键约束 FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名) ); -- CONSTRAINT:表示约束 -- 外键约束名:给新增的外键约束取个名字 -- FOREIGN KEY:(外键字段名):指定哪个字段作为外键 -- REFERENCES:主表(主键名)指定引用哪张表的注解 -- 删除外键约束 ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名; -- 在以有表中加外键 ALTER TABLE 从表 ADD CONSTRAINT 外键约束名称 OREIGN KEY (外键字段名) REFERENCES 主表(主键字段名)

浙公网安备 33010602011771号