MySQL笔记(1)

写在前面

mysql在使用过程中的一些工具语句
- 显示当前服务器版本:select version();
- 显示当前日期时间:select now();
- 显示当前用户:select user();
- 跳转至当前数据库:use db_name;
- 显示跳转至的数据库信息:select database();
- 显示服务器下的数据库列表:show {database|schemas};
- 显示数据库信息(默认值,编码方式等等):show create database db_name;
- 查看数据表列表:show tables [from db_name];
- Ps:使用此语句不会改变当前所处位置
- 查看数据表结构:show columns from tbl_name;
- 查看约束名:show indexes from tbl_name\G;
- 加上\G代表以网格形式呈现,比较好看一些
- 查看外键名:show create table tbl_name;

对数据库的创建&修改&删除

数据库的创建

create {database|schema} [if not exists] db_name [default] character set [=] character_name;

大部分其实并不需要写入,常规操作就是create database db_name;其余部分则是设置默认值,编码格式等等,一般采取默认的utf-8即可。
- 数据库的修改

alter {database|schema} db_name
[default] character set [=] charset_name;

数据库的删除

Drop {database|schema} [if exists] db_name;

创建数据库是创建基本表的必要条件,在建表之前最好使用use db_name;跳转至当前你所需要使用的数据库,以便查找。

基本表的创建&修改&删除

创建基本表

Create table Person(
    username varchar(20),
    age tinyint unsigned,
    salary float(8,2) unsigned
);

创建基本表时内部属性的格式为:

status_name  status_type  status_definition

注意到后边的status_definition了么?那是约束条件。

  • 约束条件分为表级约束列级约束

    • 列级约束:针对某一个字段的约束
    • 表级约束:针对两个及以上字段的约束
  • 总共有五种约束条件:

    • NOT NULL 非空约束
    • PRIMARY KEY 主键约束
    • UNIQUE KEY 唯一约束
    • DEFAULT 默认约束
    • FOREIGN KEY 外键约束

其中,NOT NULL和DEFAULT只能作为列级约束,其余的既可作为列级约束亦可作为表级约束

在这里再具体说一下外键约束吧
  • 外键约束有4个要求
    • 父表和子表必须使用相同的存储引擎,且禁止使用临时表
    • 数据表的存储引擎只能为InnoDB
    • 外键和参照列必须有相似的数据类型(数字长度,是否有符号位必须相同。字符长度可以不同)
    • 外键&参照列必须创建索引。若外键列不存在索引则MySQL会自动分配
    • eg
create table Proviences(
    id smallint unsigned NOT NULL Auto_Increment,
    pname varchar(20) NOT NULL,
    Primary Key(id)
);

create table Users(
    id smallint unsigned Primary Key Auto_Increment,
    username varchar(10) NOT NULL,
    pid smallint unsigned,      //此处务必和Proviences表中的
    Foreign Key (pid) Reference Proviences(id)
);
  • 除此之外,外键约束还有参照操作
    • CASCADE:从父表删除或更新时自动删除或更新子表中匹配的行(级联)
    • SET NULL:从父表删除或更新行后自动设置子表中的外键为NULL(若使用该选项则务必保证子表的列没有指定NOT NULL)
    • RESTRICT:拒绝父表的删除更新操作(限制)
    • NOT ACTION:同RESTRICT.标准SQL关键字
    • eg:
Constraint A Foreign Key (pid) References Proviences(id) on Delete CASCADE;   
//将外键起名为A,同时告知用户外键(pid)参照Proviences表中的id属性。并且在删除时执行级联操作

总之这里水还挺深,咱们之后再详细讨论

修改基本表alter table tbl_name

  • 添加单列:add [column] col_definition [Frist|After col_name];
  • 添加多列:add [column] (col_name1 column_definition1, ….);
  • 删除一列:drop [column] col_name;
  • 删除多列:drop [column] col_name1, col_name2,….;
  • 添加主键约束:
语法:
alter table tbl_name
add [Constraint [symbol]] PTIMARY KEY [index_type] (index_col_name,....);

alter table Users Add Constraint PK_Users_id PRIMARY KEY(id);
  • 删除主键约束:alter table tbl_name Drop PRIMARY KEY;
  • 添加唯一约束:
alter table tbl_name
add [Constraint [sybol]] UNIQUE [index|key] [index_name] [index_type] (index_col_name,....);
  • 删除唯一约束:alter table tbl_name Drop {Index|Key} index_name;
  • 添加外键约束
alter table tbl_name
add [Constraint [sybol]] Foreign Key [index_name] [index_name] (index_col_name,....) reference_definition;
  • 删除外键约束:alter table tbl_name Drop Foreign Key fk_symbol;
  • 添加/删除默认约束:
