在日常学习和工作使用MySQL中的总结,方便自己查看,没有的说明我没有遇到或用到。
C:\ProgramData\MySQL\MySQL Server 版本号\data
(该目录下每个目录表示一个数据库)
net start mysql
net stop mysql
mysql -u用户名 -p密码 -hIP
/* 二选一即可 */
quit
exit
[client] 下配置客户端编码:
default-character-set=gbk
[mysqld]下配置服务器编码:
character-set-server=utf8
[mysqld]下配置:
max_allowed_packet=8M
SHOW VARIABLES LIKE 'char%';
character_set_client = utf8
MySQL把我们客户端传递的数据都当成是utf8。
若客户端发送的是GBK,服务器会当成utf8对待,
结果:乱码
处理问题的两种办法:
character_set_results = utf8
MySQL发送给客户端的数据都是utf8的。
若服务器发送给服务器的是utf8的数据,客户端会它当成GBK
结果:乱码
处理问题的办法:
[client]
Port=3306
[mysql]
default_character_set=gbk /* 它可以修改三个变量:client、resylts、connection */
mysqldump -u用户名 -p密码 数据库名>生成的脚本文件路径
/*
注意:
不要打分号
不要登录MySQL,直接在cmd下运行
生成的脚本文件中不包含create database语句
*/
第一种方式:
mysql -u用户名 -p密码 数据库名<脚本文件路径
/*
不要打分号
不要登录MySQL,直接在cmd下运行
*/
第二种方式:
/* 第一步:登录mysql */
/* 第二步:输入代码 */
SOURCE SQL脚本路径
SHOW DATABASES
USE 数据库名
CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET=utf8]
DROP DATABASE [IF EXISTS] 数据库名
ALTER DATABASE 数据库名 CHARACTER SET utf8
CREATE TABLE [IF NOT EXISTS] 表名(
列名 列类型 ,
…
列名 列类型
);
SHOW TABLES
SHOW CREATE TABLE 表名;
DESC 表名;
DROP TABLE 表名;
即:对表的修改
ALTER TABLE 表名
ADD (
列名 列类型,
…
列名 列类型
);
ALTER TABLE 表名
MODIFY 列名 列新的类型;
ALTER TABLE 表名
CHANGE 原列名 新列名 列类型;
ALTER TABLE 表名
DROP 列名;
ALTER TABLE 表名
RENAME TO 新表名;
INTERT INTO 表名(列名1,列名2,…) VALUES(列值1,列值2,…);
没有插入的列为默认值NULL
INTERT INTO 表名(列名1,列名2) VALUES(列值1,列值2);
值的顺序要与创建表时列的顺序相同。
INTERT INTO 表名 VALUES(列值1,列值2,…,列值last);
在数据库中所有的字符串类型必须使用单引号,不能使用双引号。日期类型也要使用单引号。
UPDATE 表名 SET 列名1=列值1, 列名2=列值2,…
[WHERE 筛选条件]
【筛选条件】
条件必须是一个boolean类型的值或表达式;
【运算符】
=
!=
<>
>
<
>=
<=
BETWEEN…AND
IN(…)
IS NULL
NOT
OR
AND
DELETE FEOM 表名
[WHERE 筛选条件];
CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
CREATE USER 用户名@'%' IDENTIFIED BY '密码';
GRANT 权限1, … ,权限n ON 数据库名.* TO 用户名@IP地址;
GRANT ALL ON 数据库名.* TO 用户名@IP地址;
REVOKE 权限1, … ,权限n ON 数据库名.* FROM 用户名@IP地址;
SHOW GRANTS FOR 用户名@IP地址;
DROP USER 用户名@IP地址;
SELECT * FROM 表名;
SELECT 列1 [, 列2, …, 列N] FROM 表名;
DISTINCT
:当查询结果中的多行记录一模一样时,只显示一行。
-- 查询所有列,完全重复的记录只显示一行 --
SELECT DISTINCT * FROM 表名;
-- 查询指定列,完全重复的记录只显示一行 --
SELECT DISTINCT 列1 [, 列2, …, 列N] FROM 表名;
SELECT 列名A+1 FROM 表名;
SELECT 列名B-列名C FROM 表名;
SELECT 列名D*列名E FROM 表名;
SELECT 列名F/2 FROM 表名;
/* 任何数值与NULL相加 = NULL。 */
SELECT CONCAT ('字符串', 列名B) FROM 表名;
SELECT IFNULL(列名, 0) +1000 FROM 表名;
--IFNULL(列名, 0)
--如果指定列中存在NULL值,那么当成0来运算。
SELECT 列运算表达式 AS 别名 FROM 表名;
/* 其中AS可以省略 */
SELECT
语句也可以使用WHERE
子句来控制记录。
模糊查询需要使用运算符LIKE
通配符:
"_" 匹配一个任意字符
"%" 匹配0~N个任意字符
示例:
查询姓张并且姓名一共两个字
SELECT * FROM emp WHERE ename LIKE '张_';
查询姓名由算工作组成的员工
SELECT * FROM emp WHERE ename LIKE '___';
查询姓张,名字不限的员工
SELECT * FROM emp WHERE ename LIKE '张%';
查询姓名中有以“阿”(包括开头或结尾)的员工
SELECT * FROM emp WHERE ename LIKE '%张%';
条件等同于不存在,但如果姓名为NULL的查询不出来。
SELECT * FROM emp WHERE ename LIKE '%';
SELECT * FROM 表名 ORDER BY 列名 ASC;
/* ASE可以省略 */
SELECT * FROM 表名 ORDER BY 列名 DESC;
/* DESC不可以省略 */
SELECT * FROM 表名 ORDER BY 列名A ASC, 列名B DESC;
SELECT COUNT(列名) FROM 表名;
SELECT COUNT(*) FROM 表名;
SELECT COUNT(1 ) FROM 表名;
SELECT MAX(列名) FROM 表名;
SELECT MIN(列名) FROM 表名;
SELECT SUM(列名) FROM 表名;
SELECT AVG(列名) FROM 表名;
语法格式:
SELECT 列名A, 聚合函数 FROM 表名
[WHERE 筛选条件]
GROUP BY 列名A;
[HAVING 分组后的筛选条件]
[ORDER BY 排序]
【注意】
LIMIT用来限定查询结果的起始行,以及总行数。
ELECT * FROM 表名 LIMIT 0,5;
--LIMIT 起始行下标,最大显示记录的行数
优点在于分页查询方便
示例:
ELECT * FROM 表名 LIMIT 20,10;
列名 列类型 PRIMARY KEY [];
ALTER TABLE 表名
ADD PRIMARY KEY (列名);
ALTER TABLE 表名
DROP PRIMARY KEY ;
自增长需要加在整数类型的列
列名 列类型 PRIMARY KEY AUTO_INCREMENT;
ALTER TABLE 表名
CHANGE 列名
列名 INT AUTO_INCREMENT;
ALTER TABLE 表名
CHANGE 列名
列名 INT;
列名 列类型 NOT NULL;
列名 列类型 UNIQUE;
外键必须是另一表的主键的值(外键要引用主键!)
外键可以重复
外键可以为空
CREATE TABLE 表名B(
B表主键列名1 INT PRIMARY KEY AUTO_INCREMENT,
…
外键列名2 列类型,
CONSTRAINT fk_表名B_表名A FOREIGN KEY(列名2) REFERENCES 表名A(A表主键列名)
);
CREATE TABLE 表名B(
B表主键列名1 INT PRIMARY KEY AUTO_INCREMENT,
…
外键列名2 列类型
);
ALTER TABLE 表名B
ADD CONSTRAINT fk_表名B_表名A FOREIGN KEY(列名2) REFERENCES 表名A(A表主键列名)
从表新创建列作为外键,连接主表主键
CREATE TABLE class(
cid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(15) NOT NULL
);
INSERT INTO class VALUES(NULL, '软件工程一班');
INSERT INTO class VALUES(NULL, '软件工程二班');
SELECT * FROM class;
/*在sql语句末端添加*/
CREATE TABLE student(
sid INT AUTO_INCREMENT,
sname VARCHAR(10),
s_cid INT,
PRIMARY KEY(sid),
FOREIGN KEY (s_cid) REFERENCES class(cid)
);
INSERT INTO student VALUES(NULL, '谢俊锋',2);
INSERT INTO student VALUES(NULL, '何诺燃',3);/*约束生效 插入失败*/
SELECT * FROM student;
/*fk的使用*/
CREATE TABLE student(
sid INT AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
s_cid INT ,
PRIMARY KEY(sid),
CONSTRAINT fk_student_class FOREIGN KEY(s_cid) REFERENCES class(cid)
);
INSERT INTO student VALUES(NULL, '谢俊锋',2);
INSERT INTO student VALUES(NULL, '何诺燃',3);/*约束生效 插入失败*/
SELECT * FROM student;
/*在建表后添加外键*/
CREATE TABLE student(
sid INT AUTO_INCREMENT,
sname VARCHAR(10) NOT NULL,
s_cid INT ,
PRIMARY KEY(sid)
);
ALTER TABLE student
ADD FOREIGN KEY (s_cid) REFERENCES class(cid);
INSERT INTO student VALUES(NULL,'谢俊锋',2);
INSERT INTO student VALUES(NULL,'何诺燃',3);/*约束生效 插入失败*/
SELECT * FROM student;
从表的主键即是外键!
CREATE TABLE husband(
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(50)
);
INSERT INTO husband VALUES(NULL, '刘备');
INSERT INTO husband VALUES(NULL, '周瑜');
INSERT INTO husband VALUES(NULL, '孙策');
SELECT * FROM husband;
CREATE TABLE wife(
wid INT PRIMARY KEY,
wname VARCHAR(50)
);
INSERT INTO wife VALUES(1,'孙尚香');
INSERT INTO wife VALUES(2,'小乔');
INSERT INTO wife VALUES(3,'大乔');
SELECT * FROM wife;
创建中间表,列分别作为外键,链接对应主表主键
/*创建学生表*/
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50)
);
/*创建教师表*/
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(50)
);
/*创建关联表*/
CREATE TABLE stu_tea(
sid INT,
tid INT,
CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
);
/*往2张表插记录*/
INSERT INTO student VALUES(NULL,'周志轩');
INSERT INTO student VALUES(NULL,'黎永成');
INSERT INTO student VALUES(NULL,'廖科诚');
INSERT INTO student VALUES(NULL,'何景鑫');
INSERT INTO student VALUES(NULL,'陈诗臻');
SELECT * FROM student;
INSERT INTO teacher VALUES(NULL,'曹文文');
INSERT INTO teacher VALUES(NULL,'戴家刚');
INSERT INTO teacher VALUES(NULL,'徐家斌');
SELECT * FROM teacher;
/*建立关系*/
INSERT INTO stu_tea VALUES(3,1);
INSERT INTO stu_tea VALUES(4,1);
INSERT INTO stu_tea VALUES(5,1);
INSERT INTO stu_tea VALUES(2,2);
INSERT INTO stu_tea VALUES(3,2);
INSERT INTO stu_tea VALUES(4,2);
INSERT INTO stu_tea VALUES(1,3);
INSERT INTO stu_tea VALUES(2,3);
INSERT INTO stu_tea VALUES(3,3);
INSERT INTO stu_tea VALUES(4,3);
INSERT INTO stu_tea VALUES(5,3);
/*查关联表*/
SELECT * FROM stu_tea;
要求被合并的结果集:
列的类型和列数相同(并非要求表的列类型和列数相同)
关键字:
--去除重复行
UNION
--不去除重复行
UNION ALL
语法格式:
SELECT * FROM 表名A
UNION ALL
SELECT * FROM 表名B
MySQL语言中内连接可以使用MySQL本身特有的语法,也可以使用SQL标准语法。
SELECT * FROM 表1, 表2
--MySQL方言
SELECT * FROM 表1 INNER JOIN 表2
--标准SQL语法
这样连接的结果是一个笛卡尔积。笛卡尔积存在大量无用信息。
【笛卡儿积】
{a, b, c, d}、{1, 2}
{a1, a2, b1, b2, c1, c2, d1, d2}
--MySQL方言
SELECT 表名1.列名A, 表名1.列名B, 表名2.列名D
FROM 表名1, 表名2
WHERE 表1.列名C = 表2.列名E
--标准SQL语法
SELECT 表名1.列名A, 表名1.列名B, 表名2.列名D
FROM 表1 INNER JOIN 表2
ON 表1.列名C = 表2.列名E
--要查询的列
--要查询的表
--两个表连接的条件
--MySQL方言
SELECT 表名1.列名A, 表名1.列名B, 表名2.列名D
FROM 表1 别名1, 表2 别名2
WHERE 别名1.列名C = 别名2.列名E
--标准SQL语法
SELECT 表名1.列名A, 表名1.列名B, 表名2.列名D
FROM 表1 别名1 INNER JOIN 表2 别名2
ON 别名1.列名C = 别名2.列名E
开发开发中推荐使用SQL标准语法。
外连接有一主一次,左外连接即左表为主;右外连接即右表为主。
另外还有全外连接。
左外连接中,主表中所有的记录无论满足不满足条件,都打印出来;当条件不满足时,右表空缺的记录使用NULL来补位。
下面用左外连接的方式连接两个表:
SELECT 左表.列名A, 左表.列名B, 右表.列名D
FROM 左表 别名L LEFT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
将指定列补位的NULL替换为指定内容:
SELECT 左表.列名A, 左表.列名B, IFNULL(右表.列名D, '替换内容') AS 列别名
FROM 左表 别名L LEFT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
右外连接中,主表中所有的记录无论满足不满足条件,都打印出来。当条件不满足时,左表空缺的记录使用NULL来补位
下面用右外连接的方式连接两个表:
SELECT 左表.列名A, 左表.列名B, 右表.列名D
FROM 左表 别名L RIGHT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
将指定列补位的NULL替换为指定内容
SELECT IFNULL(左表.列名A, '替换内容') AS 列别名, 左表.列名B, 右表.列名D
FROM 左表 别名L RIGHT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
MySQL是不支持全外的连接的,但是可以通过左外和右外求合集来获取全外连接的查询结果.
下面用全外连接的方式连接两表:
--MySQL的语法
SELECT 左表.列名A, 左表.列名B, 右表.列名D
FROM 左表 别名L LEFT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
UNION
SELECT 左表.列名A, 左表.列名B, 右表.列名D
FROM 左表 别名L RIGHT OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
--标准SQL语法
SELECT 左表.列名A, 左表.列名B, 右表.列名D
FROM 左表 别名L FULL OUTER JOIN 右表 别名R
ON 别名L.列名C = 别名R.列名E
这种连接查询没有存在的价值。自然连接就是系统自动做筛选工作。
SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx = 别名2.xx
SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx = 别名2.xx
SELECT * FROM 表1 别名1 NATURAL FULL OUTER JOIN 表2 别名2 ON 别名1.xx = 别名2.xx
错误查询示例:聚合函数使用错误
SELECT* FROM emp WHERE sal=MAX(sal);
正确查询示例:使用子查询
SELECT* FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
FROM后
SELECT b.列名1, b.列名2
FROM (SELECT * FROM 表A WHERE 筛选条件) 子查询生成的表的别名b
WHERE 筛选条件
WHERE后
子查询语句作为父查询语句的筛选条件。
语法格式:
SELECT *FROM 表1 别名1 WHERE 列1 [ =>, >, <, <=, = ] (SELECT 列 FROM 表2 别名2 WHERE 条件)
示例:查询本公司工资大于公司平均工资的员工
SELECT * FROM emp WHERE sal > ( SELECT AVG(sal) FROM emp)
语法格式:
SELECT * FROM表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 EROM 表2 别名2 WHERE 条件)
示例:打印本公司工资高于30部门所有员工工资的员工详细信息
SELECT * FROM emp WHERE sal >ALL( SELECT sal FROM emp WHERE deptno=30 )
示例:打印本公司工资高于任意一名经理工资的员工详细信息
SELECT * FROM emp WHERE sal >ANY( SELECT sal FROM emp WHERE job='经理' )
语法格式:
SELECT * FROM 表1 别名1 WHERE (列1,列2) IN(SELECT 列1,列2 FROM 表2 别名2 WHERE 条件)
示例:
SELECT * FROM emp WHERE (job, deptno,sal) IN ( SELECT job, deptno, sal FROM emp WHERE ename='殷天正' )
语法格式:
SELECT *FROM 表1 别名1, (SELECT ....) 别名2 WHERE 筛选条件
本篇笔记示例中使用的数据库的表:
CREATE TABLE emp (
empno NUMERIC(4) NOT NULL,
ename VARCHAR(10),
job VARCHAR(9),
mgr NUMERIC(4),
hiredate DATETIME,
sal NUMERIC(7, 2),
comm NUMERIC(7, 2),
deptno NUMERIC(2)
);
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
INSERT INTO emp VALUES (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, NULL, 20);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20);
INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);
CREATE TABLE dept (
deptno NUMERIC(2),
dname VARCHAR(14),
loc VARCHAR(13)
);
INSERT INTO dept VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES (40, 'OPERATIONS', 'BOSTON');
CREATE TABLE bonus (
empno NUMERIC(4),
job VARCHAR(9),
sal NUMERIC,
comm NUMERIC
);
CREATE TABLE salgrade (
grade NUMERIC,
losal NUMERIC,
hisal NUMERIC
);
INSERT INTO salgrade VALUES (1, 700, 1200);
INSERT INTO salgrade VALUES (2, 1201, 1400);
INSERT INTO salgrade VALUES (3, 1401, 2000);
INSERT INTO salgrade VALUES (4, 2001, 3000);
INSERT INTO salgrade VALUES (5, 3001, 9999);