目录
一.常见资料 :
二.MySQL 管理命令
三.数据库的三层结构—破解MySQL神秘
四,创建数据库
五.MySQL 常用数据类型
数值型(整数)的基本使用
数值型(bit) 的使用
数值型(小数)的基本使用
字符串的基本使用
字符串使用细节
日期类型的基本使用
六.修改表——基本介绍
使用 ALTER TABLE 语句追加,修改,或删除列的语法
修改表名 Rename table 表名 to 新表名
七.数据库C[create] R [read] U [update] D [delete] 语句
Insert 语句
update 语句
delete语句
select 语句
合计/统计函数 - count
合计函数 sum
合计函数 -avg
合计函数 Max - min
select 语句
使用group by 字句对列进行分组[先创建测试表]
一.常见资料 :
服务:mysqld 端口:3306 主配置文件: /etc/my.cnf 初始化脚本:mysql_install_db
启动命令: mysqld_safe 数据目录:/var/lib/mysql
套接字文件:/var/lib/mysqld/mysqld.pid
当以外关闭数据库时,在开启时假设如果开启不了,找到这个,删除在启动
进程文件:/var/run/mysqld/mysqld.pig
MySQL 登录及推出命令
设置密码: mysqladmin -uroot password '123456'
登录:mysql -u 用户名 -p 密码 -p 端口 -s 套接文字文件
-p 用户登录密码
-h 登录位置 主机名 或 ip 地址
-p 端口号
-s 嵌接文字文件 (/var/lib/mysql/mysql.sock)
退出命令:exit 或 ctrl+d
二.MySQL 管理命令
1.创建登录用户
mysql>create user zhangsan@ '%' identified by '123456';
% 指任意的远程终端
2.测试用户登录
# yum -y install mysql
# mysql -uzhangsan -p 123456 -h 192.168.88.10
3.用户为自己更改密码
mysql>set password=password('123456’);
4.root 用户为其他用户找回密码
mysql> set password for zhangsan @'%' =password('123456');
三.数据库的三层结构—破解MySQL神秘
- 所谓安装MySQL数据库,就是在主机安装一个数据库管理系统(DBMS)这个管理类程序可以管理多个数据库。
- 一个数据库中可以创建多个表,以保存数据(信息)
- 数据库管理系统(DBMS)数据库和表的关系如下
SQL语句分类
- DDL 数据库定义语句 [create 表,库]
- DML 数据库操作语句 [增加,修改,删除]
- DQL 数据库查询语句 [select]
- DCL 数据库控制语句 [管理数据库]
四,创建数据库
语法
CREAT DATABASE [IF NOT EXISTS] db_name
[creat_specification[,creat_specification]...]
creat_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
CHARACTER SET: 指定数据采用的字符集,如果不指定字符集,默认utf-8
COLLATE 指定数据库字符集的校对规律(常用的 utf8_bin ,utf8_general_ci 注意默认是utf8_general_ci) [举例说明 database.sql 文件]
五.MySQL 常用数据类型
数值型(整数)的基本使用
使用规范:在能够满足需求的情况下,尽量选择占用空间小的类型
数值型(bit) 的使用
1.基本使用
mysql > creat table t02 (num bit(8));
mysql > insert into t02(1,3);
mysql > insert into t02 values(2,65);
2.细节说明 bit.sql
- bit 字段显示时,按照 位的方式显示
- 查询的时候任然可以用使用 添加的数值
- 如果一个值只有 0,1 可以考虑使用 bit(1) 可以节省空间
- 位类型 M 指定位数 默认值1 范围 1-64
- 使用不多
数值型(小数)的基本使用
1.FLOAT/DOUBLE [ UNSIGNED] Float 单精度精度 Double 双精度
2.DECIMAL[M,D] [UNSIGNED]
- 可以支持更加精确的小数位。m是小数位(精度)的总数 D是小数点(标度)后面的数字
- 如果D 是 0 ,则值没有小数点或分数部分。M最大是 65 D 最大 30 如果D 被省略,默认是10
- 建议:如果希望小数的精度高,推荐使用 decimal
字符串的基本使用
- CHAR(size) 固定长度字符串 最大 255 字节
- VARCHAR(size) 0-65535 可变长度字符串 最大65532 字节 【utf8 编码最大 21844字符 1-3个 字节用于记录字段大小】 gbk 编码两个字符代表一个字节
字符串使用细节
细节1 charVarcharDetaik.sql
cahr(4) // 这个4表示字符数(最大255),不是字符数,不管是中文还是字母都是四个,按位符计算。
varchar(4) //这个表示字符数,不管是字母还是中文都以定义好的编码来存放数据
不管是 中文还是英文字母,都是最多存放4个,是按照字符来存储的。
细节2
char(4) 是定长,就是说,即使你插入 'aa' 也会占用 分配4个字符的空间。varchar(40 是边长,就是说,如果你插入了'aa',实际占用空间大小并不是4个字符,而是按照实际占用的空间来分配L(实际数据大小)+ (1~3)字节
细节3
什么时候使用char 什么时候使用varchar
- 如果数据是定长,推荐使用char 比如md5的密码,邮箱,手机号,身份证号码等 char(32)
- 如果一个字段的长度不确定,我们使用varchar 比如留言,文章
- 查询速度 char>varchar
细节4
在存放文本时,也可以使用text 数据类型,也可以将TEXT 列视为VARCHAR 列 注意Text 不能有默认值,大小0-2^16 字节 如果希望存放更多字符,可以选择 MEDIUMTEXT 0~2^24 或者 LONGTEXT 0-2^32
日期类型的基本使用
CREATE TABLE t14 (
birthday DATE, -- 生日
jobtime DATETIME, -- 记录年月日 时分秒
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
#DROP TABLE T14;
-- 登录时间,如果需要login_time 如果需要login_time 列自动更新,需要配置
-- NOT NULL DEEAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
SELECT * FROM t14;
INSERT INTO t14(birthday, jobtime) -- 如果不指定 login_time 时间会显示当前的时间戳
VALUES('2023-9-24','2023-9-24 10:10:10');
-- 如果我们跟新了 t14 的某条记录 longin_time 列会自动的以当前时间进行更新
创建练习
#创建表的练习
CREATE TABLE `emp` (
id INT,
`name` VARCHAR(32),
sex CHAR(1),
brithday DATE,
entry_date DATETIME,
job VARCHAR(32),
salary DOUBLE,
`resume` TEXT ) CHARSET utf8 COLLATE utf8_bin ENGINE INNODB;
INSERT INTO `emp`
VALUES (100, 'tian','男','2000-11-11','2010-11-10 11:11:11','xunshan','3000',
'大王叫我来巡山');
SELECT * FROM `emp`;
六.修改表——基本介绍
使用 ALTER TABLE 语句追加,修改,或删除列的语法
#添加列
ALTER TABLE tablename
ADD (column datatype [DEFAULT expr]
[,column datatype]...);
#修改列
ALTER TABLE tablename
MODIFY (column datatype [DEFAULT expr]
[,column datatype]...);
#删除列
ALTER TABLE tablename
DROP (column);
查看表的结构: desc 表名; -- 可以查看表的列
修改表名 Rename table 表名 to 新表名
修改表字符集: alter table 表名 character set 字符集;
练习
# 修改表的操作
-- 员工表 emp 的上增加一个 image 列 varchar 类型 要求在resume 后面
ALTER TABLE emp
ADD image VARCHAR(32) NOT NULL DEFAULT ''
AFTER RESUME
DESC emp; -- 显示表结构 可以显示查看表的所有列(字段)
-- 修改 job 列 使其长度位60
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT ''
DESC emp;
-- 删除 sex 列
ALTER TABLE emp
DROP sex;
DESC emp;
-- 修改表名
RENAME TABLE emp TO employee;
DESC employee;
-- 修该字符集
ALTER TABLE employee CHARACTER SET utf8;
-- 列名 name 修该 位user_name
ALTER TABLE employee
CHANGE `name` user_name VARCHAR(32) NOT NULL DEFAULT '';
DESC employee;
七.数据库C[create] R [read] U [update] D [delete] 语句
Insert 语句
使用 insert 语句向表中插入数据 insert.sql
INSERT INTO table_name [(column [, column ... ])]
VASLUES (value[,value...]);
#说明 insert 语句的细节
-- 1.插入的数据应与字段得到数据类型相同
-- 比如 把‘abc' 添加到 int 类型会错误
INSERT INTO goods (id,goods_name,price)
VALUES(30,'小米手机',20000);
-- 2.数据的长度在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
INSERT INTO goods (id,goods_name,price)
VALUES('40','vivo手机',30000);
-- 3.在values 中列出的数据位置必须与被加入的列的排列位置相对应
INSERT INTO goods (id,goods_name,price)
VALUES('vivo','40',30000);
-- 4.字符和日期型数据应该包含到单引号中
INSERT INTO goods (id,goods_name,price)
VALUES(40,vivo,3000);
-- 5.列可以插入空值[前提是字段允许为空] insert into table value(null)
INSERT INTO goods (id,goods_name,price)
VALUES ('50','vivo',NULL); -- 如果定义的时候 没有not null 那么可以为空
-- 6.insert into tab_name (列名 ..) values (),(),() 新式添加多条记录
INSERT INTO goods(id,goods_name,price)
VALUES (60,'三星手机',4000),(70,'苹果手机', 18000);
SELECT *FROM goods;
-- 7.如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO goods
VALUES(40,'vivo', 4000);
-- 8.默认值的使用 当不给某个字段值的时,如果有默认值就会添加默认值,否则会报错
-- 如果某个列,没有指定 not null 那么当添加数据时,没有给定值,则会默认给null
-- 如果希望指定某个列的默认值,可以在创建表的时候指定 not null defult 100
INSERT INTO goods (id,goods_name)
VALUES (80,'格力手机')
SELECT * FROM goods;
update 语句
使用update 语句修改表中的数据
UPDATE tbl_name
SET col_name1=expr1[,col_name2=expr2...]
[WHERE where_definition]
update 语句 使用细节
- update 语法可以用新值更新原有表行中的各列
- set 子句指示要求修改那些列和要给予那些值
- where 子句指定应应更新那些行,如果没有where字句 则更新所有的行
- 如果要修改多行字段,可以通过 set 字段1 = 值1,字段2 = 值2...
# update语句 演示
-- 在上面创建的employee 表中修改表中的记录
UPDATE employee SET salary = 5000; #[如果没有带where 条件 ,会修改所有的记录]
-- 2.将姓名为tian 的员工薪水改为3000
UPDATE employee
SET salary = 3000
WHERE user_name = 'tian';
-- 3. 将老妖怪的薪水在原有的基础上增加1000
INSERT INTO employee
VALUES ( 200,'老妖怪','1990-11-11','2000-11-11 10:10:10','捶背',5000,'给大王捶背','d:\\a.jpg');
UPDATE employee
SET salary = salary + 2000
WHERE user_name = '老妖怪';
-- 可以修改多个列
UPDATE employee
SET salary = salary + 1000, job = '法师'
WHERE user_name = 'tian';
SELECT * FROM employee;
delete语句
使用delete 语句删除表中数据
delete from tab_name
[WHERE where_definition]
delete 语句使用细节
- 如果不适用where字句,将删除表中所有数据
- Delete 语句不能删除某一列的值 (可使用 update 设为 null 或者 ‘’)
- 使用 delete 语句仅删除记录,不删除表本身。如果要删除表,使用drop table 语句。drop table 表名;
修改表名 rename table xxx to xxx
select 语句
基本语法
SELECT [DISTINCT] * | {column1,column2,column3...}
FROM tablename;
注意事项
- select 制定查询那些列的数据
- column 指定列名
- * 号代表查询所有列
- from 指查询那张表
- DISTINCT 可选,指定显示结果时,是否去掉重复的数据
使用表达式对查询的列进行运算
SELECT *| {column | expression,column2 | expression, ......}
FROM tablename;
在select 语句中可以使用as 语句
SELECT column_name as 别名 from 表名;
-- select 语句的使用
-- 统计每个学生的总分
SELECT `name`,(chinese+english+math) FROM student;
-- 在所有的学生总分上面加十分
SELECT `name`,(chinese + english + math + 10) FROM student;
-- 使用别名表示学生分数
SELECT `name` AS '名字',(chinese + english + math + 10 ) AS total_score FROM student;
在where 字句中经常使用的运算符
-- 使用 select 语句
-- 查询姓名为赵勇的学生成绩
SELECT * FROM student
WHERE `name` = '赵云';
-- 查询英语成绩大于90分的同学
SELECT * FROM student
WHERE english >= 90;
-- 查询总分大于200分的同学
SELECT * FROM student
WHERE (english + math + chinese) > 200;
-- 查询 math 大于60 并且 id 大于90的学生成绩
SELECT * FROM student
WHERE (math > 60) AND (id > 4);
-- 查询英语成绩大于语文成绩的同学
SELECT * FROM student
WHERE English > chinese;
-- 查询总分大于200 并且 数学成绩小于语文成绩 的姓韩的同学 '韩%'
SELECT * FROM student
WHERE (chinese + math + english) > 200 AND (math < chinese) AND `name` LIKE '赵%';
-- 查询 英语成绩在八十到就是分之间的同学
SELECT * FROM student
WHERE 80 < english AND english < 90;
SELECT * FROM student
WHERE english BETWEEN 84 AND 85;
-- 查询数学分为 89 90 91的同学
SELECT * FROM student
WHERE math = 89 OR math = 90 OR math = 91;
SELECT * FROM student
WHERE math IN (89,90,91);
-- 查询所有姓李的学生成绩
SELECT * FROM student
WHERE `name` LIKE '韩%';
-- 查询数学分>80 语文 > 80 的同学
SELECT * FROM student
WHERE math > 80 AND chinese >80 ;
使用select 不要 子句排序查询结果
SELECT column1,column2,column3...
FROM table;
order by column asc|desc, ...
- 使用order by 指定排序的列,排序的列既可以是表中的列名,也可以时select语句后指定的列名
- Asc 升序[默认] Desc 降序
- ORDER BY 字句位于SELECT 语句的结尾
-- 演示 order by 使用
-- 对数学成绩排序后输出 [升序] asc
SELECT * FROM student
ORDER BY math;
-- 对总分按照从高到底的顺序输出 [降序] desc
SELECT `name`, (math + chinese + english) AS total_score FROM student
ORDER BY total_score DESC;
-- 对姓名性李的学生成绩(总分)排序
SELECT `name`,(math +chinese + english) AS total_score FROM student
WHERE `name` LIKE '韩%'
ORDER BY total_score;
合计/统计函数 - count
count 返回行的总数
select count(*) | count(列名) from tablename
[WHERE where_definition]
-- 演示 MySQL 中的统计函数
-- 统计一个班级里面有多少学生
SELECT COUNT(*) FROM student;
-- 统计 数学成绩大于90 的学生有多少
SELECT COUNT(*) FROM student
WHERE math >= 90;
-- 统计总分大于 250 的人数有多少
SELECT COUNT(*) FROM student
WHERE (math + english + chinese) > 250;
-- 解释 count(*) 返回满足条件的记录的行数
-- count(列) 统计满足条件的某列有多少个 但是会排除为空的情况、
CREATE TABLE t15 (
`name` VARCHAR(20));
INSERT INTO t15 VALUES('tom');
INSERT INTO t15 VALUES('jack');
INSERT INTO t15 VALUES('mary');
INSERT INTO t15 VALUES (NULL);
SELECT * FROM t15;
SELECT COUNT(*) FROM t15; -- 4
SELECT COUNT(`name`) FROM t15;
合计函数 sum
Sum 函数返回满足where 条件的行的和 一般使用在数值列
Select sum(列名) {,sum(列名)... } from tablename
[WHERE where_definition]
sum 仅对数值起作用,没有意义。 对多列求和, “,” 不能少
-- sum 函数的使用
-- 演示一个班级的语文成绩的和
SELECT SUM(math) FROM student;
-- 统计一个班级的语文 数学英语 各科成绩的总和
SELECT SUM(math), SUM(chinese),SUM(english) FROM student;
-- 统计班级语文 英语 数学 的成绩综合
SELECT SUM(math) + SUM(chinese) + SUM(english) FROM student;
-- 统计一个班级的语文的平均分数
SELECT AVG(chinese) FROM student;
SELECT SUM(chinese) / COUNT(*) FROM student;
合计函数 -avg
AVG 函数 返回满足where 条件的一列的平均值
SELECT avg(列名) { ,avg(列名)... } from tablename
[ WHERE where——defininition]
-- 演示 avg 的使用
-- 求一个班级数学平均分
SELECT AVG(math) FROM student;
-- 求一个班级总平均分
SELECT AVG(math + english + chinese) FROM student;
合计函数 Max - min
Max/min 函数返回满足where 条件的一列的最大/最小值
select max(列名) from tablename
[WHERE where_definition]
-- max/min 的使用
SELECT MAX(math) FROM student;
SELECT MIN(math + chinese + chinese) FROM student;
select 语句
使用group by 字句对列进行分组[先创建测试表]
SELECT cloumn1,column2,column3 .. FROM table
group by column
使用 having 字句对分组后的结果进行过滤文章来源:https://uudwc.com/A/Evk4Y
SELECT cloumn1,cloumn2,column3...
FROM table
group by column having...
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
);
INSERT INTO dept
VALUES(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');
SELECT * FROM dept;
-- 添加 一个员工表
#创建表EMP雇员
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED ,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) ,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
);
-- 添加测试数据
INSERT INTO emp VALUES(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30),
(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),
(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30),
(7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10),
(7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20),
(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30),
(7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30),
(7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20),
(7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);
SELECT * FROM emp;
-- 工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /* 工资级别 */
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资*/
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工工资 */
);
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);
SELECT * FROM salgrade;
# 演示group by + having
-- group by 用于对查询的结果分组统计
-- 如何显示每个部门的平均工资和最高工资 avg(sal) max(sal)
-- 按照部门来分组查询
SELECT AVG(sal), MAX(sal),deptno
FROM emp GROUP BY deptno;
-- 显示每个部门的每种岗位的平均工资和最底工资
-- 1.显示每个部门的平均工资和最低工资
-- 2.显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal), MIN(sal),deptno
FROM emp GROUP BY deptno;
SELECT AVG(sal), MIN(sal),deptno,job
FROM emp GROUP BY deptno,job;
-- 显示平均工资低于两千的部门和他的平均工资 //别名
-- 写sql 语句的思路是 化繁为简 各个击破
-- 1.显示各个部门的平局工资和部门号
-- 2.在1 的结果基础上,进行过过滤,保留 avg(sal) < 2000
-- 3.使用别名进行过滤
SELECT AVG(sal),deptno
FROM emp GROUP BY deptno
HAVING AVG(sal)<2000;
SELECT AVG(sal) AS avg_sal,deptno
FROM emp GROUP BY deptno
HAVING avg_sal< 2000;
文章来源地址https://uudwc.com/A/Evk4Y