Mysql操作数据表
Mysql操作数据表
一、创建表
语法
CREATE TABLE table_name (column_name column_type);
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
CREATE TABLE `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
二、外键
方式一、在创建表的时候,增加约束
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生表的gradeid字段引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用) references引用
CREATE TABLE `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`password` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`gradeid` INT(10) NOT 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(作为外键的列) REFERENCES 那个表(哪个字段)
ALTER TABLE `student`
ADD CONSISTENT `FK_gradeid`
FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
以上的操作都是物理外键,数据库级别的外键,不建议使用,彼岸数据库过多造成困扰。
推荐的实现方法:
- 数据库就是单纯的表,只用来存数据,只有行和列
- 如果想使用多张表的数据,想使用外键,则用程序去实现
三、修改和删除表字段
3.1 修改(ALTER)
-- 修改表名 ALTER TABLE 旧表名 rename as 新表名
ALTER TABLE teacher RENAME AS teacher1
-- 增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
-- 修改表的字段(重命名,修改约束)
ALTER TABLE teacher1 MODIFY age VARCHAR(11) -- 修改约束
ALTER TABLE teacher1 CHANGE age age1 INT(1) -- 字段重命名
-- 删除表的字段
ALTER TABLE teacher1 DROP age1
注意
- colnum_name是数据库的列,尽量带上``
- 筛选条件没有指定会i需改所有列
- value可以是值或变量
3.2 删除(Drop)
-- 删除表
DROP TABLE IF EXISTS teacher1
所有的创建和删除操作尽量加上判断,以免报错
四、DML语言
数据库的意义:数据存储,数据管理
DML语言:数据操作语言
-
insert
-
update
-
delete
2.1 添加(insert)
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
-- 插入多个数据(),()
INSERT INTO `grade`(`gradename`) VALUES('大一'), ('大二')
INSERT INTO `student`(`name`, `password`, `gradeid`) VALUES('张三', '123456', 3)
注意:
- 由于主键自增,可以省略
- 如果不写表的字段,会一一匹配
- 一般写插入语句,一定要数据和字段一一对应
2.2、修改(update)
update 表名(条件) set column = value;
UPDATE `student` SET `name`='小明' WHERE id = 1;
- 如果没有定义筛选条件,则会修改所有行
- value,是一个具体的值,也可以是一个变量
2.3 删除(delete/truncate)
delete from 表名 where条件
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`
--删除指定数据
DELETE FROM `student` where id = 1;
TRUNCATE
作用:完全清空一个数据库表,表的结构和索引约束不会变!
-- 清空表
TRUNCATE `student`
delete和truncate区别
- 相同点:都能删除数据
- 不同点:
- truncate重新设置自增列,计数器会归零
- truncate不会影响事务
- delete删除,重启数据库时,如果采用的是InnoDB引擎,自增列会从1开始(存在内存当中的,断电即失),如果采用的时MyISAM引擎,会继续从上一个自增量开始(存在文件中的,不会丢失)
五、DQL查询数据
5.1 DQL
- Data Query Language(DQL):数据查询语言
- 所有的查询操作都用它 采用Select关键字
- 数据库种最核心的语言
- 使用频率最高的语句
5.2 指定查询字段
SELECT 字段.... FROM 表
-- 查询全部得学生
SELECT * FROM student
-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student
-- 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名
SELECT `StudentNo` AS 学号, `StudentName` AS 学生姓名 FROM student s
SELECT CONCAT('姓名:', StudentName) AS 新名字 FROM student
5.3 去重
distinct
作用:去除SELECT查询出来得结果中重复得数据,重复的数据只显示一条
SELECT DISTINCT `StudentNo` FROM result
5.4 数据库的列(表达式)
SELECT VERSION() -- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)
-- 学员考试成绩 + 1 分查看
SELECT `StudentNo`, `StudentResult` + 1 AS '提分后' FROM result
数据库中的表达式:文本值,列,NULL,函数,计算表达式,系统变量
5.5 where条件子句
作用:检索数据中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a && b | 逻辑与,都为真,结果为真 |
or || | a or b a || b | 逻辑或,一个为真,结果为真 |
Not ! | not a ! a | 逻辑非,取反 |
SELECT `StudentNo`, `StudentResult` FROM result
-- 查询考试成绩在95-100分之间
SELECT `StudentNo`, `StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
-- 模糊查询(区间)
SELECT `StudentNo`, `StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT `StudentNo`, `StudentResult` FROM result
WHERE StudentNo != 1001
5.6 模糊查询
比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | A IS NULL | 如果操作符为NULL,结果为真 |
IS NOT NULL | A IS NOT NULL | 如果操作符不为NULL,记过为真 |
BETWEEN... AND | 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 '刘%'
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '张_'
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '张__'
SELECT `StudentNo`,`StudentName` FROM student
WHERE StudentName LIKE '%张%'
-- ======== in(具体的一个或多个值)============
-- 查询1001,1002,1003号学员
SELECT `StudentNo`, `StudentName` FROM student
WHERE StudentNo IN (1001, 1002, 1003)
-- 查询在某地的学生
SELECT `StudentNo`, `StudentName` FROM student
WHERE `Address` IN ('安徽', '河南洛阳')
-- ====== null not null=========
-- 查询地址为空得学生 null ''
SELECT `StudentNo`, `StudentName` FROM student
WHERE `Address` = '' OR address IS NULL
-- 查询有出生日期的同学 不为空
SELECT `StudentNo`, `StudentName` FROM student
WHERE `BornDate` IS NOT NULL
5.7 联表查询
当要查询的信息在两个表中时,就需要进行联表查询
思路:
-
分析需求,分析查询的字段来自哪些表 (连接查询)
-
确定使用哪种连接查询
-
确定交叉点(这两个表中哪个数据是相同的)
-
-- join(连接的表)on(条件判断) 连接查询
-- where 等值查询
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 以左表为基准,会从左表中返回所有的值,即使右表中没有匹配 |
right join | 以右表为基准,会从右表中返回所有的值,即使左表中没有匹配 |
七种join理论模型:
SELECT s.studentNo, studentName,SubjectNo, StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.studentNo = r.studentNo
SELECT s.studentNo, studentName,SubjectNo, StudentResult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentNo = r.studentNo
SELECT s.studentNo, studentName,SubjectNo, StudentResult
FROM student AS s
LEFT JOIN result AS r
ON s.studentNo = r.studentNo