查看mysql状态的命令
systemctl status mariadb
systemctl start mariadb
systemctl stop mariadb
systemctl restart maridb
root用户下,进去mysql命令
mysql -u root -p直接跟密码 #这种方式不好,因为密码是明文输入的
mysql -u root -p
输入密码
#推荐使用这种方式,安全性好
退出命令
exit
进入数据库后,创建数据库
CREATE DATABASE database_name;
CREATE DATABASE IF NOT EXISTS database_name;
在root下,使用mysqladmin创建数据库
mysqladmin -u root -p create database_name
删除数据库
drop database database_name;
drop database IF EXISTS database_name;
在root终端下,使用mysqladmin删除数据库
mysqladmin -u root -p drop database_name
选择数据库
use `database_name` --如果database_name是特殊字符,则需要加``
mysql数据库的列类型:数值、日期/时间和字符串(字符)类型
数值
- tinyint 一个字节
- smallint 两个字节
- mediumint 三个字节
- int 四个字节(常用的)
- bigint 八个字节
- float 浮点数 四个字节
- double 浮点数 四个字节(精度问题)
- decimal 字符串形式的浮点数 (金融计算的时候)
日期
- date YYYY-MM-DD 日期格式
- time HH:MM:SS 时间格式
- datetime YYYY-MM-DD HH:MM:SS (最常用的格式)
- timestamp 时间戳(从1970年开始)
字符串
- char 字符串固定大小的 0~255
- varchar 可变字符串 0~65535常用的
- tinytext 2^8-1
- text 文本串 2^16-1
NULL
- 没有值,未知
- 运算的时候,不要使用NULL
数据库的字段属性(重点)
Unsigned
- 无符号整数
- 声明了该列不能声明为负数
zerofill
- 0填充的
- 不足的位数用0填充
自增
- 通常理解为自增,自动在上一条的记录上+1(默认)
- 通常用来设计唯一的主键 index 必须是整数类型
- 可以自定义设置主键的起始值和步长
非空
- not null,设置成not null 如果不赋值也会报错
- NULL,如果不填写值,默认就是null
默认
- 设置默认的值
- sex,默认值为男,不指定该列的值就会采取默认的值
拓展
每一个表都必须存在以下5个字段:
/*
id 主键
`version` 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
*/
创建数据表
通用表达式:
CREATE TABLE table_name (column_name column_type);
通过命令提示符创建表,栗子:
root@host# mysql -u root -p
Enter password:*******
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_tbl(
-> runoob_id INT NOT NULL AUTO_INCREMENT,
-> runoob_title VARCHAR(100) NOT NULL,
-> runoob_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( runoob_id )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.16 sec)
mysql>
--MySQL命令终止符为分号 ;
---> 是换行符标识,不要复制
也可以直接创建:
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
--`符号是英文输入下的反引号。即Esc底下的那个键
show create database database_name; --查看创建数据库语句
show create table table_name;--查看创建表语句
desc table;--查看表的结构
关于数据库引擎
MYISAM | INNODB | |
---|---|---|
事务支持 | × | √ |
数据行锁定 | × | √ |
外键约束 | × | √ |
全文 索引 | √ | × |
表空间的大小 | 较小 | 较大约为2倍 |
PS:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务处理,多表多用户操作
物理空间存在的位置
本质还是文件存储。
mysql引擎在物理文件上的区别
- InnoDB在数据库中只有一个*.frm文件,以及上级目录下的ibdata1文件
- MYISAM对应的文件:*.frm文件(表结构定义文件) *.MYD(数据文件) *.MYI(索引文件)
设置数据库的字符集编码
charset=utf8 --mysql的默认字符集编码是Latin1,不支持中文
PS:也可以在my.ini中配置字符集编码:
character-set-server=utf8
查看所有的数据库
show databases
修改删除数据表
删除
DROP TABLE IF EXISTS table_name;-- 所有的创建和删除,最好加上判断,防止报错
修改
-- 修改表名 ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teacher1
--增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
-- 修改表的字段(重命名, 修改约束)
ALTER TABLE teacher1 MODIFY age VARCHAR(11) --修改字段类型
ALTER TABLE teacher1 CHANGE age age1 INT(1) --字段重命名
-- 删除表的字段
ALTER TABLE teacher1 DROP age1
插入数据
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
读取表的数据
select * from table_name;
查询数据
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
sql语句的注释
-- 单行注释
/*
多行注释
*/
注意的点:
- 字段名,使用``包裹
- mysql的关键字不区分大小写,关键字建议写小写(可读性强)
- 所有符号全部用英文
数据库语言的类型:DDL (控制语言)DML(操作语言) DQL(查询语言) DCL (控制语言)主要操作:CRUD(增删改查)
操作分类:操作数据库->操作数据库中的表->操作表中的数据
mysql数据管理
- 外键(了解)
1.在创建表的时候,增加约束,比较麻烦(不建议使用)定义外键,然后添加外键(执行引用)
2.创建表的时候没有外键
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid FOREIGN KEY(`gradeid`) REFERENCE `grade`(`gradeid`);
PS:先删除引用别人的表,再删除被引用的表。以上都是数据库级别的物理外键,不建议使用(避免数据库过多造成影响)
最佳实践: 1.数据库只是单纯的表,只用来存储数据,行(数据)和列(字段)
2.我们想要使用多张表的数据,用程序去实现。
- DML语言(核心:增删改)
数据库存在的意义:数据存储、数据管理
- 添加insert
insert into table_name (field1,field2,field3...) values ('value1','value2','value3'...)
--保证数据和字段一一对应,插入的是一行的东西
--字段和字段之间使用‘,’号隔开;如果不写字段的话就是默认的顺序
--可以同时插入多条数据,一个()是一行数据,中间用逗号隔开
- 修改update
--修改学员的名字
UPDATE `student` SET `name`=`jack` WHRE id = 1;
--不指定条件,默认所有都改变了
--修改多个属性
条件字句where
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或者!= | 不等于 | 5<> 6 | true |
> | |||
>= | |||
< | |||
<= | |||
BETWEEN…and… | |||
AND | |||
OR |
PS:可以通过多个条件定位语句,无上限;使用的列必须是数据库的列;带着``;where筛选条件;value也可以设置变量(比如日期)
- 删除
DELETE FROM `table_name` WHERE id = 1;
删库
--清空表
TRUNCATE `tablea_name`;
TRUNCATE和delete的区别:
- 相同点:都能删除数据,不会删除表结构
- 不同点:TRUNCATE重新设置自增列,计数器会归零,不会影响事务
delete删除的问题,重启数据库的现象:
- InnoDB 自增列会从1开始(存在内存中,断电即失)
- MYISAM 继续从上一个增量开始(存在文件中的,不会遗失)
DQL查询数据(最重点)
- 数据库中最核心的语言
- 简单和复杂都能做
- 关键字是select
查询的语句
select * from table_name;--从表中查询所有的信息
select `id`,`number` from `table_name`;--查询特定的列
select `id` as 序号,`number` as 学号 from `table_name` as s;--可以给列起别名,也可以给表起别名
--函数concat(a,b)可以拼接字符串
去重的查询
select distinct `id` from `table_name`;--去重select查询出来结果中重复的数据
select的其他操作
select version(); -- 查询系统版本(函数)
select 100 + 2 as result;--用来计算(计算表达式)
select @@auto_increment;--查询自增的步长(变量)
select `grade`+1 from table_name;--将grade中的数据+1
*数据库中的表达式:*文本值、列、NULL、函数、计算表达式、系统变量
通用的表达式:select 表达式 from 表
where条件字句
检索数据中符合条件的值
逻辑运算符
and;or;not(尽量使用英文字母)。
--查询95-100分之间的学生
select `number`, `grade` from result where grade>=95 and grade<=100;
--模糊查询
select `number`, `grade` from result where grade between 95 and 100;
select `number`, `grade` from result where grade>=95 && grade<=100;
--除了1000号之外的同学的成绩
select `number`, `grade` from result where grade!=1000;
select `number`, `grade` from result where not grade=1000;
模糊查询(比较运算符)
is null
is not null
between and eg:a between b and c --a是否在b和c之间
like eg:a like b
in eg:a in(a1,a2,a3,...)--in是具体的一个或者多个数
--查询姓刘的同学
select `number`, `name` from result where name like`刘%`;
--查询姓刘的同学,并且名字只有两个字
select `number`, `name` from result where name like`刘_`;
--查询姓刘的同学,并且名字只有三个字
select `number`, `name` from result where name like`刘__`;
--查询名字带有‘花’的名字
select `number`, `name` from result where name like`%花%`;
--查询学号为1001,1002,1003的同学
select `number`, `name` from result where number in (1001,1002,1003);
--查询地址在安徽的同学
select `number`, `name` from result where address in ('安徽');
--查询地址为空的同学
select `number`, `name` from result where address="" or address is null;
--查询有出生日期的同学,即出生日期不为空的同学
select `number`, `name` from result where birthdate is not null;
PS:更多用法,见菜鸟mysql教程和狂神mysql教程