目 录CONTENT

文章目录

mysql | 安装和使用指南

RobKing
2023-08-13 / 0 评论 / 0 点赞 / 82 阅读 / 1,319 字

mysql | 安装和使用指南

安装和配置

  1. 安装MySQL 地址

  2. 将下载好的文件进行解压

  3. 新建一个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
    
  4. 使用管理员身份运行cmdcd D:\AStudy\MySQL\mysql-8.0.27-winx64\bin

  5. 输入 mysqld --initialize-insecure 生成data文件

  6. 输入 mysqld -install 安装MySQL

  7. 启动服务 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的优先级高于OR
  • SELECT * 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操作来实现。

0

评论区