前言:
如今小伙伴们对“mysqli用法”大体比较重视,大家都想要分析一些“mysqli用法”的相关内容。那么小编也在网络上网罗了一些关于“mysqli用法””的相关内容,希望大家能喜欢,我们快快来了解一下吧!创建表,查看表,修改表名字 ,指定引擎和字符集
存储引擎查看mysql> show engines;
alter table 表名 ENGINE=引擎; 修改搜索引擎
mysql> show variables like '%storage_engine%'; 查看当前默认的引擎
mysql> select version(); 查看当前服务器mysql的版本
1.创建库 mysql> create database 库名;
2.查看数据库 mysql> show databases;
3.进入数据库 mysql> use 库名
4.查看当前所在的库 mysql> select database();
创建表
语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], )[存储引擎 字符集];
==在同一张表中,字段名是不能相同
==宽度和约束条件可选
==字段名和类型是必须的
mysql> show tables;查看有哪些表
mysql> desc t1.查看表结构:
select * from t1; select 字段,字段 from 表名查看表里面的记录
show table status like '表名'\G 查看表的状态
rename table 旧表名 to 新表名;修改表名称
mysql> drop table 表名.删除表 drop database 库名.删除库
mysql> create table t1(id int) engine =innodb; 创建表时指定引擎
修改字符集 :在创建表的最后面指定一下: default charset=utf8 #可以指定中文
字段类型
1、int 整型 加上zerofill 宽度3 自动0
mysql>create table t1(id int(3) zerofill,ip varchar(6));
2、字符串 char 固定长度,占用固定空间 varchar 变化的字符
3、枚举类型 enum mysql> create table t101(name enum('tom','jim')); 只能从tom,jim两个里面2选其1
4.浮点数类型 FLOAT DOUBLE float(5.3) #一共5位,小数占3位.做了限制 double 更精确
5.日期类型 ===时间和日期类型测试:year、date、 time、 datetime、timestamp
年月日 小时分钟秒 年月日小时分钟秒
约束条件 主键 外键 唯一 自增的创建
约束:(约束条件)
1、primary key 标识该字段为该表的主键,可以唯一的标识记录,每张表里只能有一个主键,不能为空,而且唯一。(RPI)
定义两种方式:
mysql> create table t7(hostname char(20) primary key,ip char(150));
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
删除主键 mysql> alter table t7 drop primary key
2、foreign KEY (FK) 标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键) 之间的关联/
mysql>create table student( id int auto_increment primary key,
age int, class_id int, foreign key(class_id) references class(id) #class表的主键
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
3、NULL 标识是否允许为空,默认为NULL,不能修改。 NOT NULL 标识该字段不能为空,可以修改
create table tt(id int not null)
NULL说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、比较时使用关键字用“is null”和“is not null”。
5、排序时比其他数据都小(索引默认是降序排列,小→大),所以NULL值总是排在最前。
4、unique key (UNI) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
create table tt(id int unique);
5、auto_increment 标识该字段的值自动增长(整数类型(每张表只能有一个字段为自曾) (成了key才可以自动增长,而且为主键)
create table (ttdept_id INT PRIMARY KEY AUTO_INCREMENT)
6、default 为该字段设置默认值 UNSIGNED 无符号,正数
create table tt(age int unsigned NOT NULL default 20,id int) #必须为正值(无符号) 不允许为空 默认是20
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
索引
索引:
index(key)每张表可以有很多列做index,必须的起名
导致SQL执行慢的原因:
1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效.
3.数据过多(分库分表)
4.服务器调优及各个参数设置(调整my.cnf)
索引:当查询速度过慢可以通过建立优化查询速度,可以当作调优
创建索引:两种
mysql> create table t100(hostname char(20) primary key,ip char(150),index (ip));
mysql> create table t101(hostname char(20) primary key,ip char(150),index dizhi(ip)); #给ip做的索引, 名字叫dizhi
show index from tt\G 查看表tt的索引
表操作 添加 修改 插入 更新 删除
表操作:
1、添加字段 alter table 表名 add 字段 修饰符;
mysql> alter table t3 add math int(10);-------添加的字段 mysql> alter table t3 add (chinese int(10),english int(10));------添加多个字段,中 间用逗号隔开。
alter table 表名 add 添加的字段(和修饰) after name; -------把添加的字段放到name后面
alter table 表名 add 添加的字段(和修饰) first; ----------把添加的字段放在第一个
2.修改字段数据类型、修饰符
(1).修改名称、数据类型、修饰符 alter table 表名 change 旧字段 新字段 修饰符; #change修改字段名称,类型,约束,顺序
mysql> alter table t3 change max maxs int(15) after id; #修改字段名称与修饰并更换了 位置
(2).修改字段类型,约束,顺序 alter table 表名 modify 字段 属性 修饰符; #modify 不能修改字段名称
mysql> alter table t3 modify maxs int(20) after math; #修改修饰并更换位置
(3).删除字段 mysql> alter table t3 drop maxs; #drop 丢弃的字段。
3.插入数据(添加纪录)
(1)insert into 表名(字段1,字段2,字段3,字段4)values(1,"tom","m",90);
insert into t3 set id=4,name="zhangsan",sex="m",age=21;
(2)update 表名 set 修改的字段 where 给谁修改;
update t3 set id=6 where name="xiaoli";
4.删除记录
delete from t3 where id=6;
删除所有的记录
delete from t3; 删除后再添加记录,自增字段不是从1开始
truncate 删除表中数据,再插入时自增长id又从1开始
truncate table t3 删除表中的记录,表还在
drop table t3 删除表
删除 drop truncate delete 的区别
drop 直接删掉表
truncate 删除表中数据,再插入时自增长id又从1开始
delete 删除表中数据,可以加where字句, 增长 id 会继续增长。
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop > truncate > delete
(4) 应用范围。TRUNCATE只能对TABLE;DELETE可以是table和view(视图)
(5)TRUNCATE和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(6)truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7)delete语句为DML(data maintain Language),这个操作会被放到rollback segment中,事务提交后才生效。如果有相应的tigger,执行的时候将被触发。
(8)truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(9) 在没有备份情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10)Truncate table表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的DELETE语句相同:二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(11)TRUNCATE TABLE删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE 语句。
(12) 对于由FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应使用不带WHERE子句的DELETE语句。由于TRUNCATE TABLE不记录在日志中,所以它不能激活触发器。
复制表
复制表结构(约束条件也复制)
CREATE TABLE 表名 LIKE 要复制的表名
复制表结构和数据 (约束条件不复制)
CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名
mysql> create table pp select * from wei;
mysql> create table pp as select * from wei;
表查询(where and or count sum between, order by ,limit,group by)
1.单表查询
mysql> select 字段名称,字段名称2 from 表名 条件 #语法
mysql> select id,name from employee5 where id<3; #有条件查询:where
mysql> select id as "id_num" from employee5 where id>5; #设置别名:as
mysql> select * from employee5;
+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+
|id|name | sex | hire_date | post |job_description| salary | office|dep_id|
+----+-----------+--------+------------+------------+-----------------+----------+-------
| 1|jack | male | 2018-02-02| instructor | teach | 5000.00 | 501 | 100 |
| 2| tom | male | 2018-02-03| instructor | teach | 5500.00 | 501 | 100 |
| 3| robin | male | 2018-02-02| instructor | teach | 8000.00 | 501 | 100 |
| 4| alice | female| 2018-02-02| instructor | teach | 7200.00 | 501 | 100 |
| 5| tianyun | male | 2018-02-02| hr | hrcc | 600.00 | 502 | 101 |
| 6| harry | male | 2018-02-02| hr | NULL | 6000.00 | 502 | 101 |
| 7| emma | female| 2018-02-06| sale | salecc | 20000.00 | 503 | 102 |
| 8| christine| female| 2018-02-05| sale | salecc | 2200.00 | 503 | 102 |
| 9| zhuzhu | male | 2018-02-05| sale | NULL | 2200.00 | 503 | 102 |
|10| gougou | male | 2018-02-05| sale | | 2200.00 | 503 | 102 |
2.统计记录数量:count()
统计字段得到数量: mysql> select count(id) from employee5;
| count(id) |
+-----------+
| 10
避免重复DISTINCT:表里面的数据有相同的 mysql> select distinct post from employee5;
post |
+------------+ #相当于 select post from employee5 group by post;
| instructor |
| hr |
| sale
3.关键字 BETWEEN AND 什么和什么之间。
mysql> SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;
name | salary |
+-------+---------+
| jack | 5000.00 |
| tom | 5500.00 |
| robin | 8000.00 |
| alice | 7200.00 |
| harry | 6000.00
4.关键字IS NULL 空的
mysql> SELECT name,job_description FROM employee5 WHERE job_description IS NULL;
5.IN集合查询
SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000);
+-------+---------+ #意思就是salary 等于4000,5000,6000,9000 的人
| name | salary | #反之用法 not in
+-------+---------+
| jack | 5000.00 |
| harry | 6000.00 |
+-------+---------+
6.排序查询 order by
mysql> select name,salary from employee5 order by salary; #-默认从小到大排序。
mysql> select name,salary from employee5 order by salary desc; #降序,从大到小
7.limit 限制
mysql> select * from employee5 limit 5; #只显示前5行
mysql> select name from employee5 order by salary desc limit 0,1; #从第1行开始,打印一行
#0-------默认第一行 1------第二行 依次类推...
mysql> SELECT * FROM employee5 ORDER BY salary DESC LIMIT 4,5; #从第5条开始,共显示5条
8.分组查询 :group by
mysql> select count(name),post from employee5 group by post;
+-------------+------------+ |
count(name) | post |
+-------------+------------+
| 2 | hr |
| 4 | instructor |
| 4 | sale |
+-------------+------------+ c
count可以计算字段里面有多少条记录,如果分组会分组做计算
mysql> select count(name),group_concat(name) from employee5 where salary>5000; #查找 统计(条件:工资大于5000)的有几个人(count(name)),分别是谁(group_concat(name))
+-------------+----------------------------+
| count(name) | group_concat(name) |
| +-------------+----------------------------+
| 5 | tom,robin,alice,harry,emma |
+-------------+----------------------------+
9..GROUP BY和GROUP_CONCAT()函数一起使用
mysql> SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id; #以 dep_id分的组,dep_id这个组里面都有谁
10.函数 max() 最大值 min()最小值 avg()平均值 sum() 计算和 now() 现在的时间 select now();
用户管理
1. 登录
远程登陆: 客户端语法:mysql -u 用户名 -p 密码 -h ip地址 -P端口号:如果没有改端口号就不用-P指
# mysql -h192.168.246.253 -P 3306 -uroot -pqf123 -e 'show databases;'
-h 指定主机名 【默认为localhost】
-大P MySQL服务器端口 【默认3306】
-u 指定用户名 【默认root】
-p 指定登录密码 【默认为空密码】
-e 接SQL语句,可以写多条拿;隔开
# mysql -h192.168.246.253 -P 3306 -uroot -pqf123 -D mysql -e 'select host from user;'
此处 -D mysql为指定登录的数据库
修改端口rpm安装:vim /etc/my.cnf 在到【mysql】标签下面添加port=指定端口。重启服务
#2.创建用户
方法一:CREATE USER语句创建 mysql> create user tom@'localhost' identified by 'qf@123'; #创建用户为tom,并设置密 码。
mysql> FLUSH PRIVILEGES; #更新授权表
在用户tom@' ' 这里 选择:
%:允许远程登陆。也可以指定某个ip,允许某个ip登陆。也可以是一个网段。
%:包括所有的主机,不包括本机(127.0.0.1),但是不包括(localhost) ==客户端主机
% 所有主机
192.168.246.% 192.168.246.0网段的所有主机 #%代表所有内容 _ 代表某一个字符
192.168.246.252 指定主机
localhost 指定主机
方法二: GRANT语句创建 ---授权。
mysql> GRANT ALL ON *.* TO '用户名'@’localhost’ IDENTIFIED BY '密码'; -- 授权并设置密码
revoke 权限 on 数据库.表 from '用户'@'客户端来源IP地址' -- 取消权限
修改远程登陆: 将原来的localhost修改为%或者ip地址
mysql> use mysql
mysql> update user set host = '192.168.246.%' where user = 'user3'; mysql> FLUSH PRIVILEGES;
grant 权限列表 on 库名.表名 to '用户名'@'客户端主机' IDENTIFIED BY 'Qf@123';
==权限列表 all 所有权限(不包括授权权限) select,update select, insert
#删除用户
方法一:DROP USER语句删除 DROP USER 'user3'@'localhost';
DELETE FROM mysql.user WHERE user='tom' AND host='localhost';
3授权信息
查看生效的授权信息
针对所有库和表的权限,比如 `*.*` 。 去 `mysql.user` 中查看
库名.* mysql.db 对应 对具体一个库的所有表授权
库名.表名 mysql.tables_priv 对应 对具体的表授权
1.看自己的权限: mysql> SHOW GRANTS\G
2.看别人的权限: mysql> SHOW GRANTS FOR tom@'localhost'\G
**假如是 MySQL8.x**
CREATE USER '你的用户名'@'localhost' IDENTIFIED BY '你的密码';
#创建新的用户
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'localhost';
#把刚刚创建的数据库的管理权限给予刚刚创建的MySQL用户
FLUSH PRIVILEGES;
#刷新权限,使用设置生效
权限控制机制
四张表:user db tables_priv columns_priv
1.用户认证
查看mysql.user表
2.权限认证
以select权限为例:
1.先看 user表里的select_priv权限
Y:不会接着查看其他的表 拥有查看所有库所有表的权限
N:接着看db表
2.db表: 存储了某个用户对一个数据库的权限。
Y:不会接着查看其他的表 拥有查看所有库所有表的权限
N:接着看tables_priv表
3.tables_priv表:
可以对单个表进行权限设置 table_priv:
如果这个字段的值里包括select 拥有查看这张表所有字段的权限,不会再接着往下看了 table_priv:
如果这个字段的值里不包括select,接着查看下张表还需要有column_priv字段权限
4.columns_priv:针对数据列设置操作权限.
column_priv:有select,则只对某一列有select权限 没有则对所有库所有表没有任何权限
注:其他权限设置一样
其他内容
mysql 的配置文件 /etc/my.cnf
在[myslqld]
下面可以修改端口 port=端口号 默认3306
datadir=/var/lib/mysql # myslq 的数据库存放地方
1.最后一行添加
[mysql]
user=root
password='密码'
# 这时可以直接mysql 登录数据库 不用输入账户密码
2.初始化mysql,回到刚装的状态 #第一种
rm -rf /var/lib/mysql/*
rm -rf /var/log/mysqld.log
vim /etc/my.cnf 给还原到最开始的状态,也就是有添加的的内容的话,删除了,没有的话不用管
然后建立mysql 用户,初始化数据库
mysqld --initialize --user=mysql
touch /var/log/mysqld.log
chown -R mysql.mysql /var/log/
systemctl restart mysqld
grep password /var/log/mysqld.log
修改密码登录就就可以了
#简单初始化 这样就可以了
systemctl stop mysqld
rm -rf /var/lib/mysql/*
vim /etc/my.cnf 给还原到最开始的状态,也就是有添加的的内容的话,删除了,没有的话不用管
systemctl restart mysqld
grep password /var/lib/mysqld.log
3.mysql 里面还有一个edit 相当于 vim
mysql>edit 然后会出现一个编辑文本 可以把你的命令写进去,然后保存退出加;就可以执行了