alter table A
column B {set Default literal|Drop Default}
  • 修改列定义:modify [column] col_name col_definition [Frist|After col_name];
    • eg:alter table users2 modify id tinyint unsigned not null;
  • 修改列名称:
语法:
ALTER TABLE tbl_name 
CHANGE [COLUMN] old_col_name new_col_name column_definition [FRIST|AFTER col_name];

alter table users2
change pid p_id tinyint unsigned not null;
  • 修改数据表名
方法1:
ALTER TABLE tbl_name
RENAME [TO|AS] new_tbl_name

方法二:
RENAME TABLE tbl_name TO new_tbl_name[,tbl_name2 TO new_tbl_name2]...

//不过尽量少使用此方法。因为可能会造成之前创建的视图或索引无法引用

对记录的操作(增删改查)

插入操作(增)

1.INSERT

INSERT [INTO] tbl_name [(col_name,....)] {VALUES|VALUE} ({expr | DEFAULT},....),(....),....

eg:
CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    usrname VARCHAR(20) NOT NULL,
    password VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED NOT NULL DEFAULT 10,
    sex ENUM('0','1') DEFAULT '1'
);
INSERT users VALUES(NULL,'Tom','123',25,'1');
//若你准备使用默认的自动编号的值时只需要将其设置为NULL或DEFAULT即可
//可插入多条记录

2.INSERT SET

语法:
INSERT [INTO] tbl_name SET col_name {= | > | <} {expr | DEFAULT},....

Ps:此种方法一次性只能插入一条记录

3.INSERT SELECT

INSERT [INTO] tbl_name [(col_name,...)] SELECT ...

Ps:此方法可以将查询结果插入到指定数据表

表单更新(改)

1.单表更新

语法:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1 = {expr1 | DEFAULT} [,col_name2 = {expr2 | DEFAULT}] ... [WHERE where_condition]

Ps:省略where条件的话记录将全部被更新

eg:
UPDATE users SET age = age+5;
UPDATE users SET age = age - id, set = 0;
UPDATE users SET age = age+10 WHERE id%2=0;

2.多表更新

删除记录(删)

1.单表删除

DELETE FROM tbl_name [WHERE where_condition]

eg:
DELETE FROM users WHERE id=6;

Ps:删除id号后再添加时id号为当前最大的id号+1而并非会去补充删掉的id号

查找记录(查)

语法:
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 |expr |position} [ASC |DESC], ...]
    [LIMIT {[offset,] row_count |row_count OFFSET offset}]
]
  • 多个列之间以英文逗号分隔
  • 查询表达式可以用[AS] alias_name为其赋予别名
  • 别名可用于GROUP BY,ORDER BY或HAVING子句
  • 查询表达式的顺序将影响插叙结果的顺序
  • 最好在属性(列)之前加上其隶属于的表的名字并加上“.”
  • 字段的别名也将影响结果集当中的别名
SELECT id AS userId,username AS uname FROM users;
//使用别名的时候加上AS关键字
//结果将显示为userId和uname的表

UPDATE和DELETE语句在省略WHERE条件时将更新/删除所有记录

GROUP BY(对所有记录做分组)
[GROUP BY {col_name | position} [ASC |DESC], ...]

SELECT sex FROM users GROUP BY sex;
//查询结果只有两个:01
HAVING(只对某一部分记录做分组)
SELECT sex,age FROM users GROUP BY sex HAVING age>35;
SELECT sex FROM users GROUP BY sex HAVING count(id)>=2;

//Ps:select后的属性是查找后按照所给分组显示出的属性(不同记录的排列组合,会自动去重)
//HAVING语句后的部分要么保证字段必须出现在当前的SELECT语句之中
//当然也可以是一个聚合函数(第二种,只有一个返回结果)
ORDER BY(排列顺序)
//以一个字段作为标准排序
SELECT *FROM users ORDER BY id DESC;

//以两个字段作为标准排序
SELECT * FROM users ORDER BY age,id DESC;
//首先以age作为标准由小到大排列,若不满足条件则继续用id进行降序排列(在原排列的基础上)
LIMIT(限制查询结果返回的数量)
语法:
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

SELECT * FROM users LIMIT 2,2
//从2号记录开始返回两条记录(mysql种的记录从0开始)

然后我们可以结合INSERT操作,将查找结果直接插入到指定表中

INSERT target(username) SELECT username FROM users WHERE age>30;
//向target表中的username属性插入从users表中筛选出的年龄大于30的记录的用户名

猜你喜欢

转载自blog.csdn.net/qq_38722097/article/details/81072822