mysql学习笔记一 —— 数据的增删改查

1、连接mysql

mysql 直接回车(是以root身份,密码空,登陆的是本机localhost)
[root@www mysql]# mysql -uroot -p123 -S /var/lib/mysql/mysql.sock

2、设置root用户密码并登陆
[root@www mysql]# /usr/bin/mysqladmin -u root password '123'
再登陆:
[root@www mysql]# mysql -u root -p123 -h localhost
-u 指定以哪个用户的身份登陆mysql
-p 指定密码(没有空格)
-h 指定登陆哪台主机上的mysql

3、安全设置(加固)
[root@www mysql]# mysql_secure_installation

4、配置文件
ibdata1 InnoDB存储引擎的系统表空间,存放这innodb表的数据、回滚段
ib_logfile0
ib_logfile1 innodb日志文件组
mysql 数据库,库名叫mysql(权限库)
mysql.sock mysql的socket文件,用于本机用户登陆mysql

/etc/my.cnf 配置文件

[mysqld]
datadir=/var/lib/mysql //mysql数据存放目录
socket=/var/lib/mysql/mysql.sock //socket文件路径
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 //软连接支持与否
character_set_server=utf8

[mysqld_safe] //跟启动有关
log-error=/var/log/mysqld.log //错误日志
pid-file=/var/run/mysqld/mysqld.pid //pid文件
character_set_database=utf8

[mysql]
default-character-set=utf8

5、库的管理
创建数据库
文件系统:
cd /var/lib/mysql
mkdir DB1
chown mysql.mysql DB1
SQL:
mysql> create database DB2;


删除数据库

文件系统:
rm -rf DB2
SQL:
mysql> drop database DB1;


查询数据库(查询有哪些数据库)
mysql> show databases;

使用数据库:
mysql> use DB1;
Database changed
mysql> select database(); //查看当前在哪个库中
+------------+
| database() |
+------------+
| DB1 |
+------------+
1 row in set (0.00 sec)


6、表的管理
mysql数据库系统软件,提供数据库服务,主要用来存放数据:
库-->表-->字段和记录

6.1 增加表

id name xingbie aihao

枚举()
mysql> create table T1(id int(11),name char(50),xingbie enum('M','F'),aihao set('AV','nv','nan','linux'));

mysql> create table chengji (id int not null auto_increment primary key,class int,name char(30),yuwen int,shuxue int,yingyu int);

not null:表示该列不能为空
auto_increment:自动增加
primary_key:主键索引

id,name,xingbie,aihao 创建的表中的各个列(字段)
int,char,enum,set 列的数据类型
int 整数类型,整型(整数,数字)
char 字符串(字母,汉字)
ENUM 枚举,从给定的选项中选择一个
set 类似enum,从给定的选项汇总选择多个

6.2 删除表
mysql> drop table t1;

删除表的数据

mysql> delete from t1;


6.3 修改表
增加列
删除列
修改列名
修改列数据类型

增加列:
增加一个email列
mysql> alter table T1 add email char(50);

增加到指定列后面

mysql> alter table T1 add email char(50) after id;

增加到第一列

mysql> alter table T1 add email char(50) first;


删除列:
删除email列
mysql> alter table T1 drop email;


修改列名
把xingbie列改成gender
mysql> alter table T1 change xingbie gender enum('M','F'); //change既可以修改列名,也可以列类型


修改列类型:
把name列的类型char(50)改为char(30)
mysql> alter table T1 modify name char(30);


修改表名:
mysql> rename table T1 to T2;

复制表:

法一:mysql> create table T2 (select id,name,number from T1);    //不能添加主键、索引等信息

法二:mysql> create table T2 like T1;      mysql> insert into T2 (select * from T1);

6.4 查询表(查看有哪些表)
mysql> show tables;
mysql> desc T1;
+---------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(50) | YES | | NULL | |
| xingbie | enum('M','F') | YES | | NULL | |
| aihao | set('AV','nv','nan','linux') | YES | | NULL | |
+---------+------------------------------+------+-----+---------+-------+
4 rows in set (0.03 sec)

7、 数据管理
7.1 增加数据
7.2 删除数据
7.3 修改数据
7.4 查询数据


增加数据
显示表结构:
mysql> desc T1;
字段(列名) 列数据类型 是否允许为空 是否是索引键 默认为null 额外描述
+---------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(50) | YES | | NULL | |
| xingbie | enum('M','F') | YES | | NULL | |
| aihao | set('AV','nv','nan','linux') | YES | | NULL | |
+---------+------------------------------+------+-----+---------+-------+
4 rows in set (0.03 sec)

插入数据:
mysql> insert into T1 values (1,"xiaoli",'F','nan,av');
Query OK, 1 row affected (0.01 sec)

mysql> insert into T1 values (2,"xiaoming",'M','nv,av'),(3,"laowang",'M','nv');

mysql>insert into chengji(class,name,yuwen,shuxue,yingyu) values (1,"danny",100,65,80),(2,"tom",100,59,80),(2,"jeck",88,60,22),(4,"hans",90,86,95);

删除数据,删除某一条记录
select 条件查询
mysql> select * from T2 where id=1;

从T2表中删除id为4的行:
mysql> delete from T2 where id=4;

将表中内容全部删除:
mysql> delete from T2; //在一个事物中,支持回滚
mysql> truncate T1; //不支持回滚

修改数据
update修改表中数据

修改表中数据:update table set xx=xxx where xx=xxx;
update user set password=password("1234");
修改chengji表中id为1的行中shuxue列值为100
mysql> update chengji set shuxue=100 where id=1;

查询数据:
mysql> select * from chengji;     *表示表中所有字段

