MySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
安装
本人此次用的版本是:mysql-8.0.13-winx64
选择安装包
www.mysql.com/download(下载)/Community(社区版)/mysql server(服务器)
打开下载页后 operating system(选择操作系统) 选Microsoft windows(微软windows系统)
点击download下载,点no thans不登录直接下载。
- msi microsoft windows installer 也就是.exe安装包。好处:有安装向导,自动添加环境变量,自动生成配置文件,自动注册windows服务。
- zip archive 也就是.zip压缩包。包含mysql主要文件,但跟windows结合部分环境变量、服务就需要手动建立。好处:版本最新,控制力强。
安装
- 新建文件夹C:\Program Files\MySQL 允许权限
- .zip安装包解压至刚才新建的文件夹。报解压错误,原因无权限。解决先解压到D盘,然后剪切至目录,弹窗时允许权限。
开启服务
- 介绍mysql工程的主要文件夹和文件作用。
- bin文件夹。可执行二进制程序。客户端mysql.exe,服务端mysqld.exe,备份mysqldump.exe
- data。存放具体数据。
- my.ini。数据库服务启动时的默认配置文件,定义了mysql目录,引擎,字符集,日志等关键信息。需要手动建立。
my.ini -记事本的内容:
[mysqld]
# set basedir to your installation path
basedir=C:\\Program Files\\MySQL\\mysql-8.0.13-winx64
# set datadir to the location of your data directory
datadir=C:\\Program Files\\MySQL\\mysql-8.0.13-winx64\data
[mysql]
- 初始化data文件夹和生成root密码。mysqld --defaults-file=C:\my.ini --initialize --console 成功后注意记住生成的随机root密码。data文件夹下可以看到许多文件。
可能出现的错误–initialize specified but the data directory has files in it. Aborting,解决删除data下文件。管理员cmd下重新命令。 - 开启服务 mysqld --console 出现3306等字样成功,窗口不要关闭。
- 客户端登录 mysql -u root -p刚才生成的密码
可能出现的错误:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)服务器没有启用 - 登录进去后改密码。ALTER USER “root”@“localhost” IDENTIFIED BY “新密码”; 123456 \q退出后可以用mysql -u root -p 重新登录。
- 注册windows服务 mysqld --install MySQL80 --defaults-file=“C:\my.ini”
数据库这就连接成功了。下面我们我们来修改密码,
退出程序后,我们根据mysql -u root -p 重新登录。登录成功即可。
下面还有最后一步,开辟一个新窗口, 注册windows服务。
sql语法(重要)
create table,select、update、delete基础语句
下面排序、分组、统计、表连接。
http://www.w3school.com.cn/sql/index.asp
语法
(高) create table,select、update、delete
- 列值 去重(中)。SELECT DISTINCT Company FROM Orders
- 多个限定条件同事满足。SELECT * FROM Persons WHERE FirstName=‘Thomas’ AND LastName=‘Carter’
- 多个限定条件满足任一。SELECT * FROM Persons WHERE firstname=‘Thomas’ OR lastname=‘Carter’
- 排序单列倒序 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC; descend
- 排序多列顺序 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC; 默认顺序排。ascend
- 取结果集10到20的条目。 mysql中 select * from table limit 10,20; oracle中根据rowcount。
- 取结果集前10 select * from table limit 10; select top 10 * from table;
- 模糊查找 SELECT * FROM Person WHERE City LIKE ‘N%’; %表示通配符,_匹配一个字符。 'N%‘匹配’New’ ‘New York’'New Y_k’匹配’New York
- 列的值在一个列表当中 SELECT * FROM Person WHERE LastName IN(‘Adams’, ‘Carter’); 注意效率。
- 别名 SELECT LastName AS Family, FirstName AS Name FROM Persons
- 分组 select * from table GROUP BY 字段
- 授予权限 GRANT ALL ON menagerie.* TO ‘your_mysql_name’@‘your_client_host’;
语法 join表连接
需求:设计订单表。 第一次设计的order表含字段:id,order_no, person_name, person_address, person_vip, product_info。如果这样设计,发现问题,一是字段越来越多、各种维度信息混合在一起不好维护,二是person_list_info列表信息不好表达。
所以我们按字段分类设计成两张表。
表一:person(id, name, address, vip, phone)
表二:order(id, order_no, price, person.id)。
这里的person.id是“外键 foreign key”。
外键的好处:分类清晰,保证数据一致性; 缺点:影响效率。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
SELECT P.LastName, P.FirstName, O.OrderNo
FROM Persons, AS p
INNER JOIN Orders AS o
ON P.Id_P = O.Id_P;
INNER省略的话默认join就是inner join内连接。给表起别名减少代码量。
left join左表中的列不管有没有匹配到右边的表中数据,都会展示出左边表的数据行。right join相反 以右表为主。full join笛卡尔积消耗资源。一般情况下主要inner join,少量left join,其他join几乎用不到 用到再查。
管理数据库
新建schema库 >>> CREATE DATABASE database_name
新建表 >>> CREATE TABLE 表名称(列名称1 数据类型,列名称2 数据类型,)
约束constrain>>> 针对insert语句。 not null非空 unique唯一 主键 外键
索引 CREATE INDEX >>> index_name ON table_name (column_name); 索引好像书本前的目录,空间换时间,增加建立索引那列的查询速度。
丢弃 DROP TABLE 表名称 >>> 删除整张表结构和数据和索引。delete只删除数据。
修改 ALTER TABLE >>> table_name ADD column_name datatype。
创建用户,权限等用到再查文档。
函数
平均值 avg(字段)
技数 count(字段)
时间 now()
如果分组后统计 select * from table group by vip HAVING 筛选条件;
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
如果分组后还要跟
mysql -u root -p 开启sql服务
命令行创建表内容
先创建一个menagerie库,并切换到库
用到的某些语法:
- 模糊匹配 like ‘阿_/%’
- 排序 order by
- 不相等 !<>
- 唯一 去重 distinct describe 详细
- timestampdiff 时间 month 月份 (add)
步骤
- 启动服务 shell>mysqld
- 客户端 shell> mysql --help
- 客户端登录 mysql -u root -p、如果服务器在另一台计算机 需要ip地址和端口参数 mysql -h 127.0.0.1 -p 3306 -u root -p
登录时指定数据库 mysql -u root -p 库名
mysql -h 127.0.0.1 -u root -p远程登录 - 执行各种sql
sql
- select version(), current_date;
大小写都写,函数可以省略(),每句分号结尾。 - create database 库名; show databases;
刚连接mysql后,mysql只有几个保存系统信息的内置数据库(表信息 权限信息)我们不应该 所有动内置库。schema是逻辑上的大分块,schema下包含库。当有一个项目想保存信息时,我们需要先新建一个库 datebase,然后再datebase下新建表,表里存信息。有些数据库中schema - USE 库名;切换数据库。否则跨数据库查询需要跟命名空间。
- show tables;查看库下所有表
- describe table;查看表字段定义
可能出现的问题:
- sqlite数据库文件和mysql数据库文件混淆,它们的数据库存储方式和数据存储位置不同。