zoukankan      html  css  js  c++  java
  • 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  
    
  • 相关阅读:
    Qt学习之路,part1
    1.获取状态栏的高度
    如何在Android Studio中上传代码到Gitee上
    关于类图
    外观模式
    关于类的实例
    SharedPreference中关于editor.apply()和editor.commit()
    活动的4种启动模式
    unittest中case批量管理
    unittest使用
  • 原文地址:https://www.cnblogs.com/happysml/p/13903959.html
Copyright © 2011-2022 走看看