MySQL学习_数据表操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jt102605/article/details/86693341

数据表操作

创建数据表

CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
...
);

//CREATE SELECT语句,将select的结果添加到新表的后面
CREATE TABLE [IF NOT EXISTS] table_name(
column_name data_type,
...
)
SELECT ...;
CREATE TABLE tdb_goods_brands(
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
)
SELECT brand_name FROM tdb_goods GROUP BY brand_name;

查看数据表列表

SHOW TABLES [FROM db_name]
[LIKE 'pattern' | WHERE expr]

[FROM db_name] 表示可以查看其它数据库中的数据表,查看时并不会改变当前打开的数据库

查看数据表的表结构

SHOW COLUMNS FROM table_name;

//或者
DESC table_name;

查看数据表内容

SELECT * FROM table_name;

修改数据表表结构

//添加单列
ALTER TABLE table_name ADD [COLUMN] column_name column_definition [FIRST | AFTER column_name];

//添加多列
ALTER TABLE table_name ADD [COLUMN] (col_name col_definition,...);

添加单列时,[FIRST | AFTER column_name] ,表示新添加的列在指定列的前一列或后一列,若不加该参数项则表示在最后面添加新列

添加多列时,无法指定位置,只能将添加的列置于最末端

//删除列
ALTER TABLE table_name DROP [COLUMN] col_name;

删除和添加列可以在一条语句中同时进行,之间用逗号分隔

ALTER TABLE table_name DROP col_name1, ADD col_name2 col_definition2;
//使用"MODIFY"修改列定义 (只能修改列的类型,列的位置)
ALTER TABLE table_name MODIFY [COLUMN] column_name column_definition [FIRST | AFTER column_name];

//使用"CHANGE"修改列定义 (可以修改列名称,列类型,列的位置)
ALTER TABLE table_name CHANGE [COLUMN] old_col_name new_col_name col_definition [FIRST | AFTER col_name];
//修改数据表名
//方法1
ALTER TABLE table_name RENAME [TO|AS] new_table_name;

//方法2
RENAME TABLE table_name TO new_table_name [,table_name2 TO new_table_name2]...;
//添加主键约束
ALTER TABLE table_neme ADD [CONSTRINT[symbol]] PRIMARY KEY [index_type] (index_col_name,...);

//删除主键约束
ALTER TABLE table_name DROP PRIMARY KEY;

 [CONSTRINT[symbol]] 参数可以为添加的主键起名字

//添加唯一约束
ALTER TABLE table_name ADD [CONSTRAINT[symbol]]UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name);

//删除唯一约束
ALTER TABLE table_name DROP {INDEX | KEY} index_name;
//添加外键约束
ALTER TABLE table_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition; 

//删除外键约束
ALTER TABLE table_name DROP FOREIGN KEY fk_symbol;

fk_symbol 是外键的名字,如若不指定,系统会自动分配,可以通过 "SHOW CREATE TABLE table_name;" 查看

ALTER TABLE test ADD FOREIGN KEY (username) REFERENCES test2 (id);
//添加或删除默认约束
ALTER TABLER table_name ALTER [COLUMN] column_name {SET DEFAULT literal | DROP DEFAULT};

 

记录操作

插入记录

//方法1 INSERT VALUES
INSERT [INTO] table_name [(col_name1,col_name2,...)] 
{VALUES|VALUE} ({EXPR|DEFAULT},...),(...),...;

省略 [(col_name1, col_name2,...)] 时,意味着需要为所有的字段赋值,

主键自增列插入赋值时可以赋为"NULL" 或 "DEFAULT", 该列仍保持自增性

插入时所赋的值也可以为表达式(expr), 默认值 (DEFAULT, 定义了默认值的情况下)

//方法2 INSERT SET
INSERT [INTO] table_name 
SET col_name1={expr|DEFAULT},col_name2={expr|DEFAULT},...;

方法2与方法1的区别在于,方法2可以使用子查询(SubQuery),因为set后跟着比较运算符"="

方法2一次性只能插入一条记录,而方法1一次性可以插入多条记录

//方法3 INSERT SELECT
INSERT [INTO] table_name [(col_name,...)] 
SELECT...;

方法3可以将查询的结果插入到指定的数据表

INSERT test(username) 
SELECT username FROM user WHERE age>25;
INSERT tdb_goods_cates (cate_name) 
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

更新记录

//单表更新
UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1={expr|DEFAULT} [,col_name2={expr|DEFAULT}]...
[WHERE where_condition];
UPDATE user SET age=age+2 WHERE id>20;

删除记录

//单表删除
DELETE FROM table_name [WHERE where_condition]

删除数据表中的所有记录(清空数据表)

TRUNCATE TABLE table_name;

查找记录

SELECT select_expr [,select_expr...]
[
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC | DESC],...] [HAVING where_condition]
    [ORDER BY {col_name | exor | position} [ASC | DESC],...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
]

1.查询表达式 select_expr

  • 每一个表达式表示想要的一列,必须至少有一个
  • 多个列之间用英文逗号分隔
  • 星号(*)表示所有列,table_name.*可以表示命名表的所有列
  • 查询表达式可以使用 [AS] alias_name 为其查询的字段赋予别名,查询结果将以别名显示
  • 别名可以用于GROUP BY, ORDER BY 或 HAVING 子句
  • 查询表达式中的字段顺序可以和原数据表中的字段顺序不一致,查询结果按照查询表达式中的字段顺序排列
SELECT id,username FROM test;

//为查询结果设置别名
SELECT id AS uid, username AS uname FROM test;

