mysql | 安装和使用指南
安装和配置
-
将下载好的文件进行解压
-
新建一个my.ini配置文件,内容如下
[mysqld] basedir ="D:\AStudy\MySQL\mysql-8.0.27-winx64" datadir ="D:\AStudy\MySQL\mysql-8.0.27-winx64\data" port=3306 server_id =10 character-set-server=gbk character_set_filesystem=gbk [client] port=3306 default-character-set=gbk [mysqld_safe] timezone="CST" [mysql] default-character-set=utf8
-
使用管理员身份运行
cmd
并cd D:\AStudy\MySQL\mysql-8.0.27-winx64\bin
-
输入
mysqld --initialize-insecure
生成data文件 -
输入
mysqld -install
安装MySQL -
启动服务
net start mysql
基础指令
mysql -u root -p
之后输入密码进入mysql命令行show databases;
显示所有的数据库use <databaseName>
使用某个数据库show tables;
显示该数据库所有的表desc <tablename>
查看表结构exit
退出mysql
索引
建表的时候创建索引:
CREATE TABLE ... {
unique index (列名),
index(列名),
index(列名,列名)
}
ALTER TABLE 表名 ADD index(列名)
// 唯一索引
create unique index index_name on table(column, ...)
// 联合索引
CREATE INDEX index_product_no_name ON product(product_no, name);
查询索引:SHOW index FROM 表名;
在一条查询语句加上EXPLAIN
可以查看这条语句走的索引
删除索引:drop index 索引名 on 表名;
或者Alter table 表名 drop index 索引名;
增删改指令(DML
)
-
insert into <表名>(列名,列名...) values(val, val...), (), ()...
添加一行或者多行数据insert ignore into
表示如果存在该字段则忽略 -
update <表名> set <列名>=<val> .... where ...
更新指定的数据 -
delete from <表名> where <列名>=<val>
删除指定的行
查询指令(DQL
)
检索数据(SELECT
)
SELECT <列名> FROM <表名>
可以在列名前面使用DISTINCT
去除重复,在表名后面加上LIMIT 5
可以限制出现的记录
列名可以是*通配符,但是一般不用,降低检索和应用程序的性能
排序检索数据(DESC
)
ORDER BY <列名> <ASC(默认升序), DESC>
可以按照两个列排序
过滤数据(WHERE, ADD, OR, LIKE
)
WHERE <列名> BETWEEN AND
可以是等于,不等于,大于,小于,范围等
AND OR
用来过滤数据,AND的优先级高于ORSELECT * FROM products WHERE prod_name LIKE '%rot%';
使用LIKE,%可以匹配单个,多个字符;_下划线只能匹配一个。'%'不能匹配NULL数据,去掉多余的空格。
创建计算字段(Concat, AS
)
SELECT Concat(vend_name, '(', vend_country, ')') AS vend_info FROM vendors ORDER BY vend_name;
Concat()
函数用于拼接串。Trim()
,RTrim()
, LTrim()
用于去掉左右空格。
AS
用于赋予新的替换名
使用函数处理数据(针对项)
文本处理
SELECT vend_name, Upper(vend_name) AS vend_name_Upper FROM vendors ORDER BY vend_name;
Upper()将文本转化为大写;Left()返回串左边的字符;Length()返回串的长度;Locate()串的字串;Soundex()发音类似。
日期处理
SELECT * FROM orders WHERE Year(order_date) = 2005;
Date()获取日期(年月日);Year(),Month(), Day(), Hour(), Minute(), Time()获取日期的年份
DATEDIFF(日期一,日期二)
结果是日期一和日期二相差的天数,大于为正
数值处理
Abs()绝对值;Sqrt()根;Rand()随机数
聚集函数(针对表)
SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products;
COUNT(*) 用来计数;MIN(),MAX(), AVG()求最小,最大,平均值;SUM() 指定列值的和
分组(GROUP BY, HAVING
)
SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;
先价格筛选,将筛选后的按照vend_id进行分组,满足数量要大于等于2
SELECT order_num, SUM(quantity * item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity * item_price) >= 50 ORDER BY ordertotal;
先分组过滤,然后按照总价格排序
GROUP BY
用于有聚集函数的场景,出现在WHERE
字句之后,ORDER BY
字句之前。HAVING用于分组过滤。
子查询(IN)
嵌套查询
联表查询(INNTER JOIN)
SELECT * FROM products INNER JOIN vendors on vendors.vend_id = products.vend_id;
SELECT prod_name, prod_price, vend_name FROM products, vendors WHERE products.vend_id = vendors.vend_id ORDER BY vend_name, prod_name;
使用INNTER JOIN ON <两个表的列值相等>
而不使用WHERE
,提高性能,联结的表越多,查询性能越差。
-
SELECT t.team_id, employee_name, team_name FROM t_employee t RIGHT JOIN t_team tt ON t.team_id = tt.team_id;
外连接:
LEFT JOIN,RIGHT JOIN
分别是以左边(或者右边为准),如果右边没有数据会置为空,左表所有行数都会显示 -
SELECT * FROM t_blog LEFT JOIN t_type ON t_blog.typeId=t_type.id UNION SELECT * FROM t_blog RIGHT JOIN t_type ON t_blog.typeId=t_type.id;
外连接就是求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。另外MySQL不支持
OUTER JOIN
,但是我们可以对左连接和右连接的结果做UNION操作来实现。
评论区