修改表名:
ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
向表中添加字段:
ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(3)
修改表的字段(修改约束):
ALTER TABLE 表名 MODIFY 字段名 新列属性
ALTER TABLE teacher1 MODIFY age VARCHAR(3)
修改表的字段(重命名):
ALTER TABLE 表名 CHANGE 旧字段名 新字段名[新字段属性]
ALTER TABLE teacher1 CHANGE age sex VARCHAR(1)
删除表的字段:
ALTER TABLE 表名 DROP 字段名
ALTER TABLE teacher1 DROP sex
删除数据表:
DROP TABLE 表名
DROP TABLE IF EXISTS teacher1
注意:
先创建一张grade数据表:
CREATE TABLE IF NOT EXISTS`grade`( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id', `gradename` VARCHAR(10) NOT NULL COMMENT '年级名称', PRIMARY KEY(`gradeid`) )ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生表的gradeid字段 要去引用年级表的gradeid -- 定义外键key -- 给这个外键添加约束(执行引用) reference 引用 CREATE TABLE IF NOT EXISTS `student` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '学号', `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', `pwd` VARCHAR(20) NOT NULL DEFAULT '12345' COMMENT '密码', `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别', `birthday` DATETIME DEFAULT NULL COMMENT '出生日期', `gradeid` INT(10) NOT NULL COMMENT '学生年级', `address` VARCHAR(190) DEFAULT NULL COMMENT '家庭住址', `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`), KEY `FK_gradeid` (gradeid), CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8
删除有外键关系的表时,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的字段) REFERENCE 外键引用表名(表内的哪个字段)
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade` (`gradeid`);
以上创建的外键都是物理外键,数据库级别的外键,不建议使用,避免数据库过多造成困扰
建议:
数据库操作语言
INSERT INTO 表名 ([字段名1],[字段名2],[字段名3]) VALUES ([值1],[值2],[值3],...)
INSERT INTO `grade` (`gradename`) VALUES ('大一') --由于主键自增可以省略主键,但是不写表的字段就会一一匹配出错
INSERT INTO `grade` (`gradename`) VALUES ('大二'),('大三'),('大四')
一般写插入语句要保证一定要数据和字段一一对应
INSERT INTO `student` (`name`,`pwd`,`sex`) VALUES ('原语','abcdef','男')
INSERT INTO `student` (`name`,`pwd`,`sex`) VALUES ('原语2','abcdef','男'),('原语3','abcdef','男'),('原语4','abcdef','男')
双击左侧列表数据表栏位中的字段名可以直接填入括号
UPDATE `表名` SET column = value [,column = value,...] WHERE 条件
UPDATE `student` SET `name`='上弦' WHERE `id`=1
UPDATE `student` SET `birthday`=CURRENT_TIME WHERE `id`=1
where必须在set后面否则报错
如果没加where条件则该列字段对应的所有值会全部更改 :
UPDATE `student` SET `name`='小明'
条件:
操作符会返回布尔值
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 1=1 | true |
<> / != | 不等于 | 1<>1 | false |
< | |||
> | |||
<= | |||
>= | |||
BETWEEN ...AND... | 在某个范围内 | [2,5]闭区间 | |
AND | && | 1>2&&6>5 | false |
OR | || | 1>2||6>5 | true |
DELETE FROM `表名` WHERE 条件
DELETE FROM `student` WHERE `id`=1
若不加where条件则表示删除整张表(不建议使用)
TRUNCATE 清空数据库表(表的结构和索引约束都不会变):
TRUNCATE `student`
detete 与 truncate 区别:
delete的删除问题:(当重启数据库时)
数据库查询语言:
数据库中的表达式:
SELECT 表达式 FROM 表
SELECT * FROM `student`
SELECT `StudentNo`,`LoginPwd` FROM `student`
查询结果并别名:
SELECT 字段 AS 别名 FROM `表名` AS 别名
SELECT `StudentNo` AS 学号,`LoginPwd` AS 密码 FROM `student`
查询结果并用函数
CONCAT(A,B)连接函数
SELECT CONCAT('姓名:',`StudentName`) AS 新名字 FROM `student`
去重(distinct)
去除select语句中查询出来的重复数据,重复的数据只显示一条
SELECT DISTINCT `StudentNo` FROM `result`
select其他作用:
select用于查询版本号:(函数)
SELECT VERSION()
select用于计算: (表达式)
SELECT 3*100-1 AS 计算结果
select用于查询自增步长: (变量)
SELECT @@auto_increment_increment
select可以让查询结果值改变(对表中原数据不造成影响):
SELECT `StudentNo`,`StudentResult`+1 AS 新成绩 FROM`result`
作用:检索中数据中符合条件的值
搜索条件由一个或者多个表达式组成,结果返回布尔值
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与,两个为真,结果才为真 |
or || | a or b a||b | 逻辑或,一个为真,则结果为真 |
not ! | not a !a | 逻辑非,真为假,假为真 |
尽量使用英文字母表示
SELECT `StudentNo`,`StudentResult` FROM`result` WHERE `StudentResult`>=95 AND `StudentResult`<=100 -- 即 SELECT `StudentNo`,`StudentResult` FROM `result` WHERE `StudentResult` BETWEEN 95 AND 100
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 若操作数为null则为真 |
IS NOT NULL | a is not null | 若操作数不为null则为真 |
BETWEEN | a between b and c | 若a在[b,c]中则为真 |
LIKE | a like b | SQL匹配,若a匹配b则为真 |
IN | a in (a1,a2,a3...) | 若a是a1或a2...中某个值则为真 |
like与%(其后有0至任意字符)_(其后只有一个字符)
SELECT `StudentNo`,`StudentName` FROM `student`WHERE `StudentName` LIKE 'M%' SELECT `StudentNo`,`StudentName` FROM `student`WHERE `StudentName` LIKE '%T%'
in其后是具体的一个或多个值 ,不能用% _
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (1,2,3)
三种查询(本质):
七种连接查询:
SELECT student.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult` FROM `student` INNER JOIN`result` WHERE student.`StudentNo`=result.`StudentNo` SELECT student.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult` FROM `student` LEFT JOIN`result` WHERE student.`StudentNo`=result.`StudentNo` SELECT student.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult` FROM `student` RIGHT JOIN`result` WHERE student.`StudentNo`=result.`StudentNo`
开始select的StudentNo没有添加表名,造成字段模糊错误
操作 | 描述 |
---|---|
inner join | 若有一个匹配,则返回行 |
left join | 即使右表中没有匹配,也会返回左表的所有值 |
righ tjoin | 即使左表中没有匹配,也会返回右表的所有值 |
join(连接的表) on(判断的条件) 连接查询
where 等值查询
-- 查询参加了考试的同学的学号、姓名、科目名、分数 SELECT student.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` FROM `student` RIGHT JOIN`result` ON student.`StudentNo`=result.`StudentNo` INNER JOIN `subject` ON result.`SubjectNo`=subject.`SubjectNo`
思路:
自连接:自己的表和自己的表连接,即:一张表拆成两张一样的表即可
CREATE TABLE `category`( `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT'主题id', `pid` INT(10) NOT NULL COMMENT'父id', `categoryName` VARCHAR(50) NOT NULL COMMENT'主题名字', PRIMARY KEY(`categoryid`) )ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 INSERT INTO `category` VALUES (2,1,'信息技术'),(3,1,'软件开发'),(4,3,'数据库'),(5,1,'美术设计'),(6,3,'web开发'),(7,5,'PS技术'),(8,2,'办公信息')
父类:
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
4 | 数据库 |
... | ... |
子类:
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | PS设计 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | PS技术 |
SELECT a.`categoryName` AS 父栏目 , b.`categoryName` AS 子栏目 FROM `category` AS a,`category` AS b WHERE a.`categoryid`=b.`pid`