DW集训营数据库Mysql梳理(三)

  1. MySQL表数据类型
    数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型
    整型:
    无符号用UNSIGNED表示;
    浮点型:

    1. FLOAT是单精度浮点型

    2. DOUBLE是双精度浮点型

    3. [(M,D)],M一定大于等于D

    4. 比如FLOAT(7,2)代表小数点前面的数值有5位,小数点后面的数字有2位,一共加起来有7位,最大能表示99999.99

    日期时间类型:

    1. YEAR范围:1970 到2069

    2. TIME范围:-838:59:59 到 838:59:59

    3. DATE范围:1000-01-01 到 9999-12-31

    4. DATETIME范围:1000-01-01 00:00:00 到 9999-12-31 23:59:59

    5. TIMESTAMP范围:1970-01-01 00:00:00 到 2037-12-31 23:59:59

    字符型:

    1. CHAR(M):这是定长类型,比如CHAR(5),值为ABC,但是存储的时候,会在ABC后面补齐两个空格补齐5位

    2. VARCHAR(M):这是变长类型,比如比如VARCHAR(5),值为ABC,存储的时候就只存ABC

    3. L+ x 个字节:是指最佳的存储范围

    4. ENUM:枚举值,给出选项供选择

    5. SET:集合,比如SET(‘A’,‘B’,‘C’),可以只选择A,也可以只选择B,也可以只选择BC,等于可以在这个集合中选择任意的排列组合

  2. 用SQL语句创建表
    语句解释
    数据表又称表,是数据库最重要的组成部分之一,是其他对象的基础,行称之为记录,列称之为字段。
    如果是在命令行界面:
    首先通过USE命令打开数据库,USE 数据库名;
    接着检查打开的数据库是否正确,SELECT DATABASE();
    最后创建数据库的表结构:CREATE TABLE [IF NOT EXISTS] table_name ( column_name data_type,……)

    设定列类型 、大小、约束
    约束的情况主要有:非空约束,主键约束,唯一约束,默认约束。

     **非空约束:**
     NULL,字段值可以为空;NOT NULL,字段值禁止为空
     
     CREATE TABLE tb2(
     username VARCHAR(20) NOT NULL,
     age TINYINT UNSIGNED NULL
     );
     
     **主键约束:**
     1. 每张数据表只能存在一个主键
     2. 联合主键和复合主键
     	当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引。
      	联合主键是指:主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。
      	其中的区别是:复合主键就是含有一个以上的字段组成,如ID+name,ID+phone等,而联合主键要同时是两个表的主题组合起来的。
     3. 主键保证记录的唯一性
     4. 主键自动为NOT NULL
     5. AUTO_INCREMENT必须和主键一起使用,但是主键不一定必须和AUTO_INCREMENT使用;
     	自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次的增量为1,依次递增。所以该字段数据类型一定是数值型:整数,浮点数都可以,浮点数小数位数必须为0。
     
     CREATE TABLE tb3(
     id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     username VARCHAR(30) NOT NULL
     );
     
     **唯一约束:**
     
     因为主键一张表只有一个,如果想保证唯一性,可以使用UNIQUE KEY(唯一约束);
    
     1. 唯一约束可以保证记录的唯一性
     2. 唯一约束的字段可以为空值(NULL)(这里比较难以理解:因为既然可以为空值,那么2条或者2条以上的记录如果都为空值,都为空值就是相同的,岂不是违背了唯一性?其实这里存储的时候,多个空值只会保存一个空值,所以并不违背唯一性)
     3. 每张数据表可以存在多个唯一约束
     
     CREATE TABLE tb5(
     id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     username VARCHAR(30) NOT NULL UNIQUE KEY,
     age TINYINT UNSIGNED
     );
     
     **默认约束:**
     当插入记录时,如果没有明确为字段赋值,则自动赋予默认值 ,关键词为 DEFAULE;
     
     CREATE TABLE tb61(
     id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
     username VARCHAR(20) NOT NULL UNIQUE KEY,
     sex ENUM('1','2','3') DEFAULT '3'
     );
    
  3. 用SQL语句向表中添加数据
    三种种插入记录的方法:(insert,insert set,insert select)
    INSERT:
    INSERT 表名 VALUES(NULL,‘Tom’,‘123’,25,1);
    此方法可以插入多条数据;
    INSERT SET:
    INSERT 表名 SET username=‘BEn’, password=‘456’;
    与指定列名插入方法区别在于:此方法可以使用子查询,且一次只允许插入一个记录,我们用此方法插入一条记录:
    INSERT SELECT:
    INSERT SELECT可以将查询的结果写入数据表

     INSERT tdb_goods_cates(cate_name) 
     SELECT goods_cate FROM tdb_goods 
     GROUP BY goods_cate;
    
  4. 用SQL语句删除
    删除分为删除数据库,删除数据表,删除字段,删除字段约束;

    # 1. 删除数据库:
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
    DROP  DATABASE test2;
    
    # 2. 删除数据表
    # 删除表的方法有两种,使用delete和使用truncate ,其都可以将表数据清空,但是表结构仍然存在;
    delete from 表名
    truncate table 表名
    
    # 3. 删除字段
    DELETE FROM tbl_name [WHERE where_condition]
    #删除users表中id为6的一条记录;
    DELETE FROM users WHERE id = 6;
    
    # 4. 删除字段约束
    # 删除tbl_name的主键约束
    ALTER TABLE tbl_name DROP PRIMARY KEY
    # 删除tbl_name的唯一约束
    # 首先要查看表中唯一约束的名字,再根据名字来删除索引
    SHOW INDEXES FROM users2
    ALTER TABLE users2 DROP INDEX username;
    #删除外键约束:首先查看表中外键约束的名字,再对外键约束进行删除,进而再删除其索引
    show create table users2\G
    alter table users2 drop foreign key 外键名
    show indexes from users2 
    ALTER TABLE users2 DROP INDEX 索引名;
    

    总结:
    问:为什么删除唯一约束,却需要唯一索引的名字呢?而且为什么Column_name :字段/列名称 和Key_name:索引名称相同呢?
    答:创建主键约束、唯一约束的时候,会自动创建一个唯一的索引。主键默认生成的索引名字是PRIMARY,而唯一约束生成的是同名的索引,所以唯一约束中的key_name(索引名称)和column_name(列名)是同一个名字。

    问:删除唯一约束为什么是DROP INDEX ,index 不是索引么?
    答:如果说我们要删除一个unique key ,但是这个unique key在一张表中有很多个,这时候我们单纯的写drop unique key系统不知道的要删除的是哪一个,会全部删除,这不是我们想要的结果,好在的是每一个约束都存在一个名字,你可以吧把ndex理解成约束的名字,这样我们就可以指定删除某个约束了; 查看INDEX : SHOW INDEXES FROM table name;

    问:DELETE,DROP,TRUNCATE删除有什么区别?
    答:

    1. truncate 和 delete 只删除数据不删除表的结构(定义),drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index),依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
    2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效,不会自动提交;如果有相应的 trigger,执行的时候将被触发。truncate、drop 是数据库定义语言(ddl),执行后会自动提交,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。速度方面truncate > delete;
    3. 保留表结构而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
    4. TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,用DELETE。如果要删除表定义及其数据,用DROP TABLE 语句。
    5. TRUNCATE TABLE 不能用于参与了索引视图的表;
  5. 用SQL语句修改表
    修改列名
    修改列名称的语法结构是:

    ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name
    new_col_name column_definition  [FIRST| AFTER col_name]
    # 修改列名
    ALTER TABLE users2 CHANGE pid p_id
    

    修改表中数据
    更新记录(单表更新)的语法结构:

    UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET
    col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}]...
    [WHERE where_condition]
    #更改某字段值
    UPDATE users set age=age+5
    

    删除行
    删除记录(单标删除)的语法结构是:

    DELETE FROM tbl_name [WHERE where_condition]
    # 删除id为6的用户记录
    DELETE FROM users WHERE id = 6;
    

    删除列
    删除列的语法结构:

    ALTER TABLE tbl_name DROP [COLUMN] col_name
    # 删除truename字段
    ALTER TABLE users1 DROP truename;
    

    新建列
    添加单列的语法结构:

    ALTER TABLE tbl_name ADD [COLUMN] col_name
    column_definition [FIRST | AFTER col_name ]
    # first指的是添加到某列前面,默认则是添加到最后
    ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;
    

    新建行
    插入记录的语法结构:

    INSERT [INTO] tbl_name [(col_name,...)] {VALUES| VALUE}
    ({expr | DEFAULT},...),(...),...
    # 插入行
    INSERT users VALUES(NULL,'Tom','123',25,1);
    