mysql> select * from chengji where name="danny";

mysql> select yuwen from chengji where name="danny";  //从chengji表中查询danny的语文成绩是多少

数学运算 + - * / %(取模)
mysql> select 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.01 sec)

mysql> select class,name,yuwen+shuxue+yingyu as zongfen from chengji;


比较运算 > < >= <= = !=

select 3>2; 比较结果:对,错 真1,假0

mysql> select 3>2;
+-----+
| 3>2 |
+-----+
| 1 |
+-----+

mysql> select * from chengji where yuwen>=60; //chengji表中检索出yuwen成绩及格学员所有信息

mysql> select class,name,yuwen from chengji where yuwen>=60; //检索chengji表中yuwen成绩及格的学院班级、姓名和语文成绩

逻辑运算
与 && 并且,条件为必要条件,都需要被满足
或 || 非必要条件,满足其中之一
非 not 表示否定,取反。真加上not后为假;假加上not后为真。

mysql> select 3>2 && 5<3;
+------------+
| 3>2 && 5<3 |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)

mysql> select 3>2 || 5<3;
+------------+
| 3>2 || 5<3 |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)

mysql> select not 3>2;
+---------+
| not 3>2 |
+---------+
| 0 |
+---------+
1 row in set (0.00 sec)

检索语数外都及格的学生的班级、姓名和语数外的成绩
mysql> select class,name,yuwen,shuxue,yingyu from chengji where yuwen>=60 && shuxue>=60 && yingyu>=60;


排序 order by:通过 通过哪个字段来排序
mysql> select * from chengji order by yuwen; //通过yuwen字段排序,默认为升序排序

desc 降序排序
mysql> select class,name,yuwen+shuxue+yingyu as zongfen from chengji order by zongfen desc;


限制 limit
看一下总分前三名的信息
mysql> select class,name,yuwen+shuxue+yingyu as zongfen from chengji order by zongfen desc limit 3;


分组 group by:通过某个字段来分组
统计每个班中的人数
mysql> select class,count(class) from chengji group by class;
count() 函数,计数函数,这里通过class字段计数

检索区间 between...and...

mysql> select class,name from chengji where yuwen between 80 and 90;
+-------+-------------+
| class | name |
+-------+-------------+
| 2 | shijinbao |
| 4 | yangguangyu |
+-------+-------------+
2 rows in set (0.01 sec)


常用函数
user() 查看当前用户是谁
database() 查看当前所属库
version() mysql的版本
now() 系统时间
sum() 求和函数
avg() 平均数
max() 最大值
min() 最小值
count() 统计数量,计数

例:

mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
1 row in set (0.01 sec)

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2017-08-14 15:14:11 |
+---------------------+
1 row in set (0.02 sec)


mysql> select count(*) from chengji;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)

mysql> select sum(yuwen) from chengji;
+------------+
| sum(yuwen) |
+------------+
| 433 |
+------------+
1 row in set (0.01 sec)

mysql> select avg(yuwen) from chengji;
+------------+
| avg(yuwen) |
+------------+
| 72.1667 |
+------------+
1 row in set (0.01 sec)


mysql> select max(yingyu) from chengji;
+-------------+
| max(yingyu) |
+-------------+
| 95 |
+-------------+
1 row in set (0.00 sec)

mysql> select min(yingyu) from chengji;
+-------------+
| min(yingyu) |
+-------------+
| 22 |
+-------------+
1 row in set (0.00 sec)


8、数据类型

数值类型
占用磁盘空间
tinyint 1字节即8位 -256~256
int 4字节即32位 -42亿~42亿 11 11111111111
bigint 8字节即64位

DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DECIMAL

float 浮点数,单精度
double 浮点数,双精度

decimal(M,D)工资 decimal(10,0) 10表示最多10位,小数点后面有0位
decimal(10,2) 最多10位数,小数点2位

mysql> create table gongzi(name char(20),salary decimal(7,2));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into gongzi values("gebi",24567.99),("laowang",22222.22);


时间类型
DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR

mysql> create table tt1 (d date,t time,dt datetime,ts timestamp,y year);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tt1 values(now(),now(),now(),now(),now());
mysql> select * from tt1;
+------------+----------+---------------------+---------------------+------+
| d | t | dt | ts | y |
+------------+----------+---------------------+---------------------+------+
| 2017-08-14 | 15:31:39 | 2017-08-14 15:31:39 | 2017-08-14 15:31:39 | 2017 |
+------------+----------+---------------------+---------------------+------+
1 row in set (0.01 sec)


字符串类型
char name char(30) xiaoming
varchar name varchar(30) xiaoming
从节省磁盘空间上来看,varchar好!但是使用varchar会消耗cpu计算能力,导致性能低,虽然用char占用的磁盘空间多,但是不消耗cpu,而且存放字段都是固定长度,读取速度快,性能好。所以对于字符串的数据类型,多用char。用牺牲磁盘空间来换取性能。

存文本:
text 纯文本
blob 文本+图片 二进制

枚举 在给定的选项中选择一个
set 在给定的选项中可以选择多个

总结:

库:
create database
drop
use
show

表:(增删改查)
create table
drop
alter table
增加列 add
删除列 drop
该列名 change
该列类型 modify
修改表名:rename table T1 to T2;
show tables

数据:(增删改查)
增加 insert into table values(.....)
delete from ... truncate
update t1 set =
select

补充笔记:

查看mysql数据当前状态等:(常用于mysql资源监控)
mysql -e "show status" | grep xxx 
mysql -uzabbix -p123 -e "show full processlist" //查看当前连接用户
show engines //查询数据库引擎类

myisam表:读写速度块。

InnoDB表,支持事物,支持回滚、数据完整性。