2.条件表达式 WHERE

  • 用于对记录进行过滤,如果没有指定WHERE子句,则显示所有记录
  • 在WHERE表达式中,可以使用MySQL支持的函数或者运算符

3.查询结果的分组 GROUP BY

  • 对查询到的记录分组时,可以通过列的列名(col_name) 也可以通过列的位置(position)进行划分
  • 列位置指的是查询语句中出现的字段的位置
SELECT sex FROM user GROUP BY sex;

SELECT sex FROM user GROUP BY 1;

4.分组条件 HAVING

  • HAVING 后跟的字段要么出现在选择字段中要么出现在聚合函数中
SELECT id, sex FROM test GROUP BY 2 HAVING id>10;

SELECT sex FROM test GROUP BY sex HAVING count(id)>15;

5.对查询结果进行排序 ORDER BY

  • 根据选择语句中出现的字段名或者出现的字段序号进行排序
  • 出现多个字段时,先按先出现的字段排,先出现的字段的值一样时,在根据后面的字段排序
  • DESC表示降序,ASC表示升序
SELECT * FROM user ORDER BY id, sex DESC;

6.限制查询结果的返回数量 LIMIT

  • LIMIT a, b  表示从查询结果中编号为a的记录开始依次显示b条记录 (第一条记录的编号为0,后面依次递增)
SELECT * FROM user LIMIT 2,2;

 

约束

  • 约束保证了数据的完整性和一致性
  • 约束分为表级约束和列级约束,只对一个字段做约束属于列级约束
  • 约束类型包括:NOT NULL(非空约束),PRIMARY KEY(主键约束),UNIQUE KEY(唯一约束),DEFAULT(默认约束),FOREIGN KEY(外键约束)

非空约束

  • NULL: 该字段可以为空
  • NOT NULL: 该字段不可为空
CREATE TABLE tb_name (
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL);

自动编号设定

  • AUTO_INCREMENT: 自动编号,且必须与主键组合使用;
  • 默认起始值为1,每次增量也为1

主键约束

  • PRIMARY KEY : 主键约束
  • 每张数据表只能存在一个主键
  • 定义为主键的字段不允许赋重复的值,主键用于保证记录的唯一性
  • 主键自动为NOT NULL
  • AUTO_INCREMENT必须与主键一起使用,但主键不一定要与AUTO_INCREMENT一起使用

唯一约束

  • UNIQUE KEY: 唯一约束 
  • 每张数据表可以存在多个唯一约束
  • 唯一约束可以保证记录的唯一性
  • 唯一约束的字段可以为空值(NULL)

默认约束

  • DEFAULT : 默认值
  • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值 
CREATE TABLE table_name (
sex ENUM('1','2','3') DEFAULT '3'
);

外键约束

  • FOREIGN KEY:外键约束
  • 保证数据的一致性和完整性
  • 实现数据表的一对一或一对多关系

1.外键约束的要求:

  1. 父表和子表必须使用相同的存储引擎,而且禁止使用临时表
  2. 数据表的存储引擎只能为Inno DB
  3. 外键列(FOREIGN KEY)和参照列必须具有相似的数据类型.其中,数字的长度或是否有符号位必须相同;而字符的长度可以不同
  4. 外键列和参照列必须创建索引.如果外键列不存在索引的话,MySQL将自动创建索引

2.编辑数据表的存储引擎

在MySQL配置文件(my.ini)中修改,default-storage-engine=INNODB

3.使用外键

CREATE TABLE provinces( 
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
pname VARCHAR(20) NOT NULL);

CREATE TABLE user( 
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
username VARCHAR(10) NOT NULL, 
pid SMALLINT UNSIGNED, 
FOREIGN KEY (pid) REFERENCES provinces(id));

父表为"provinces",子表为"user", 具有相同的存储引擎INNODB;

外键列为"pid",参照列为"id",外键列和参照列必须具有相似的数据类型"SMALLINT UNSIGNED"

参照列 "id" 设置了主键约束,而主键约束字段会默认创建索引, 外键列 "pid" 没有创建索引,但MySQL会自动为外键列创建索引

查看索引

SHOW INDEXES FROM table_name\G;
root@localhost test>SHOW INDEXES FROM provinces\G;
*************************** 1. row ***************************
        Table: provinces
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.32 sec)

ERROR: 
No query specified

root@localhost test>SHOW INDEXES FROM user\G;
*************************** 1. row ***************************
        Table: user
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
*************************** 2. row ***************************
        Table: user
   Non_unique: 1
     Key_name: pid
 Seq_in_index: 1
  Column_name: pid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
2 rows in set (0.19 sec)

ERROR: 
No query specified

4.外键约束的参照操作

  • CASCADE : 从父表删除或更新则自动删除或更新子表中匹配的行
  • SET NULL : 从父表删除或者更新行,则设置子表中的外键列为NULL.如果使用该选项,则必须保证子表列没有指定NOT NULL
  • RESTRICT : 拒绝对父表的更新或删除操作
  • NO ACTION : 标准SQL的关键字,在MySQL中与RESTRICT相同
CREATE TABLE provinces( 
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
pname VARCHAR(20) NOT NULL);

CREATE TABLE user( 
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
username VARCHAR(10) NOT NULL, 
pid SMALLINT UNSIGNED, 
FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);

5.表级约束与列级约束

  • 对一个数据列建立的约束,称为列级约束
  • 对多个数据列建立的约束,称为表级约束
  • 列级约束既可以在列定义时声明,也可以在列定义后声明;表级约束只可以在列定义后声明
  • NOT NULL约束和DEFAULT约束不存在表级约束

猜你喜欢

转载自blog.csdn.net/jt102605/article/details/86693341