项目三:超过5名学生的课(难度:简单)
创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。
例如,表:
±--------±-----------+
| student | class |
±--------±-----------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
| A | Math |
±--------±-----------+

编写一个 SQL 查询,列出所有超过或等于5名学生的课。
应该输出:
±--------+
| class |
±--------+
| Math |
±--------+
Note:
学生在每个课中不应被重复计算。

首先根据表结构创建数据表:

USE test;

CREATE TABLE  IF NOT EXISTS `courses` (
  `student` varchar(10) NOT NULL,
  `class` varchar(20) NOT NULL
);

接着为表insert字段:

NSERT into  courses 
VALUES('A','Math'),
			('B','English'),
			('C','Math'),
			('D','Biology'),
			('E','Math'),
			('F','Computer'),
			('G','Math'),
			('H','Math'),
			('I','Math'),
			('A','Math'); 

此处注意这道题挖了个小坑,应该用distinct将重复记录排除后再进行筛选:

SELECT * FROM courses as c
GROUP BY c.class
HAVING COUNT(DISTINCT c.student)>=5; 

这里其实有一个很有意思的小问题:如果是要删除重复的字段呢?我们平时的删除都是根据主键对应删除,那么如何在sql没有主键的情况下删除表中重复的字段?
第一种方法是,查询不重复的数据存储在新建立的表中,删除掉原表,再将新建表的数据存储到原表里:

Select distinct * into Tmp from a
Drop table a
Select * into a from Tmp
Drop table Tmp

但是如果当原表和其他表有关联时,删除整个表可能会对数据造成影响,因此可以在表中新增一列,再删除数据,过后补充:

项目四:交换工资(难度:简单)
创建一个 salary表,如下所示,有m=男性 和 f=女性的值 。
例如:

idnamesexsalary
1Am2500
2Bf1500
3Cm5500
4Df500

交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
运行你所编写的查询语句之后,将会得到以下表:

idnamesexsalary
1Af2500
2Bm1500
3Cf5500
4Dm500

操作如下:

CREATE TABLE  IF NOT EXISTS `salary` (
	id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(10) NOT NULL,
	sex ENUM('m','f','u') DEFAULT 'u',
	salary INT DEFAULT 0
);
INSERT INTO salary(name,sex,salary) 
VALUES('A','m',2500),
         	  ('B','f',1500),
 			  ('C','m',5500),
 			 ('D','f',500);
UPDATE salary 
	SET sex = CASE
							WHEN sex = 'f' THEN 'm'
							ELSE 'f'
						END;
SELECT * FROM salary
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值