MySQL 基础

廉价感情. 提交于 2021-02-12 04:40:06

学院视频简单汇总

一、常用命令

    在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令

# 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到
mysql -u账号 -p密码

-u 用户名
-p 密码
-h 服务器名称
-p 端口号
-D 打开指定数据库
--prompt=name 设置命令提示符
--delimiter=name 指定分隔符
-V,--version 输出版本信息并且退出

exit,quit,\q 退出

# 创建数据库
CREATE {DATABASE|SCHEMAS} [IF NOT EXISTS] db_name DEFAULT CHARACTER SET = 'UTF8|GBK|...';

CREATE DATABASE IF NOT EXISTS myWebSite;

# 修改数据库编码方式
ALTER {DATABSE|SCHEMAS} db_name [DEFAULT] CHARACTER SET [=] charset_name;

ALTER DATABSE myWebSiteDEFAULT CHARACTER SET = utf8;

# 数据库列表
SHOW DATABASE;
SHOW SCHEMAS;

# 查看指定数据库定义
SHOW CREATE {DATABASE|CEHMAS} db_name;

SHOW CREATE DATABASE myWebSite;

# 查看上条数据库警告
SHOW WARNINGS;

# 打开指定数据库和查看当前打开的数据库(如果忘记了)
USE db_name;
SELECT DATABASE()|SCHEMAS();

# 删除指定数据库
DROP {DATABASE|CEHMAS} [IF EXISTS] db_name;

DROP DATABASE IF EXISTS myWebSite;

# 查看数据表结构
DESC db_name;
DESCRIBE db_name;
SHOW COLUMNS FROM db_name;

# UNSIGNED 无符号,移除负数范围,即无法填充负数范围的数值
CREATE TABLE table_name(num1 INT UNSIGNED);

# ZEROFILL 自动补充0,创建数据表时,会根据其位数自动在前面补0,如int,默认十位数范围,填充1数字,会变成0000000001
CREATE TABLE table_name(num1 INT ZEROFILL);

二、配置mysql输出日志到指定位置

    在sql命令行中,输入以下命令即可

\T D:\SQLlog\syslog.txt

三、数据类型(需要注意的)

  • 字符串-枚举类型 ENUM
ENUM(temp1,temp2,temp3)

注意:设置的字符串中含有空格将自动忽略

栗子:CREATE TABLE IF NOT EXISTS test(sex ENUM('男','女','保密'));

测试:INSERT test VALUES('男');

错误:存入的值与枚举中地值不一致时会报错

测试:INSERT test VALUES('男1');

特殊1:存入的值可以为序号,序号值从1开始,即男为1,女为2,保密为3

测试1:INSERT test VALUES(1);

特殊2:如果设置的字段可以为NUll,则也可以键入

测试2:INSERT test VALUES(NULL);
  • 字符串-集合类型 SET
SET(temp1,temp2,temp3)

注意:设置的字符串中含有空格将自动忽略

栗子:CREATE TABLE IF NOT EXISTS test(favour SET('A','B','C','D'));

测试:INSERT test VALUES('A,C,D');INSERT test VALUES('D,B,A');

特殊1:存入的值是以2进制来保存,可以使用2进制来控制值,ABCD分别以1、2、4、8来表示,这里键入3,则表示保存AB,15则表示保存所有

测试1:INSERT test VALUES(3);INSERT test VALUES(15);

四、完整性约束条件

  • PRIMARY KEY 主键,可简写为KEY,复合主键可写为PRIMARY KEY(字段1,字段2)
  • AUTO_INCREMENT 自增长,配合主键使用,可以指定值也可以不指定,特殊指定为NULL或DEFAULT也会增长,创建表结构时设置AUTO_INCREMENT为100则从100开始增长
  • FOREIGN KEY 外键
  • NOT NULL 非空
  • UNIQUE KEY 唯一
  • DEFAULT 默认值,插入为默认值可使用DEFAULT进行设置
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [UNSIGNED|ZEROFILL] [NOT NULL] [DEFAULT 默认值] [[PRIMARY] KEY| UNIQUE [KEY]] [AUTO_INCREMENT]
)

五、数据表操作

  • 列出所有表
SHOW TABLES;
  • 修改表名
