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理论模型:

image-20201030195439801

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  
原文地址:https://www.cnblogs.com/happysml/p/13903959.html