数据库基础 ---- Mysql基础语法
MySQL基础语法的理解概述:
- MySQL是关系型数据库,此类数据库通用的操作语言是SQL结构化查询语言(Structured Query Language),但是具体到不同的数据库,SQL语句又各自有些区别,比如SQL语句单行注释用'--空格',MySQL在此基础上另有‘#’。
- SQL语句的结构:
DDL数据定义语言(Data Definition Language)如:建库,建表
DML数据操纵语言(Data Manipulation Language)如:对表中的记录进行增删改
DQL数据查询语言(Data Query Language)如:对表中的查询操作
DCL数据控制语言(Data Control Language)如:设置用户的权限
MySQL基础语法的使用概述:
- 在dos中登入MySQL后,tab键可以自动补全关键字
- 对表进行操作前需要先确定使用的数据库,对数据进行操作前需要确定表
- 删除整张表的三种命令对比:
1.DROP TABLE 表名:删除整张表的内容和定义,释放空间,所以要新增记录必须要另新建表;
TRUNCATE TABLE 表名:删除整张表的内容,但不删除定义,释放空间即将表和表的索引都设置成初始大小,所以可以直接新增记录,若自增长主键则是重新开始计数
DELETE FROM TABLE 表名:删除整张表的内容,但不删定义,不释放空间,所以可以直接新增记录,若自增长主键则是接着已经删掉的内容开始计数2.就删除数据的速度来说,一般情况下DROP>TRUNCATE>DELETE
3. TRUNCATE TABLE 与不带WHERE条件的DELETE相同,都是删除表中全部行,但TRUNCATE比DELETE速度快,而且使用系统和日志资源少
4.DELETE每删除一行数据,就在事物日志中记录,所以用ROLL BACK命令将DELETE撤销,TRUNCATE则不能
MySQL基础语法的测试代码:
DDL语法的测试代码:
/*DDL操作数据库:
1.分别创建两个指定字符集和未指定字符集的数据库
2.查看所有的数据库
3.查看指定了字符集的数据库的定义信息
4.修改数据库的字符集
5.删除数据库
6.选择使用数据库
7.查看正在使用的数据库
*/
#1.
CREATE DATABASE IF NOT EXISTS db1; -- 不存在就创建,存在就不创建
#CREATE DATABASE db1;
#
CREATE DATABASE db2 DEFAULT CHARACTER SET gbk;--gbk为一种字符集合,可能会汉语乱码
#2.
SHOW DATABASES;
#SHOW DATABASE;错于查看的是所有表,关键词是复数
#3.
SHOW CREATE DATABASE db2;
#4.
ALTER DATABASE db2 DEFAULT CHARACTER SET UTF-8; -- utf-8汉语正常显示
#5.
DROP DATABASE db1;
#6.
USE db2;
#SELECT DATABASE db2;错于误解SELECT关键词的字面意思
#7.
#使用一个MySQL的全局函数实现
SELECT DATABASE();
#SELECT DATABASES();错于当前使用的数据库只有一个,关键词是单数
/*DDL操作表结构:(接上:使用的是test02数据库)
1.创建一张有不同属性类型的表
2.查看数据库中所有表
3.查看表的结构
4.查看创建表的SQL语句
5.再创建一个表结构相同的新表
6.删除旧表
7.修改表的结构:
修改表的名称
修改表的字符集
为表添加列
修改表中某列的类型
同时修改表中某列的名称,类型
删除表中的某列
*/
USE db2;
#1.
CREATE TABLE table1{
attributeInt INT(3), --整数型属性
#attributeInt INT;错于使用";"提前结束了命令
#INT attributeInt, 错于数据类型应该写在数据名称之后
#
attributeDouble DOUBLE, --浮点型属性
attributeVarchar VARCHAR(25), --字符型属性
attributeData DATA --日期型属性
#attributeData DATA,错于最后一个属性不用逗号
}DEFAULT CHARSET=gkd;
#2.
SHOW TABLES;
#SHOW TABLE;错于展示所有的表,关键词需要用复数形式
#3.
DESC table1;
#4.
SHOW CREATE TABLE table1;
#5.
CREATE TABLE table1.0 LIKE table1;
#6.
DROP TABLE IF EXISTS table1; -- 存在就删除,不存在也不会报错
#DROP TABLE table1;
#7.
RENAME TABLE table1.0 to table2;
ALTER TABLE table2 character set utf-8;
ALTER TABLE table2 ADD attributeBlob BLOB; --二进制文件型属性
ALTER TABLE table2 MODIFY attributeBlob LONGBLOB; --加长二进制文件
ALTER TABLE table2 CHANGE attributeBlob attributeLongblob LONGBLOB;
ALTER TABLE table2 DROP attributeLongblob ;
DML语法的测试代码:
/*DML操作表中的数据(接上,表是table2)
1.在表中分别做全部属性插入记录和部分属性插入记录
2.创建新表,将table2表中的数据复制到一张新表table3中
3.分别修改某列中所有的属性值,一列中某行的属性值
4.分别删除旧表的某行数据,删除整张旧表
*/
#1.
INSERT INTO table2 (attitudeInt,attitudeDouble,attitudeVarchar,attitudeData) VALUES(1,1.0,'AAA','2077-12-01');
#INSERT INTO table2 VALUES (1,1.0,'AAA','2077-12-01');
#INSERT INTO table2 VALUES (1000000000,1.0,'AAA','2077-12-01'); 32位int上限是2147483547,错于数据带下超出范围
#INSERT INTO table2 VALUES (1,1.0,'AAA','2077.12.01');错于插入的数据与字段的数据类型不一致
#INSERT INTO table2 VALUES (1.0,1,'AAA','2077-12-01');错于插入的数据顺序与定义表时的属性顺序不一致
#
INSERT INTO table2 (attitudeInt,attitudeDouble,attitudeVarchar) VALUES (2,2.0,'BBB');
#INSERT INTO table2 VALUES (2,2.0,'BBB',null);
#
INSERT INTO table2 VALUES (3,3.0,'CCC','2070-12-01');
INSERT INTO table2 VALUES (4,4.0,'EEE','1970-02-01');
#2.
CREAT TABLE table3 like table2;
INSERT INTO table3 SELECT * FROM table2;
#INSERT INTO table3(attitudeInt,attitudeDouble,attitudeVarchar,attitudeData) SELECT attitudeInt,attitudeDouble,attitudeVarchar,attitudeData FORM table2;
#3.
UPDATE table3 SET attitudeInt = 1;
UPDATE table3 SET attitudeVarchar = 'DDD' where attitudeVarchar = 'EEE';
#4.
DELETE FROM table3 attitudeVarchar = 'DDD';
DELETE FROM table2;
#TRUNCATE TABLE table2; --truncate删除了表结构后,会在创建一张表
DQL语法的测试代码:
/*DQL查询表中的数据(接上,查询的表是table3)
*1.查询所有一张表的所有属性
*2.查询指定列的值
*3.查询指定列并且不出现重复值
*4.查询结果参与运算
*5.查询指定列中符合条件的行
*6.将查询结果排序显示
*7.用聚合函数查询列值
*8.将查询结果进行分组,相同数据做一组
*9.跳跃性的显示查询结果的条数
*/
#1.
SELECT * FROM table3;
#SELECT * FROM table3 AS table3.0; -- 查询结果表的名称按照别名显示,不改变表的定义名称
#SELECT * FROM table3 table3.0; -- 指定别名时,AS可以省略掉
#2.
SELECT attributeInt,attributeDouble FROM table3;
#SELECT attributeInt AS id, attributeDouble AS points FROM table3 AS table3.0;
#3.
SELECT DISTINCT attributeData FROM table3;
#4.
SELECT attributeDouble+5 FROM table3;
#5.
SELECT attributeInt FROM table3 WHERE attributeVarchar = 'AAA'; -- 以字符匹配作为条件
#SELECT attributeInt FROM table3 WHERE attributeVarchar LIKE 'A%'; --"%"通配符可以表示多个字符
#SELECT attributeInt FROM table3 WHERE attributeVarchar LIKE 'A-A'; --“-”通配符只能表示一个字符
#
SELECT attributeVarchar FROM table3 WHERE attributeInt = 1; -- 以数值相等作为条件
#SELECT attributeVarchar FROM table3 WHERE attributeInt == 1; -- 错于mySQL中没有“==”
#
#SELECT attributeVarchar FROM table3 WHERE attributeInt !=1; -- 以数值不匹配作为条件
#SELECT attributeVarchar FROM table3 WHERE attributeInt <>1;
#SELECT attributeVarchar FROM table3 WHERE attributeInt NOT 1;
#
SELECT attributeVarchar FROM table3 WHERE attributeDouble<=5.0 AND attributeDouble>=1.0; --以数值范围作为条件
#SELECT attributeVarchar FROM table3 WHERE attributeDouble BETWEEN 1.0 AND 5.0;
#SELECT attributeVarchar FROM table3 WHERE attributeDouble IN (1.0,2.0,3.0,4.0,5.0);
#
SELECT attributeVarchar FROM table3 WHERE attributeDate IS NULL; -- 查空
#SELECT attributeVarchar FROM table3 WHERE attributeDate = NULL;错于控制没有值,而不是具体的值
#
SELECT attributeVarchar FROM table3 WHERE attributeDate = '2000-10-01' OR attributeDouble>=50.0; -- 以多条件逻辑组合作为条件
#6.组合排序是在前者条件相同的情况下,以后者条件作为排序依据
SELECT * FROM table3 ORDER BY id DESC, attributeDouble ASC; --DESC是降序。ASC升序
#7.聚合函数查询不同于一行行判断,而是对一列值进行计算再返回一个结果值
SELECT MAX(attributeInt) FROM table3; --查询列的最大值
SELECT MIN(attributeDouble) FROM table3; --查询列的最小值
SELECT AVG(attributeDouble) FROM table3; --查询列的平均值
SELECT COUNT(attributeDate) FROM table3; --查询一列的记录总数,NULL不计入
#SELECT COUNT(IFNULL(attributeDate,0) FROM table3); --将attributeDate中的NULL用0代替
#
SELECT SUM(attributeDouble) FROM table3; --查询一列的总和
#8.
#GROUP BY将分组字段结果中相同内容作为一组,并返回每组的第一条数据,所以单独分组没实际作用,分组的目的就是为了统计,一般有GROUP BY分组就有SELECT 聚合函数
#WHERE先过滤,GROUP BY再分组,最后聚合函数统计并返回查询结果
SELECT COUNT(*) FROM table3 WHERE attributeDate BETWEEN '2000-01-01' AND '2030-01-01' GROUP BY attributeDouble
#SELECT COUNT(*) FROM table3 WHERE COUNT(*)>2 GROUP BY attributeDouble;错于WHERE后不能用聚合函数做条件
#
#HAVING在分组之后过滤不符合条件的记录,所以能使用聚合函数
SELECT COUNT(*) FROM table3 WHERE attributeDate BETWEEN '2000-01-01' AND '2030-01-01' HAVING COUNT(*) > 2;
#9.LIMIT "起始行数,从0开始计数","返回的行数"
SELECT * FROM table3 LIMIT 0,5; -- 从第1条开始显示,显示5条
#SELECT * FROM table3 LIMIT 5; -- 第一个参数是0则可以省略
#SELECT * FROM table3 LIMIT 10000; --记录不够就有多少显示多少