规范
ALTER TABLE tbl_name RENAME [TO|AS] new_name;
RENAME TABLE tbl_name TO new_name;

ALTER TABLE tbl_name RENAME TO tbl_name1;
或者
ALTER TABLE tbl_name RENAME AS tbl_name1;
或者
ALTER TABLE tbl_name RENAME tbl_name1;
  • 添加字段
ALTER TABLE tbl_name ADD 字段名称 字段类型 [完整性约束条件] [FIRST|AFTER 字段名称]

--栗子--
ALTER TABLE test ADD card CHAR(18);
ALTER TABLE test ADD card1 VARCHAR(100) NOT NULL UNIQUE;
ALTER TABLE test ADD card2 VARCHAR(18) NOT NULL FIRST;
ALTER TABLE test ADD card3 INT NOT NULL DEFAULT 100 AFTER card;

--选中一次表,完成多个操作--
ALTER TABLE test
ADD card4 INT NOT NULL DEFAULT 123 AFTER card3,
ADD card5 FLOAT(6,2) FIRST,
ADD card6 SET('A','B','C');
  • 删除字段
ALTER TABLE tbl_name DROP 字段名称

--栗子--
ALTER TABLE test DROP card; 

--删除多个--
ALTER TABLE test 
DROP card,
DROP card1; 
  • 修改字段
ALTER TABLE tbl_name MODIFY 字段名称 字段类型 [完整性约束条件] [FIRST|AFTER]

--栗子--
ALTER TABLE test MODIFY card VARCHER(20) NOT NULL DEFAULT '123';

--修改类型并移动字段位置--
ALTER TABLE test MODIFY card VARCHER(20) AFTER card1;
  • 修改字段名称
ALTER TABLE tbl_name CHANGE 旧字段名称 新字段名称 字段类型 [完整性约束条件] [FIRST|AFTER 字段名称]

--栗子--
ALTER TABLE test CHANGE card card1 CHAR(32) NOT NULL DEFAULT '123';
  • 添加默认值
ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值
  • 删除默认值
ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT
  • 添加主键
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY[index_type](字段名称,...)

--栗子--
ALTER TABLE test ADD PRIMARY KEY(id);

--复合主键--
ALTER TABLE test ADD PRIMARY KEY(id,card);

--完整--
ALTER TABLE test ADD CONSTRAINT symbol PRIMARY KEY index_type(id);
  • 删除主键
ALTER TABLE tbl_name DROP PRIMARY KEY

--特殊,删除自增长主键(先取消自增长属性)--
ALTER TABLE test MODIFY id INT UNSIGNED;
ALTER TABLE test DROP PRIMARY KEY;
  • 添加唯一
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [索引名称](字段名称,...)

--栗子--
ALTER TABLE test ADD UNIQUE(card);
ALTER TABLE test ADD CONSTRAINT symbol UNIQUE KEY uni_card(card);

--复合唯一--
ALTER TABLE test ADD CONSTRAINT symbol UNIQUE INDEX nul_uni_card(card1,card2);
  • 删除唯一
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
  • 修改表的存储引擎
ALTER TABLE tbl_name ENGINE=存储引擎名称
  • 设置自增长的值(确定表中有自增长值)
ALTER TABLE tbl_name AUTO_INCREMENT=值
  • 删除表
DROP TABLE [IF EXISTS] tbl_name[,tbl_name...]
  • 添加数据、更新数据、删除数据(略)
  • 查询数据(特殊,可输出前置固定的列数据)
SELECT 1,2,3,4,5,id,username FROM cms_user;
  • 查询表达式LIKE
  • %,任意字符不限长度
  • _,1个任意字符
栗子:

username中含有1:
SELECT * FROM cms_user WHERE username LIKE '%1%';

username中含有有3个任意字符:
SELECT * FROM cms_user WHERE username LIKE '___';

username中含有第1位为1个任意字符,第2位为字符a,后面位任意字符:
SELECT * FROM cms_user WHERE username LIKE '_a%';
  • 分组查询GROUP BY
  • 配合GROUP_CONCAT()得到分组详情
# 分组查询
SELECT * FROM cms_user GROUP BY sex;
# 配合分组详情
SELECT id,sex,GROUP_CONCAT(username) FROM cms_user GROUP BY sex;

  • 聚合函数
  • COUNT()
  • MAX()
  • MIN()
  • AVG()
  • SUM()
  • 配合WITH ROLLUP记录上面所有记录的总和
