1.mysql是什么?
mysql本质就是一个c/s架构的套接字软件
2.数据库基本概念
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件:mysql
库:文件夹
表:文件
记录:文件中的一行的内容
3.针对库、表、记录的操作
3.1 库文件夹:
增:
CREATE DATABASE 库名 CHARSET 编码;
改:
ALITER DATABASE 库名 CHARSET 编码;
查:
SHOW DATABASES;
SHOW CREATE DATABASE 库名;
删:
DROP DATABASE 库名;
3.2 表文件:
操作表前要先切换到库下:use 库名;
建表的完整语法:
CREATE TABLE 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
增:
CREATE TABLE 表名(字段名 类型,...);
改:
改字段类型约束条件:
ALTER TABLE 表名 modify 字段名 类型(长度宽度);
改字段名类型约束条件:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度宽度);
查:
查看所有表:
SHOW TABLES;
查看指定表:
SHOW CREATE TABLE t1;
查看表结构:
DESC 表名;
删:
DROP TABLE 表名;
清空表:
TRUNCATE 表名;
#清空表应该使用TRUANCATE,不仅删除所有记录,而且将自增字段的值归0
3.3 记录文件中一行行内容:
增:
方式一(指定字段名插入):
INSERT INTO 表名 (字段名,字段名,...) VALUES (值1,值2,...),...;
方式二(默认位置插入):
INSERT INTO 表名 values (值1,值2,...),...;
改:
UPDATE 表名 SET 字段名=内容 where 条件;
查:
SELECT 字段名 FROM 表名;
删:
DELETE FROM 表名 WHERE 条件;
#DELETE 只能用于删除符合条件的某几条记录,不能用于清空表
4.存储引擎
存储引擎就是表的类型
不同的类型会对应不同的处理机制
测试:
CREATE TABLE t3(id INT)ENGINE='InnoDB';
CREATE TABLE t4(id INT)ENGINE='MyISAM';
CREATE TABLE t5(id INT)ENGINE='BLACKHOLE';
CREATE TABLE t6(id INT)ENGINE='MEMORY';
INSERT INTO t3 VALUES(1);
INSERT INTO t4 VALUES(1);
INSERT INTO t5 VALUES(1);
INSERT INTO t6 VALUES(1);
5.数据类型
PRIMARY #主键(不能为空的意思)
AUTO_INCREMENT #自动增长
DEFAULT #默认值
5.1 数字类型:整型(默认有符号),浮点型
类型设置成无符号:unsigned
#整型类型:数据类型宽度限制的是显示宽度而非存储宽度
整型:
TINYINT #占1字节
SMALLINT #占2字节
MEDIUMINT #占3字节
INT #占4字节
BIGINT #占8字节
浮点型:
FLOAT #占4字节
DOUBLE #占8字节
DECIMAL #手动指定字节
5.2 字符类型:
CHAR_LENGTH(字段名) #用于查看某字段包含的字符个数
CHAR #定长
VARCHAR #变长
例:
CHAR(5)
相同点:最大能存放5个字符
不同点:假设传入3个字符,会补全2个字符
#注意:
针对CHAR类型,在存放时会将字符补全为5个,在查询时又会将末尾补全的空格去掉
不让MySQL去掉末尾空格的方法:
通过修改sql_mode,添加 SQL_PAD_CHAR_TO_FULL_LENGTH
VARCHAR(5)
相同点:最大能存放5个字符
不同点:假设传入3个字符,就存3个字符
LIKE:
WHERE 字段名 LIKE
LIKE是模糊匹配
%:任意个数的任意字符
_:1个任意字符
大文本类型:
TEXT系列(文本是带有编码)
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
BLOB系列(也是字符数据,但是不带编码)
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
二进制类型:
BINARY系列(存储二进制数据)
BINARY
VARBINARY
5.3 日期类型:TIME,DATE,DATETIME,TIMESTAMP,YEAR,
NOW() #此函数用于获取当前时间
5.4 枚举类型:
ENUM #多选一
5.5 集合类型:
SET #多选多
6.表操作之约束条件
约束条件:约束条件是在类型之外为字段附加的限制
强调:如果表的类型为InnoDB储存引擎,在创建表时,必须定义一个主键
如果不指定,InnoDB存储引擎会自上而下寻找一个不为空且唯一的字段当做主键
如果不指定并且也没有NOT NULL+UNIQUE的字段,那么InnoDB存储引擎会生成一个隐藏的字段当做主键
PRIMARY KEY #标识该字段为该表的主键,可以唯一的标识记录
单从约束角度去看,主键的约束效果是NOT NULL+UNIQUE
FOREIGN KEY #标识该字段为该表的外键
限制关联表某一个字段的值必须是来自于被关联表的一个字段
注意:
1.被关联的字段必须是一个KEY,通常是ID字段
2.创建表时:必须先建立被关联的表,才能建立关联表
3.插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
#关联表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(15),
age INT,
dep_id INT,
FOREIGN KEY(dep_id) REFERENCES dep(id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
INSERT INTO emp(name,age,dep_id) VALUES
('hades',18,1),
('iggy',28,2),
('egon',38,2),
('alex',30,1),
('xingchen',18,3);
#被关联表
CREATE TABLE dep(
id INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20),
info VARCHAR(50)
);
INSERT INTO dep(dname,info) VALUES
('IT','技术部门'),
('Sale','销售部'),
('HR','人事部');
#ps:删除时,应该先删除关联表emp中的记录,再删除被关联表对应的记录
NOT NULL #标识该字段不能为空
UNIQUE KEY #标识该字段的值是唯一的
AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT #为该字段设置默认值
UNSIGNED #无符号
ZEROFILL #使用0填充
#找两张表关系的窍门
emp dep
#1.先站在左边的角度去找左表emp的多条记录能否对应右表dep的一条记录
翻译:多个员工能否属于一个部门
#2.然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
翻译:多个部门能否拥有同一名员工
#多对一结果的判断
1.如果只有单向多对一成立,最终关系就是多对一
2.在emp表新增一个字段dep_id,该字段外键关联dep(id)
#多对多结果的判断
1.双向的多对一就是多对多
2.需要建立第三张表,有一个字段的值fk左表,一个字段的值fk右表
CREATE TABLE author(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(16),
age INT
);
CREATE TABLE book(
id INT PRIMARY KEY AUTO_INCREMENT,
bname VARCHAR(20),
price INT
);
CREATE TABLE author2book(
id INT PRIMARY KEY AUTO_INCREMENT,
author_id INT,
book_id INT,
FOREIGN KEY(author_id) REFERENCES author(id)
ON UPDATE CASCADE
ON DELETE CASCADE,
FOREIGN KEY(book_id) REFERENCES book(id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
#一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录
7.表操作
1.修改表名
ALTER TABLE 表名 RENAME 新表名;
2.增加字段
ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...],ADD 字段名 数据类型[完整性约束条件...];
ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...] AFTER 字段名;
3.删除字段
ALTER TABLE 表名 DROP 字段名;
4.修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件...];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件...];
5.复制表
#在查询语句前加上CREATE TABLE 表名
CREATE TABLE user SELECT host,user,password,select_priv FROM mysql.user;
#复制表结构
CREATE TABLE user1 SELECT host,user,password,select_priv FROM mysql.user WHERE 3<1;
8.记录的增、删、改
1.插入完整数据(顺序插入)
语法一:
INSERT INTO 表名(字段1,字段2,字段3...字段n) VALUES(值1,值2,值3...值n);
语法二:
INSERT INTO 表名 VALUES (值1,值2,值3...值n);
2.指定字段插入数据
语法:
INSERT INTO 表名(字段1,字段2,字段3...) VALUES (值1,值2,值3...);
3.插入多条记录
语法:
INSERT INTO 表名 VALUES
(值1,值2,值3...值n),
(值1,值2,值3...值n),
(值1,值2,值3...值n);
4.插入查询结果
语法:
INSERT INTO 表名(字段1,字段2,字段3...字段n)
SELECT (字段1,字段2,字段3...字段n) FROM 表2
WHERE ...;
9.更新数据UPDATE
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password('123')
WHERE user='root' and host='localhost';
10.删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONDITION;
示例:
DELETE FROM mysql.user
WHERE password='';