1、MySQL的部署结构
服务器端:服务存储/维护数据 要确保3306不被占用 mysqld.exe
客户端:负责向服务端发起增删改差 mysql.exe
2、使用客户端连接服务器端
mysql.exe -h127.0.0.1 -P3306 -uroot -p
-h host 主机ip或域名
-P port 端口
-u user 用户
-p password 密码
mysql -uroot
注意:连接的时候不能在结尾加分号
3、MySQL常用管理命令
quit; 退出服务器连接
show databases: 显示服务器上当前所有数据库
use 数据库名; 进入指定的数据库
show tables; 显示当前数据库中所有的数据库表
desc 表名; 描述表中有哪些列
4、SQL命令
SQL:结构化查询语言,用于操作关系型数据库,主要是对数据库进行增删改查等操作
SQL命令的两种执行方式:
(1)交互模式:适用于临时性的查看数据
(2)脚本模式:适用于批量操作数据
不能进入MySQL
mysql -uroot <脚本路径名
5、SQL语法规范
(1)每条SQL命令可以跨越多行遇到英文分号结束
(2)假如某一条命令出现语法错误,则该语句及后面的语句都不会再执行
(3)SQL命令不区分大小写,习惯上关键字用大写,非关键字用小写
(4)SQL中可以使用单行注释(#),也可以使用多行注释(/**/)
6、常用的SQL命令
(1)丢弃指定的数据库xuezi,如果存在
DROP DATABASE IF EXISTS xuezi;
(2)创建新的数据库xuezi
CREATE DATABASE xuezi;
(3)进入数据库xuezi
USE xuezi;
(4)创建保存学生数据的表(编号、姓名、性别、分数)
CREATE TABLE student(
sid INT,
name VARCHAR(8), #字符串类型 可变的字符
sex VARCHAR(1), #m->男,f->女
score INT
);
(5)往学生表中插入数据
INSERT INTO 表名 (字段列表) VALUES(值列表);
INSERT INTO student VALUES('1','tom','m','66');
INSERT INTO student VALUES('2','cat','f','86');
INSERT INTO student VALUES('3','kang','m','55');
(6)查询所有的数据
SELECT * FROM student;
(7)修改数据,修改编号为2的学生,姓名改为Lucy,成绩改为100
UPDATE student SET name='Lucy',score='100' WHERE sid='2';
(8)删除编号为3的学生的数据
DELETE FROM student WHERE sid='3';
7、标准SQL命令分类
DDL:定义数据结构
CREATE/DROP/ALTER
DML:操作数据
INSERT/UPDATE/DELETE
DQL:查询数据
SELECT
DCL:控制用户权限
GRANT(授权)/ REVOKE(收权)
8、MySQL中的列类型
创建数据表的时候,指定的列可以存储的数据类型
CREAT TABLE book(bid 列类型)
(1)数值类型——引号可加可不加
TINYINT微整型,占一个字节,范围-128~127
SMALLINT 小整型,占两个字节,范围-32768~32767
INT 整型,占四个字节
BIGINT 大整型,占八个字节
FLOAT(M,D) 单精度浮点型,占四个字节 M表示总的有效位数,D代表小数点后的有效位数
DOUBLE(M,D) 双精度浮点型,占八个字节
DECIMAL(M,D) 定点小数,不会产生计算误差
BOOL 布尔型,只有两个结果TRUE、FALSE(不能加引号),真正存储时自动变成1、0
(2)日期时间类型——必须加引号
DATE 日期型
TIME 时间型
DATETIME 日期时间型
(3)字符串类型——必须加引号
VARCHAR(M) 变长字符串,不会产生空间浪费,操作速度相对较慢,M最大65535
CHAR(M) 定长字符串,M最大255
TEXT(M) 大型边长字符串,M最多2G
9、列约束
MySQL可以对插入的数据进行特定的验证,只有满足条件的才允许插入到数据表中,否则被认为是非法插入
(1)主键约束——PRIMARY KEY
声明了主键约束的列上不能出现重复的值,表中查询的记录会按照从小到大排序,——加快查找速度;通常主键添加到编号列上。注意:一个表中只能有一个主键,主键列上不允许插入NULL。
(2)非空约束——NOT NULL
声明了非空约束的列上不允许插入NULL。
(3)唯一约束——UNIQUE
声明了唯一约束的列不能插入重复的值,但是可以插入重复的NULL.注意:NULL比较特殊,他和任何值都不相等,包括他自己。
(4)检查约束——CHECK
可以对插入的数据进行自定义验证
CREAT TABLE student(
score TINYINT CHECK(score>=0 AND score<=100)
);
MySQL中不支持插入约束,会降低数据的插入速度。
(5)默认值约束——DEFAULT
可以使用DEFAULT关键字声明默认值,有两种方式可以使用默认值
INSERT INTO laptop_family VALUES(50,'华硕',DEFAULT);
INSERT INTO laptop_family(fid,fname) VALUES(60,'神州');
(6)外键约束——FOREIGN KEY
声明了外键约束的列上,取值必须在另一个表的主键列上出现过。两者的列类型要保持一致,允许使用MULL,
FOREIGN KEY(外键列) REFERENCES 另一数据表(主键列);
10、MySQL中的自增列
AUTO_INCREMENT:自动增长,假如一个列声明了自增列,无需手动赋值,直接赋值为NULL,会获取当前的最大值,自动加1.。注意:只适用于整型的列上,并且自增列允许手动赋值
11、简单查询
(1)查询特定的列
例:查询所有员工的姓名、生日
SELECT ename,birthady FROM emp;
(3)给列起别名
例:查询所有员工的 姓名、工资,使用中文别名
SELECT ename AS 姓名,salary AS 工资 FROM emp; # 在起别名的时候,AS关键字可以省略
(4)显示不同的记录/合并相同的记录
例:查询出都有哪些性别的员工
SELECT DISTINCT SEX FROM emp;
(5)查询时执行计算
例:2+3-4+5*6/3
SELECT 2+3-4+5*6/3;
例:查询所有员工的姓名及年薪
SELECT ename,salary*12 FROM emp;
(6)查询结果集排序
例:所有部门表数据,要求结果集按照从小到大排序
SELECT * FROM dept ORDER BY did ASC; # 升序排列
例:所有部门表数据,要求结果集按照从大到小排序
SELECT * FROM dept ORDER BY did DESC; # 降序排列
例:查询员工所有列,结果按照工资降序排列,如果工资相同,按照姓名升序排列
SELECT * FROM emp ORDER BY salary DESC,ename;
# ORDER BY可以按照数值、字符串、日期时间排序,默认是按照升序排列(ASC)。
(7)条件查询
例:查出编号为5的员工所有列
SELECT * FROM emp WHERE eid=5;
例:查出没有明确部门的员工的所有列
SELECT * FROM emp WHERE deptid IS NULL;
例:查出有明确部门的员工的所有列
SELECT * FROM emp WHERE deptid IS NOT NULL;
例:查出工资在6000以上所有男员工的列
SELECT * FROM emp WHERE salary>=6000 AND sex=1;
例:查询工资在7000~10000之间的员工的所有列
SELECT * FROM emp WHERE salary BETWEEN 7000 AND 10000;
例:查询工资不在7000~10000之间的员工的所有列
SELECT * FROM emp WHERE salary NOT BETWEEN 7000 AND 10000;
SELECT * FROM emp WHERE salary<7000 OR salary>10000;
例:查询出20号和30号部门员工的所有的列
SELECT * FROM emp WHERE deptid IN(20,30);
例:查询出不在20号和30号部门员工的所有的列
SELECT * FROM emp WHERE deptid NOT IN(20,30);
IS NULL/IS NOT NULL
AND/OR
BETWEEN AND / NOT BETWEEN AND
IN()/NOT IN()
(8)分页显示
加入查询的结果集有太多的数据,一次显示不完,可以使用分页显示。
需要两个条件:当前的页码,每页的数据条数
每页的开始=(当前的页码-1)*每页数据量
SELECT * FROM emp LIMIT start count; # start:每页的开始,count:每页的数据量
(9)模糊查询
例:查询出姓名中含有字母e的员工的所有列
SELECT * FROM emp WHERE eneme LIKE '%e%';
例:查询出姓名中倒数第二个字母为e的员工的所有列
SELECT * FROM emp WHERE eneme LIKE '%e_';
SQL中提供了两个模糊查询字符
% 可以匹配任意个字符 >=0
_ 可以匹配任意1个字符 =1
注意在模糊查询中必须是用关键字LIKE,不能使用=
例:查询出姓名中以字母e结尾的员工的所有列
SELECT * FROM emp WHERE eneme LIKE '%e';
12、复杂查询
(1)聚合查询/分组查询
聚合函数:
COUNT() 总数量
SUM() 总和
AVG() 平均
MAX() 最大
MIN() 最小
例:查询出所有员工的数量
SELECT COUNT(eid) FROM emp;
SELECT COUNT(*) FROM emp; # 推荐写法
例:查询所有男员工的数量
SELECT COUNT(*) FROM emp WHERE sex=1;
例:查出所有员工的工资总和
SELECT SUN(salary) FROM emp;
例:查出所有员工的平均工资
SELECT AVG(salary) FROM emp;
分组查询:
只能查询分组条件和聚合函数
YEAR() 获取日期中的年份
MONTH() 获取日期中的月份
例:查询男女员工的平均工资,最高工资
SELECT sex,AVG(salary),MAX(salary) FROM emp GROUP BY sex;
例:查询1993年出生的员工的所有列
SELECT * FROM emp WHERE YEAR(birthday)=1993;
(2)子查询
把一个SQL语句的查询结果作为另一个SQL语句的查询条件
例:查询出研发部员工所有的列
# 步骤1:查询出研发部的部门编号
SELECT did FROM dept WHERE dname='研发部';
# 步骤2:根据研发部部门编号查询员工
SELECT * FROM emp WHERE depid=10;
# 综合:
SELECT * FROM emp WHERE depid=(SELECT did FROM dept WHERE dname='研发部');
(3)多表查询
例:查询所有员工姓名及其部门名称。
SELECT ename,dname FROM emp,dept; # 错误:笛卡尔积
多表查询如何避免笛卡尔积:添加查询条件
SELECT ename,dname FROM emp,dept WHERE deptid=did;
(上述为SQL-92语法,查询中无法查出没有部门的员工和没有员工的部门)
a、内连接 INNER JOIN...ON和SQL92结果一致
SELECT ename,dname FROM emp INNER JOIN dept ON deptid=did;
b、左外连接 LEFT OUTER JOIN...ON查询结果是左侧所有的记录都显示,OUTER可以省略
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptid=did;
c、右外连接
SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptid=did;
d、全连接 FULL JOIN ON 显示左右的所有记录——MySQL不支持
UNION 合并相同的项
UNION ALL 不合并相同的项
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptid=did) UNION (SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptid=did;
注:个人整理,若有错误,欢迎批评指正,期待共同进步。