SELECT id,sex,COUNT(*) AS totalUsers,MAX(age) AS max_age,MIN(age) AS min_age FROM cms_user GROUP BY sex WITH ROOLUP;

  • 针对查询结果做二次筛选HAVING,配合GROUP BY使用
SELECT sex,GROUP_CONCAT(username) AS users,COUNT(*) AS totalUsers,MAX(age) AS max_age,MIN(age) AS min_age FROM cms_user GROUP BY sex HAVING COUNT(*)>2 AND MAX(age)>60;

  • 对查询结果排序ORDER BY
  • 默认升序ASC,降序DESC
  • RAND(),随机排序,产生随机排序结果
# 简单排序
SELECT * FROM cms_user GROUP BY age ASC,id DESC;
# 随机排序
SELECT * FROM cms_user GROUP BY RAND();
  • LIMIT限制查询结果显示条数
  • 用作分页
  • 用作更新时,LIMIT只能带一个参数值,没有起始参数
# 查询操作
SELECT * FROM cms_user LIMIT 0,1;
# 更新前三条记录age的值
UPDATE cms_user SET age=age+10 LIMIT 3;
  • 内连接查询
  • JOIN|CROSS JOIN INNER JOIN
  • 通过ON连接条件
# 该内连接操作与使用下面第二行的WHERE条件查询一致
SELECT u.id,u.username,u.email,u.sex,p.proName FROM cms_user AS u INNER JOIN provinces AS p ON u.proId = p.id;

SELECT u.id,u.username,u.email,u.sex,p.proName FROM cms_user AS u,provinces AS p WHERE u.proId = p.id;
  • 外连接查询
  • 左外连接 LEFT [OUTER] JOIN 显示左表的全部记录及右表符合连接条件的记录
  • 右外连接 RIGHT [OUTER] JOIN 显示右表的全部记录及左表符合连接条件的记录
# 略
  • 外键关联
  • CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行(级联操作)
  • SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
  • RESTRICT:拒绝对父表的删除或更新操作(默认),设置该外键关联后,必须确保数据完整性的前提下才能执行删除或更新操作,否则会报错
  • NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同(默认)
# RESTRICT 默认
# 部门表
CREATE TABLE IF NOT EXISTS department(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
departName VARCHAR(20) NOT NULL UNIQUE
) ENGINE=INNODB;

# 员工表
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id)
) ENGINE=INNODB;

# CONSTRAINT emp_fk_dep为外键名称,可以不写,系统会默认生成一个
# depId为外键参照字段,department(id)为映射主表的主键字段

# 栗子解释1:
# 如果员工表中,A1员工属于A部门,直接删除部门表中A部门这条数据会报错,必须先将员工表中,属于A部门的所有员工数据先删除,才能删除部门表中地A部门这条数据;

# 栗子解释2:
# 插入员工表数据,如果插入数据中departId不存在部门表中,也会插入失败;

# CASCADE 级联
# 员工表
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB;

# 删除父表中的记录时,对应的子表中的记录会全部删除
# 更新操作,要先将对应的子表中地记录全部删除才能进行更新

# SET NULL
# 员工表
CREATE TABLE IF NOT EXISTS employee(
id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE,
depId TINYINT UNSIGNED,
CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=INNODB;

# 删除父表中的记录时,对应的子表中的记录外键值会设置为NULL
# 更新操作,对应的子表中的记录外键值也会设置为NULL
  • 添加外键
  • 删除外键
# 添加外键(确保数据关联性没有问题的情况下)
ALERT TABLE emploee ADD CONSTRAINT emp_fk_dep FOREIGN KEY(depId) REFERENCES department(id);

# 删除外键
ALERT TABLE emploee DROP FOREIGN KEY emp_fk_dep;
  • UNION
  • UNION ALL
  • UNION和UNION ALL区别是UNION去掉相同记录,UNION ALL是简单的合并到一起
# UNION
SELECT username FROM employee UNION SELECT username FROM cms_user;

# UNION ALL
SELECT username FROM employee UNION ALL SELECT username FROM cms_user;

 

 

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!