加载中...

MySQL操作数据库语法

操作数据库

结构化查询语句分类

名称 解释 命令
DDL(数据定义语言) 定义和管理数据对象,如数据库,数据表等 CREATE、DROP、ALTER
DML(数据定义语言) 用于操作数据库对象中所包含的数据 INSERT、UPDATE、DELETE
DQL(数据定义语言) 用于查询数据库数据 SELECT
DCL(数据定义语言) 用于管理数据库的语言,包括管理权限及数 GRANT、COMMIT、ROLLBACK

DDL

创建数据表语法

create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
#...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];

-- 说明 : 反引号用于区别MySQL保留字与普通字符而引入的 (键盘esc下面的键).

测试

-- 目标︰创建一个schoo1数据库-创建学生表(列,字段)
-- 学号int登录密码varchar(20)姓名,性别varchar(2),出生日期(datatime) ,家庭住址, emai1
-- 创建表之前,一定要先选择数据库


CREATE DATABASE IF NOT EXISTS `school`;
-- 创建一个school数据库
USE `school`;-- 创建学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`loginpwd` VARCHAR(20) DEFAULT NULL,
`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',
`phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',
`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',
`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',
`email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',
`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
UNIQUE KEY `identitycard`(`identitycard`),
KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;

-- 创建年级表
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`(
	`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
    PRIMARY KEY (`gradeid`)
) ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;

-- 创建科目表
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`(
	`subjectno`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
    `subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
    `classhour` INT(4) DEFAULT NULL COMMENT '学时',
    `gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',
    PRIMARY KEY (`subjectno`)
)ENGINE = INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;

-- 创建成绩表
DROP TABLE IF EXISTS `result`;
CREATE TABLE `result`(
	`studentno` INT(4) NOT NULL COMMENT '学号',
    `subjectno` INT(4) NOT NULL COMMENT '课程编号',
    `examdate` DATETIME NOT NULL COMMENT '考试日期',
    `studentresult` INT (4) NOT NULL COMMENT '考试成绩',
    KEY `subjectno` (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;


DML

添加数据

INSERT

语法: INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES ('值1','值2','值3')

插入数据

-- 插入科目数据
INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)VALUES
(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);

-- 插入学生数据 其余自行添加 这里只添加了2行
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'123456','张伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456198001011234'),
(1001,'123456','赵强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456199001011233');
-- 插入成绩数据  这里仅插入了一组,其余自行添加
INSERT INTO `result`(`studentno`,`subjectno`,`examdate`,`studentresult`)
VALUES
(1000,1,'2013-11-11 16:00:00',85),
(1000,2,'2013-11-12 16:00:00',70),
(1000,3,'2013-11-11 09:00:00',68),
(1000,4,'2013-11-13 16:00:00',98),
(1000,5,'2013-11-14 16:00:00',58),
(1001,5,'2013-11-14 16:00:00',58),
(1002,5,'2013-11-14 16:00:00',58),
(1005,5,'2013-11-14 16:00:00',58),
(1008,5,'2013-11-14 16:00:00',58),
(1005,5,'2013-11-14 16:00:00',58),
(1003,5,'2013-11-14 16:00:00',58),
(1002,5,'2013-11-14 16:00:00',58);

-- 插入年级数据
INSERT INTO `grade` (`gradeid`,`gradename`) VALUES(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');

删除数据

DELETE

DELETE FROM 表名 [WHERE condition];
--注意:condition为筛选条件 , 如不指定则删除该表的所有列数据
-- 删除最后一个数据
DELETE FROM grade WHERE gradeid = 5

TRUNCATE

作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;
语法:
TRUNCATE [TABLE] table_name;
-- 清空年级表
TRUNCATE grade

注意;

区别于DELETE命令

相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快

不同 :

使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器

使用TRUNCATE TABLE不会对事务有影响 (事务后面会说)

测试



-- 创建一个测试表
CREATE TABLE `test` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 插入几个测试数据
INSERT INTO test(coll) VALUES('row1'),('row2'),('row3');
-- 删除表数据(不带where条件的delete)
DELETE FROM test;
-- 结论:如不指定Where则删除该表的所有列数据,自增当前值依然从原来基础上进行,会记录日志.

 -- 删除表数据(truncate)
 TRUNCATE TABLE test;
 -- 结论:truncate删除数据,自增当前值会恢复到初始值重新开始;不会记录日志.

 -- 同样使用DELETE清空不同引擎的数据库表数据.重启数据库服务后
 -- InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失)
 -- MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失)

update命令

语法:UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE
condition];

注意:
-- column_name 为要更改的数据列
-- value 为修改后的数据 , 可以为变量 , 具体指 , 表达式或者嵌套的SELECT结果
-- condition 为筛选条件 , 如不指定则修改该表的所有列数据

测试

-- 修改年级信息
UPDATE grade SET gradename = '高中' WHERE gradeid = 1;

DQL

SELECT语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条

注意 : [ ] 括号代表可选的 , { }括号代表必选得

查询

SELECT `subjectno`,`subjectname` FROM `subject`;
SELECT `subjectno` AS 科目编号,`subjectname` AS 学科科目 FROM `subject`;
SELECT `subjectno` AS 科目编号, `subjectname` AS 学科科目, CONCAT('学科科目:',`subjectname`) AS `新的` FROM `subject`;
SELECT * FROM `result`;

SELECT `studentno`,`studentresult` FROM `result`;
-- 去重复的数据
SELECT DISTINCT `studentno` FROM `result`;
SELECT DISTINCT `studentresult` FROM `result`;
-- 表达式
SELECT 1+1 AS 计算结果;
-- 获取自动增量
SELECT @@auto_increment_increment;
-- 查看版本
SELECT VERSION();
-- 给学生成绩全部加一
SELECT `studentresult`+1 AS 新的成绩 FROM `result`;


-- 查询学号不等于1000的信息
SELECT `studentno`, `studentresult` FROM `result` WHERE `studentno`!=1000;
SELECT `studentno`, `studentresult` FROM `result` WHERE NOT `studentno`=1000;

-- 查询学号大于1000的学生信息
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentno`>1000;
-- 查询学号小于1003的学生信息
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentno`<1003;
-- 查询学号在1003到1005之间的信息  -- 这样存在一些问题,会把1005的数据输出出来
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentno`>1003 AND `studentresult`<1005;
-- 查询数据在1003和1005之间的信息(包括1003和1005)
SELECT `studentno`,`studentresult` FROM `result` WHERE `studentno` BETWEEN 1003 AND 1005;
posted @ 2022-04-23 09:20  键天帝  阅读(25)  评论(0编辑  收藏  举报