mysql基础操作入门
- 数据库的介绍
- 下面是相关数据库操作:
- 创建用户并分权限
数据库的介绍
数据库是什么,怎么玩?简单介绍一下~
1.数据库(Database)是按照数据结构来组织、存储和管理数据的仓库(db和dbms)
2.数据库的分类:即关系型数据库和非关系型数据库。而我们今天来说的Mysql就是典型的关系型数据库
关系型数据库:oracle、mysql、sql server等
非关系型数据库:redis mongodb等
1>关系型数据库的特点:将数据保存在不同的表中,再将这些表放入数据库中,而不是将所有数据统一放在数据库里。
2>优点:这样不仅增加了Mysql的读取速度,灵活性和可管理型也得到了很大的提高,访问以及管理Mysql数据库的最常用标准化语言为SQL结构化查询的语句,进而让数据持久化存储在硬盘中;
这样用图形能更形象描述出关系型数据库的特点,我们理解起来也方便多了,不用纠结那么长的概念了。
3.关系型数据库的设计规则:遵循ER模型和三范式
1>ER模型:
E | entity|代表实体的意思 |对应到数据库当中的一张表
-------- | —
R | relationship|代表关系的意思
2>三范式:1、列不能拆分 2、唯一关系主键 3、不能传递依赖
下面是相关数据库操作:
mysql -uroot -p 密码
sudo service mysql restart # 重启mysql服务
~ 数据库操作
SHOW DATABASES; # 查看所有
CREATE DATABASE IF NOT EXSIT 数据库名; # 如果不存在则创建 后面加charset=utf8中文
SHOW CREATE DATABASE 数据库名; # 查看某个数据库的定义信息
DROP DATABASE 数据库名; # 删除
USE 数据库名; # 切换
~ 表结构语句 列名=字段
CREATE TABLE 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
类型:ENUM('男','女') # 枚举类型
DECIMAL(5,2) # 浮点字类型,意思长度5,小数点后2位
CREATE TABLE sort (
sid INT UNSIGNED, #分类ID
sname VARCHAR(100) #分类名称
)CHARSET=utf8;
约束语句有:primary key主键,default默认值,unique唯一,not null非空,foreign key外键.
ALTER TABLE 表名 DROP PRIMARY KEY; # 删除主键
ID INT UNSIGNED PRIMARY KEY AUTO_INCREMENT; # 主键自增长
SHOW TABLES; # 查看所有表
DESC 表名; # 查看表结构
SHOW CREATE TABLE 表名; # 查看建表语句
DROP TABLE 表名; # 删除表
ALTER TABLE 表名 DROP 列名; # 删除列
RENAME TABLE 表名 TO 表名; # 修改表名
ALTER TABLE 表名 CHARACTER SET 字符集; 修改表字符集
ALTER TABLE 表名 CHANGE 列名 新列名 列类型 约束; # 修改列名 modify修改属性不该列名
ALTER TABLE 表名 ADD 列名 列类型 约束; # 添加列
~ DML操作 insert,update,delete
INSERT INTO 表名 (列名1, 列名2...)VALUES(列值1,列值2...);
UPDATE 表名 SET 列名1=列值1,列名2=列值2... WHERE 列名=值;
DELETE FROM 表名 WHERE 列名=值;
~ DQL操作 查询语言
SELECT * FROM 表名; # 查看表所有数据
SELECT DISTINCT * FROM 表名; # distinct表示去重操作
SELECT 列名1,列名2.. FROM 表名;
SELECT * from 表名 where 条件=值 and 条件=值; # 或者是or
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003'); # in是这些,not in是不是这些条件
SELECT * FROM stu WHERE age>=20 AND age<=40; # 区间,等同于 age between 20 and 40;
SELECT * FROM stu WHERE gender!='男'; # 非男性,还有gender<>'男', NOT gender='男'
SELECT * FROM stu WHERE name IS NOT NULL; # 非空,或者WHERE NOT name IS NULL
~~模糊查询:通配符_匹配任意一个字符,%任意0-n个字符
SELECT * FROM stu WHERE name LIKE'_____'; # 这里打了几个_就是几个字符
SELECT * FROM stu WHERE name LIKE'__i'; # 意思是第三个字母为i的记录
SELECT * FROM stu WHERE name LIKE'Z%'; # 查询以z开头的记录
SELECT * FROM stu WHERE name LIKE'%a%'; # 查询包括a的记录
~~字段控制查询:GROUP BY,HAVING,ORDER BY,LIMIT START,COUNT # 这几个学习
执行顺序:
FROM 表名,
WHERE,
GROUP BY,
SELECT DISTINCT *,
HAVING,
ORDER BY,
LIMIT START,
COUNT
SELECT DISTINCT name FROM stu; # 去重查询
~~排序 order by # 排序desc是降序,asc是升序,默认升序
SELECT * FROM stu WHERE height BETWEEN 150 AND 170 ORDER BY height DESC;
数据库保存为文件:
mysqldump -uroot -p 数据库名 > name.sql # 在要保存的路径操作保存即可
mysqldump -uroot -p 数据库名 < name.sql # 读取
聚合函数(对查询的结果做操作):MAX MIN AVG SUM COUNT等
SELECT COUNT(*) FROM stu; # 个数
SELECT MAX(height) FROM stu; # 查找身高最高
ROUND(数据,2) # 表示几位小数
分组group by
SELECT MAX(height) FROM stu GROUP BY gender; # 当前的性别组身高最高的分别是
SELECT gender,GROUP_CONCAT(name,'_',height) FROM stu GROUP BY gender; # 按性别分组,GROUP_CONCAT里面是要显示的内容,中间可以分隔符
SELECT gender,AVG(height) FROM stu GROUP BY gender; # 按性别算平均身高
分组之后的条件筛选
SELECT gender FROM stu GROUP BY gender,height HAVING gender!='男' and height>160;
SELECT gender,GROUP_CONCAT(name,'_',height) FROM stu GROUP BY gender HAVING AVG(height)>160; # HAVING后面筛选的是已经分组的
分页
SELECT * FROM stu LIMIT 3,3; # 分页,1,3从1开始,共3条
链接查询 多表连接成集合
SELECT * FROM 表一 INNER JOIN 表二 ON 表一的字段=表二的字段
SELECT * FROM student INNER JOIN classes ON student.cls_id=classes.id;
SELECT student.id,student.name,classes.name FROM student INNER JOIN classes ON student.cls_id=classes.id;
LEFT JOIN # 左连接以左边列表为主 RIGHT JOIN非主列表为空时自动显示NULL
# 创建商品表,中间设置外键
CREATE TABLE commodity(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
price DECIMAL(8,2) NOT NULL,
is_delete int default 0,
is_show int default 1,
is_saled int default 0,
cate_id int unsigned,
brand_id int unsigned,
FOREIGN KEY(cate_id) REFERENCES cate(id),
FOREIGN KEY(brand_id) REFERENCES brand(id)
);
练习:
SELECT ROUND(AVG(pirce),2) AS avg_pirce FROM goods WHERE cate_id=2; # AS是显示的名字
嵌套查询
SELECT price FROM commodity WHERE price>(SELECT AVG(price) FROM commodity WHERE cate_id=1) and cate_id=1;
# 查询价格最大最小平均个数,并且显示分类名
mysql> SELECT cate_id,cate.name,MIN(price),MAX(price),ROUND(AVG(price),2) AS '平均价格',COUNT(price) AS'总数' FROM commodity INNER JOIN cate ON cate_id=cate.id GROUP BY cate_id;
+---------+--------------+------------+------------+--------------+--------+
| cate_id | name | MIN(price) | MAX(price) | 平均价格 | 总数 |
+---------+--------------+------------+------------+--------------+--------+
| 1 | 保温杯 | 198.00 | 258.00 | 228.00 | 2 |
| 2 | 马克杯 | 108.00 | 308.00 | 208.00 | 2 |
| 3 | 桶套餐 | 66.00 | 88.00 | 77.00 | 2 |
| 4 | 皇堡套餐 | 25.50 | 48.00 | 36.75 | 2 |
| 5 | Q币 | 49.50 | 98.80 | 74.15 | 2 |
| 6 | 皮肤 | 138.00 | 138.00 | 138.00 | 1 |
| 7 | 英雄 | 58.00 | 58.00 | 58.00 | 1 |
+---------+--------------+------------+------------+--------------+--------+
# 三表联查 可以分开写
SELECT commodity.name,cate.name,brand.name FROM commodity INNER JOIN cate ON commodity.cate_id=cate.id INNER JOIN brand ON commodity.brand_id=brand.id;
SELECT commodity.name,cate.name,brand.name FROM(
commodity INNER JOIN cate ON commodity.cate_id=cate.id
INNER JOIN brand ON commodity.brand_id=brand.id
);
CREATE TABLE myorder(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
payment DECIMAL(8,2) NOT NULL,
pay_time VARCHAR(20) NOT NULL,
user_id INT UNSIGNED,
FOREIGN KEY(user_id) REFERENCES user(id),
send_time VARCHAR(20) NOT NULL
);
SELECT myorder.id,myorder.pay_time AS'付款时间',order_items.comm_id AS'商品id',order_items.num,order_items.total_fee,shipping.name,shipping.phone FROM myorder INNER JOIN order_items ON myorder.id=order_items.order_id INNER JOIN shipping ON myorder.id=shipping.order_id;
创建用户并分权限
create user username identified by 'password'; // 创建名字和密码
grant all on biao.* to 'username'@'%'; // 设置用在哪个表和权限, %是指连接地址都可以
flush privileges; // 使生效
重新打开数据库
mysql -upaul -p // 然后输入密码