后面有惊喜
“主键(PRIMARY KEY)” 的完整称呼是“主键约束”。MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。
外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。
一个表可以有一个或多个外键。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。
定义外键后,不允许删除另一个表中具有关联关系的行。
作用:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性。
ubuntu 终端的命令:
查看MySQL服务状态:
sudo service mysql status
停止MySQL服务:
sudo service mysql stop
启动MySQL服务:
sudo service mysql start
重启MySQL服务:
sudo service mysql restart
配置文件路径为:
/etc/mysql/mysql.conf.d/mysqld.cnf
配置文件里面常用参数:
port 端口号,默认 3306
bind-address 服务器绑定的 ip,这个配置默认 127.0.0.1 可以访问,要远程访问的话需要取消注释。
datadir 数据库保存路径,默认为/var/lib/mysql
log_error 错误日志的路径,默认为/var/log/mysql/error.log
##常用数据类型如下
整数:int,bit
小数:decimal
字符串:varchar, char
日期时间: date, time, datetime
枚举类型 :(enum)
数据类型说明:
decimal 表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位.
char 表示固定长度的字符串,如 char(3),如果填充 'ab '时会补一个空格为 'ab ’ ,3表示字符数
varchar 表示可变长度的字符串,如 varchar(3) ,填充’ab’时就会存储 ‘ab’ ,3表示字符数
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.
字符串 text 表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客.
数据约束
约束是指数据在数据类型限定的基础上额外增加的要求.
常见的约束如下:
主键 primary key: 物理上存储的顺序. MySQL 建议所有表的主键字段都叫 id, 类型为 int unsigned.
非空 not null: 此字段不允许填写空值.
惟一 unique: 此字段的值不允许重复.
默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准.
外键 foreign key: 对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常.
基本使用命令
--登录数据库
mysql -uroot -p
--显示当前时间
SELECT NOW();
--登出(退出)数据库
QUIT/EXIT/CTRL + Z (WIN)
--查看所有数据库
SHOW DATABASES;
--创建数据库
CREATE DATABASE XXXX CHARSET=UTF8;
--使用数据库
USE XXX;
--查看当前使用的数据库
SELECT DATASASE();
--删除数据库-慎重
DROP DATABASE XXX;
--查看当前数据库中所有表
SHOW TABLES;
--创建表
create table 表名(
字段名称 数据类型 可选的约束条件,
column1 datatype contrai,
...
);
例子:
REATE TABLE TEST(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL,
age TINYINT UNSIGNED DEFAULT 0,
height DECIMAL(3,2),
gender ENUM('男','女') DEFAULT '男'
);
ALTER TABLE 表名 ADD 列名 类型 约束;
--修改表-添加birthday字段
ALTER TABLE test ADD birthday DATETIME;
ALTER TABLE 表名 MODIFY 列名 类型 约束;
--修改表-修改字段类型 MODIFY 不能修改字段名
ALTER TABLE test MODIFY birthday DATE NOT NULL;
ALTER TABLE 表名 CHANGE 原名 新名 类型及约束;
--修改表-修改字段名和字段类型 CHANGE 既能对字段重命名又能修改字段类型还能修改约束
ALTER TABLE test CHANGE birthday birth DATE NOT NULL;
ALTER TABLE 表名 DROP 列名
--修改表-删除birthday字段
ALTER TABLE test DROP height;
--查看表结构
DESC XXX;
--查看创表SQL语句
SHOW CREATE TABLE XXX;
--查看创库SQL语句
SHOW CREATE DATABASE XXX;
--删除表
DROP TABLE XXX;
--查询所有列数据
SELECT * FROM XXX;
--查询指定列数据
SELECT 列名,... FROM XXX;
--添加数据--全列插入 列的字段顺序一致
NSERT INTO XXX VALUES (X, XXX, ....)
id如果是自动增长, 可以使用default, null, 0
--添加数据--部分列插入 列的字段顺序一致
INSERT INTO XXXX (列1, 列2....) VALUES (X, XXX, ....)
--添加数据--全列多行插入
INSERT INTO 表名 VALUES (...),(...)...;
INSERT INTO test VALUES (default, '索隆', 22, 1.7, '男'), (default, '路飞', 20, 1.8, '男');
--添加数据--部分列多行插入
INSERT INTO test (name, age) VALUES ('小红', 20), ('小花', 20);
UPDATE 表名 SET 列1=值1,列2=值2... WHERE 条件
--修改数据
UPDATE test SET age=29,gender='女' WHERE id=3;
--删除表的数据
DROP FROM XXX WHERE 条件;
DROP FROM XXX --表示删除表里面的所有数据
--删除数据可以使用逻辑删除,添加一个标识字段,物理删除变为修改操作
ALTER TABLE XXX ADD is_del BIT DEFAULT 0;
-- 要删除的时候
UPDATE xxx SET is_del 1 WHERE 条件;
--AS 关键字,用户给表的字段和表设置别名
SELECT id AS 序号,NAME AS 名字, GENDER AS 性别 FROM students;
-- AS 可以省略
SELECT id 序号,NAME 名字, GENDER 性别 FROM students;
--DISTINGCT关键字, 用于去除重复的数据行,对列1 去重
SELECT DISTINCT 列1,列2... FROM XXX;
WHERE 条件查询
-
比较运算符查询
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <> -
逻辑运算符查询
and
or
not -
模糊查询
like是模糊查询关键字
%表示任意多个任意字符
_表示一个任意字符 -
范围查询
between … and … 表示在一个连续的范围内查询
in 表示在一个非连续的范围内查询 -
空判断查询
判断为空使用: is null
判断非空使用: is not null
--查询编号大于3的学生
SELECT * FROM test WHERE id > 3;
--查询编号不大于4的学生
SELECT * FROM test WHERE id <= 4;
--查询姓名不是“黄蓉”的学生
SELECT * FROM test WHERE name != "黄蓉";
--查询没被删除的学生
SELECT * FROM test WHERE is_del = 0;
--查询编号大于3的女同学
SELECT * FROM test WHERE id > 3 and gender = "女";
--查询编号小于4或没被删除的学生
SELECT * FROM test WHERE id < 4 or is_del = 0;
--查询年龄不在10岁到15岁之间的学生
SELECT * FROM test WHERE not (age> 10 and age < 15);
--查询姓路的学生
SELECT * FROM test WHERE name like "路%";
--查询姓路并且“名”是一个字的学生
SELECT * FROM test WHERE name like "路_";
--查询姓路或叫飞的学生
SELECT * FROM test WHERE name like "路%" or name like "%飞";
--查询编号为3至8的学生
SELECT * FROM test WHERE id between 3 and 8;
--查询编号不是3至8的男生
SELECT * FROM test WHERE (not id between 3 and 8) and gender = "男";
--查询编号是3、5、7的学生
SELECT * FROM test WHERE id in (3, 5, 7);
--查询编号不是3、5、7的学生
SELECT * FROM test WHERE id not in (3, 5, 7);
--查询没有填写身高的学生
SELECT * FROM test WHERE height is null;
--查询填写身高的学生
SELECT * FROM test WHERE height is not null;
--查询未删除男生信息,按学号降序
SELECT * FROM test WHERE is_del = 0 order by id desc;
--显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高-->矮排序
SELECT * FROM test ORDER BY age desc, height desc;
--查询前3行男生信息
SELECT * FROM test WHERE gender="男" limit 3,0;
--查询学生表,获取第n页, 每页 m 个数据的SQL语句
SELECT * FROM test LIMIT (n-1) * m , m;
MySQL 常见问题或者技巧
- MySQL完整复制表到另一个新表
CREATE TABLE table2 LIKE table1;
INSERT INTO table2 SELECT * FROM table1;
- MySQL 使用 SOURCE 命令导入中文乱码
mysql -u root -p --default-character-set=utf8
USE dbname
SOUURCE XXX.SQL