一、SQL语句分类
1.DDL:数据定义语句(如:create)
2.DML:数据操作语句(如:insert,update,delete)
3.DQL:数据查询语句(如:select)
4.DCL:数据控制语句(如:用户权限:grand revoke)
二、对数据库操作
1.创建数据库
#创建一个名为db3的数据库
CREATE DATABASE db3;
#删除一个名为db3的数据库
DROP DATABASE db3;
#创建一个名为db4的数据库并设置其编码格式为utf-8编码(数据库中,-省略)
CREATE DATABASE db4 CHARACTER SET utf8;
#创建一个名为db5的数据库并设置其编码格式为utf-8编码且区分大小写,使用COLLATE关键字
CREATE DATABASE db5 CHARACTER SET utf8 COLLATE utf8_bin;
2.查看、删除数据库
#查看所有数据库,使用可以看到所有数据库的名称
SHOW DATABASES;
#查看具体某一个数据库,可以看到编码格式
SHOW CREATE DATABASE db5;
#删除数据库,只有该数据库存在才能成功删除
DROP DATABASE db5;
3.备份恢复数据库
#备份数据库,使用mysqldump指令,注意:!!在DOS下执行,即使用命令控制符!!
#格式为 mysqldump -u 用户名 -p 数据库名(多个数据库用空格隔开) > 路径(e:\\sql1.sql)意味着放在e盘的sql1.sql文件中
mysqldump -u root -p db1 > e:\\base.sql
#恢复数据库
#方法一:使用source指令,指定对应sql文件,同样在命令控制符下执行(注意:进入 Mysql 命令行再执行)
source e:\\base.sql
#进入sql命令行的指令
mysql -hlocalhost -uroot -p
#方法二:直接将sql文件中的内容复制进来,执行即可
三、创建表
1.创建基础表结构,包含数据列,编码格式,编码规则以及存储引擎
#创建表data01,要求有id,uname,password,birthday四列数据
#设置表的编码格式为utf-8编码,且区分大小写,引擎使用INNODB
CREATE TABLE data01(
id INT,
uname VARCHAR(255),
`password` VARCHAR(255),
birthday DATE
)CHARACTER SET utf8,COLLATE utf8_bin,ENGINE INNODB
#删除表data01
DROP TABLE data01
#查询表data01中的所有数据
SELECT * FROM data01
2.常用数据类型
#有,无符号的整型数据(TINYINT 占一个字节)
CREATE TABLE data02(
id TINYINT,
id1 TINYINT UNSIGNED
)
#尝试给表data02添加数据
INSERT INTO data02 VALUES (128,256)
#添加的数据大于该数据类型的最大存储值,就会添加失败
INSERT INTO data02 VALUES (127,255)
3.bit的使用
#bit(m)的使用,bit(m)是位类型添加,可以指定位数,位数m范围为1~64
CREATE TABLE data03(
id bit(8)#如果为8,那么可以存储0~255的数据
)
#第三句会添加失败
INSERT INTO data03 VALUES (255)
INSERT INTO data03 VALUES (1)
INSERT INTO data03 VALUES (256)
INSERT INTO data03 VALUES (123)
#显示结果会转为二进制数
SELECT * FROM data03
4.浮点数的使用
#浮点数的使用
#FLOAT是单精度浮点数,占用四个字节,double是双精度浮点数,占用8个字节
#DECIMAL(M,N)是类似于bit(m)的浮点数,其中M表示位数,N表示小数点后位数且可以四舍五入
CREATE TABLE data04(
num01 FLOAT,
num02 DOUBLE,
num03 DECIMAL(8,4)
)
SELECT * FROM data04
INSERT INTO data04 VALUES(10,20.99999,17.56723)
INSERT INTO data04 VALUES(10,20.99999,17.56726)
5.字符串的使用
-- CHAR(size)
-- 固定长度字符串 最大 255 字符
-- VARCHAR(size) 0~65535 字节
-- 可变长度字符串 最大 65532 字节 【utf8 编码最大 21844 字符 1-3 个字节用于记录大小】
-- 如果表的编码是 utf8 varchar(size) size = (65535-3) / 3 = 21844
-- 如果表的编码是 gbk varchar(size) size = (65535-3) / 2 = 32766
#细节一:char(M)M表示字符数,而非字节数
#细节二:char()定义以后,长度不会变,无论存入什么样的字符,占用的内存已经固定
varchar()定义的是最大长度,如果存入的字符长度小于定义的,那么存储的时候会按照存入字符长度存储
#细节三:对于定长数据,如邮编,手机号,推荐使用char
其他的推荐使用varchar
因为char的查询速度更快
#细节四:在存储文本时也可以使用TEXT类型,可存储2^16字节,或者更大的MEDIUMTEXT2^24和LONGTEXT2^32
CREATE TABLE t10 (
`name` VARCHAR(32766),
`password` CHAR(255)) CHARSET gbk;
6.日期类型的使用
#日期的使用
#DATE为日期类,DATETIME为更加精确的日期与时间,TIMESTAMP为时间戳,可以自动记录insert与update的时间
#使用NOT NULL DEFAULE 意味着如果传参为null时,会默认赋一个值,该值为CURRENT_TIMESTAMP
#使用ON UPDATE CURRENT_TIMESTAMP即在每次进行uodate与insert操作时都会更新时间戳
CREATE TABLE data05(
`date` DATE,
todaytime DATETIME,
login_time TIMESTAMP -- 时间戳
NOT NULL DEFAULT CURRENT_TIMESTAMP -- 为空默认当前时间戳
ON UPDATE CURRENT_TIMESTAMP -- 每次操作数据时更新时间戳
)
SELECT * FROM data05
INSERT INTO data05 VALUES('2022-11-11','2022-11-11 10:10:10',null)
INSERT INTO data05(`date`,todaytime) VALUES ('2022-11-11','2022-11-11 10:10:10')
7.创建表的练习
#创建表的练习
CREATE TABLE data06(
id INT,
`name` VARCHAR(32),
sex CHAR(1),
birthday DATE,
entry_date DATETIME,
job VARCHAR(32),
Salary FLOAT,
resume TEXT
)
SELECT * FROM data06
8.修改表
#修改表
#添加表中的列
ALTER TABLE data06 ADD `password` VARCHAR(32)
#查看表的结构
DESC data06
#修改表中的列
ALTER TABLE data06 MODIFY `password` VARCHAR(10)
#删除表中的列
ALTER TABLE data06 DROP sex
#修改表名
RENAME TABLE data06 TO data07
#修改列名
ALTER TABLE data07 CHANGE `password` word VARCHAR(32)
DESC data07
四、INSERT语句
#创建雇员表,表中包含雇员id,姓名,生日
CREATE TABLE emp(
id INT,
ename VARCHAR(32),
birthday DATE
)CHARACTER SET utf8
#加入数据
INSERT INTO emp VALUES (1,'a','2002-3-9');
INSERT INTO emp VALUES (2,'b','2002-10-24');
INSERT INTO emp(id,ename) VALUES(3,'c');
INSERT INTO emp(id,ename) VALUES(4,'d');
SELECT * FROM emp
细节一:日期类的添加时要放入单引号之中
细节二:列可以插入null值,前提是该字段可以为空
细节三:可以使用如下语句插入多条数据
INSERT INTO `goods` (id, goods_name, price)
VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800)
细节四:可以使用默认值
即NOT NULL DEFAULT
五、update语句
#修改emp表中所有员工的id为16,不加where会默认修改所有信息
UPDATE emp SET id = 16
#修改指定的条件
UPDATE emp SET birthday = '2002-9-24' WHERE ename = 'b'
UPDATE emp SET id = id + 10 WHERE ename = 'a'
#如果修改多个字段,使用逗号隔开
UPDATE emp SET id = id + 1,ename = 'e' WHERE ename = 'a'
六、Delete语句
#delete语句,delete语句只能删除一整行,要想删除单个数据,可以使用update置空
DELETE FROM emp WHERE ename = 'a'
#删除表中所有数据
DELETE FROM emp
#删除表
DROP TABLE emp
七、Select语句
1.基本使用
#创建一个学生表来统计分数
CREATE TABLE student (
sname VARCHAR(5),
math INT,
chinese INT,
english INT
)CHARACTER SET utf8 COLLATE utf8_bin
ALTER TABLE student MODIFY english INT
SELECT * FROM student
DESC student
INSERT INTO student VALUES('小红',79,80,50);
INSERT INTO student VALUES('小蓝',95,100,95);
INSERT INTO student VALUES('小罗',45,34,63);
INSERT INTO student VALUES('小胡',91,70,90);
INSERT INTO student VALUES('小伶',97,89,99);
#查询学生的总分
SELECT sname,(math + chinese + english) FROM student
#使用AS关键字修改别名
SELECT sname AS '姓名',(math + chinese + english) AS '总分' FROM student
#进行修改统计
SELECT sname,math+100 AS '数学' FROM student
2.where的运算符
#查询总分在200到300之间的学生
SELECT * FROM student WHERE (math + chinese + english) BETWEEN 200 AND 300
#按判断符查询
SELECT * FROM student WHERE math > 90
#in()显示在In中的值,即会找到math = 79,math = 100的行
SELECT * FROM student WHERE math in(79,100)
#模糊查询,使用LIKE关键字
SELECT * FROM student WHERE sname LIKE '小%'
SELECT * FROM student WHERE sname NOT LIKE '%罗'
#IS NULL 判断是否为空
SELECT * FROM student WHERE sname IS NULL
#and,or,not类似于与或非
3.查询练习
SELECT * FROM student WHERE english BETWEEN 80 AND 90
SELECT * FROM student WHERE math in(89,90,91)
SELECT * FROM student WHERE sname LIKE '李%'
SELECT * FROM student WHERE math > 80 AND chinese > 80
SELECT * FROM student WHERE chinese BETWEEN 70 AND 80
SELECT * FROM student WHERE (math + chinese + english) in(189,190,191)
SELECT * FROM student WHERE sname LIKE '宋%' OR '李%'
SELECT * FROM student WHERE math - chinese = 30
4.order by子句排序
#使用order by关键字对查询语句进行排序,默认为asc,即升序,也可以在order by最后使用desc,即为降序
SELECT * FROM student ORDER BY math
SELECT * FROM student ORDER BY (math + chinese + english) DESC
select * from student where sname like '小%' order by (math + chinese + english)