标签:生日 mysql基础 func arc inno 引号 两种 inux 改变
登录:mysql [-h服务器地址] -u登录名 -P端口号 -p
或mysql [--host=服务器地址] --user=用户名 --port=端口 --password
退出:quit; 或 exit;
备份:mysqldump -h服务器地址 -u登录名 -p密码 [--default-character-set=utf8] [--hex-blob] 要备份的数据库名 > 要保存到的文件
--default-character-set=utf8:设置默认字符集为utf8
--hex-blob:导出blob字段时不加这个参数会可能会错。(eg:用sublime打开保存一下再进行导入就会报"Unknown command ‘\\‘."等错)
恢复:
mysql -h服务器地址 -u登录名 -p密码 [--default-character-set=utf8] 数据库名 < 存有sql语句的文件
source 存有sql语句的文件路径;
(window直接将文件托过去路径是反斜杠分隔,比较深的路径会解释成转义导致无法导入数据库。这时将反斜杠换成正斜杠,或将sql文件移动到前路径就行。)单行注释: #注释内容
或-- 注释内容
(注意,两个“--”之后有一个空格)
多行注释: /*注释内容*/
默认是";",自定义用delimiter
delimiter /
show databases /
mysql本身不区分大小写。
但在某些区分大小写的操作系统中,数据库名和表名会区分大小写。
推荐使用“下划线命名法”来对各种标识符命名:单词都用小写字母,单词之间用“_”分开。
tinyint(1字节),smallint(2字节),mediumint(3字节),int(4字节),bigint(8字节)
在32位系统中:int都是4(32/8)字节
1字节(byte)=8位(bit)
float,double,decimal
单精度浮点型:float,非精确数,通常不设定长度
双精度浮点:double,非精确数,通常不设定长度
定点型:decimal,精确数,通常定点型需要设定长度,形式为:decimal(总长, 小数位数)
date,time,datetime,year,timestamp
写入数据库时,直接的时间日期数据,应该用单引号引起
日期时间类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 |
---|---|---|---|---|---|
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某个时刻 | 00000000000000 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 |
timestamp(时间戳):其实就是指当前时刻,本质上是一个数字,代表从1970年1月1日0点0分0秒到某个时间之间的秒数数值。该类型的字段值无需赋值,而是会自动取得当前时间值(*1970年以前的日期没法表示,所以生日不能用)
列类型 | 显示格式 |
---|---|
TIMESTAMP(14) | YYYYMMDDHHMMSS |
TIMESTAMP(12) | YYMMDDHHMMSS |
TIMESTAMP(10) | YYMMDDHHMM |
TIMESTAMP(8) | YYYYMMDD |
TIMESTAMP(6) | YYMMDD |
TIMESTAMP(4) | YYMM |
TIMESTAMP(2) | YY |
==虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,以前被“隐蔽”的信息将被显示。==
==default可以设置成NOW()或CURRENT_TIMESTAMP(当前日期时间),但不能是UNIX_TIMESTAMP()(当前时间戳)==
varchar,char
varchar类型:可变长度字符串类型。最多能存储65532个字节的字符串(还要考虑字符编码)。设定的长度只是最长长度,但可以不存满,则实际长度以数据长度为准。
char类型:定长字符串类型。最多能存储256个字符。如果存储的数据不足设定的长度,则会自动补空格填满。
binary,varbinary
binary:类似char,只是里面不存“文本”,而是存文本的二进制数据
varbinary: 类似varchar,同样,不存“文本”,而是存文本的二进制数据
text,blob
text:可以存储超大文本,且其实际的长度并不占用一行的长度。相对char和varchar,效率低。
blob:可以存储超大二进制文本,通常用于存储图片这种二进制数据
enum,set
enum:专门用于方便存储类似表单中的单选项的值。enum(‘选项1‘,‘选项2‘,‘选项3‘......)
这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们对应的数字值是:1,2,3,4,5,。。。。。最多6万多个
CREATE TABLE enum_test(
test ENUM(‘option1‘, ‘option2‘, ‘option3‘)
);
INSERT INTO enum_test(test) VALUES(‘option1‘);
INSERT INTO enum_test(test) VALUES(3);
SELECT * FROM enum_test;#1,3;
set:专门用于方便存储类似表单中的多选项的值。
这些选项的值虽然是字符串,但其数据库内部存储其实是数字(效率高),他们对应的数字值是:1,2,4,8,16,。。。。。最多6万多个
CREATE TABLE set_test(
test SET(‘checkbox1‘, ‘checkbox2‘, ‘checkbox3‘)
);
INSERT INTO set_test(test) VALUES(‘checkbox1,checkbox2‘);#逗号后别加空格。eg:checkbox1, checkbox2会解析成checkbox1和 checkbox2,只插入checkbox1。
INSERT INTO set_test(test) VALUES(6);
SELECT * FROM set_test;#12,23
CREATE DATABASE mytest;
show charset;#显示可用字符集
show collation;#显示可用排序规则
2.修改数据库
ALTER DATABASE 数据库名 CHARSET=新字符集 COLLATE=新校对集;
ALTER DATABASE mytest CHARSET=utf8 COLLATE=utf8_bin;
show create database mytest;#查看创建数据的语句
3.删除数据库
DROP DATABASE 数据库名
DROP DATABASE mytest;
create table [if not exists] 表名(字段列表, [约束或索引列表])[表选项列表];
索引是一个“内置表”,该表的数据是对某个真实表的某个(些)字段的数据做了“排序”之后的存储形式
索引极大提高表查找数据的速度(其速度可以匹敌二分查找),但会降低增删改的速度
show full fields from $table_name后
约束就是一种限定数据以符合某种要求的形式
表选项就是对一个表的有关属性的设定,通常都不需要。如果不设定,则有其默认值。
CREATE TABLE IF NOT EXISTS test2_table(
id INT AUTO_INCREMENT NOT NULL COMMENT ‘ID‘,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS test_table(
id INT AUTO_INCREMENT NOT NULL COMMENT ‘ID‘,
field1 FLOAT DEFAULT 22.33,
field2 VARCHAR(20),
field3 INT,
PRIMARY KEY(id),
UNIQUE KEY(field1),
KEY(field2),
FOREIGN KEY(field3) REFERENCES test2_table(id)
)COMMENT = ‘注释‘,ENGINE = MyISAM,AUTO_INCREMENT = 1000;
alter table 表名 修改语句1, 修改语句2,...
增加:ALTER TABLE 表名 ADD 字段名 字段类型 字段属性
修改:ALTER TABLE 表名 CHANGE 原字段名 新字段名 新字段类型 新字段属性
ALTER TABLE 表名 ALTER 字段名 SET DEFAULT 默认值
ALTER TABLE 表名 ALTER 字段名 DROP DEFAULT
删除:ALTER TABLE 表名 DROP 字段名
CREATE TABLE IF NOT EXISTS test(
id INT AUTO_INCREMENT NOT NULL COMMENT ‘ID‘,
PRIMARY KEY(id)
);
ALTER TABLE test ADD COLUMN test FLOAT DEFAULT 22.33;
ALTER TABLE test CHANGE COLUMN test new_test FLOAT DEFAULT 22.33;
ALTER TABLE test DROP COLUMN new_test;
增加:ALTER TABLE 表名 ADD INDEX()/PRIMARY KEY()/FOREIGN KEY()/UNIQUE()
删除:ALTER TABLE 表名 DROP INDEX 索引名/PRIMARY KEY/FOREIGN KEY 外键名
DROP TABLE test;
CREATE TABLE IF NOT EXISTS test(
id INT AUTO_INCREMENT NOT NULL COMMENT ‘ID‘,
test INT,
PRIMARY KEY(id)
);
ALTER TABLE test ADD INDEX test_index(test);
ALTER TABLE test DROP INDEX test_index;
ALTER TABLE 表名 RENAME [TO] 新表名
ALTER TABLE 表名 选项名1=选项值1, 选项名2=选项值2, 选项名3=选项值3,...
CREATE TABLE IF NOT EXISTS test(
id INT AUTO_INCREMENT NOT NULL COMMENT ‘ID‘,
PRIMARY KEY(id)
);
ALTER TABLE test RENAME TO test2;
ALTER TABLE test2 CHARSET=utf8;
drop table [if exists] 表名;
show table status;(用show tables查询查不到表具体信息)
show full columns from 表名;
或,show full fields from 表名;(用desc查询查不到权限和字段注释)
show create table 表名;
方法1:这种方法可以比较完整。
create table tab2 like tab1;//复制结构
insert into tab2 select * from tab1;//复制数据
方法2:这种方法可能会丢一些结构信息,比如:索引,约束,自增长属性
create table tab2 select * from tab1; //同时复制结构和数据
显示表的创建语句: show create table 表名
从已有表复制表结构:create table [if not exists] 新表名 like 原表名
从已有表复制表结构:create table [if not exists] 新表名 select * from 原表名 where 1<>1(不推荐)
delete from 表名 [where条件] [order排序] [limit限定];
truncate [table] 表名;(删除整个表的数据和结构并重新创建该表,自增列重新计算)
说明:
删除语句中where条件通常都要写上,如果不写则就删除了所有数据(应用中极少如此)
order排序子句用于设定删除数据的先后顺序
limit限定子句用于限定在设定的顺序情况下删除指定的某些行
update 表名 set 字段名1=值表达式1, 字段名2=值表达式2,...[where条件] [order排序] [limit限定];
说明:
where条件子句在应用中几乎都必须有,没有就修改了所有数据
order排序子句用于设定删除数据的先后顺序
limit限定子句用于限定在设定的顺序情况下删除指定的某些行
字段的值可以是表达式,或直接值,或函数。同样遵循insert语句中字段的值的写法
select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
说明:
作用是从数据源中找出一定的数据,并作为该语句的返回的数据源(数据集)
数据源就是表,但也可以没有数据源,而是使用直接数据或函数执行结果
用于设定所select出来的数据是否允许出现重复行(完全相同的数据行)
all:允许出现重复行(默认)
distinct:不允许出现重复行
就是指定数据的来源,可以是表,用其他查询语句返回的结果表和多张表
相当于php或js中的if条件语句,其最终结果就是布尔值(true/false)
where true, where 1; where 1=1;都表示true
where false, where 0; where 1<>1;都表示false
where中可用的运算符:
算术运算符:+,-,*,/,%
比较运算符:>,>=,<,<=,=,<>,==(mysql扩展),!=(mysql扩展)
逻辑运算符:and,or,not
布尔值的判断方式:(实际应用中,布尔值判断很少用,因为可以直接使用数学大小。)
布尔值:本质上,布尔值只是一位整数的“别名”,0表示false,非0表示true。
判断为true:XX is true
判断为fale:XX is false
XX应该是一个字段名,且其类型应该是一个整数。
空值的判断方式:
判断为null:XX is null
判断为非空:XX is not null
XX应该是一个字段名
between语法:
XX between 值1 and 值2;
XX应该是一个字段名
in语法:
XX in(值1,值2,...);
XX应该是一个字段名
like语法(模糊查找):
XX like ‘要查找字符‘;
XX应该是一个字段名
%:代表任意个数任意字符(不是字节)
_:代表一个任意字符(不是字节)
group by 字段1 排序方式1, 字段2 排序方式2,...
通常都只进行一个字段的分组。
分组就是将数据以某个字段的值为依据,分到不同的组别里。
分组的结果通常:
在分组查询中,基本都依赖于一下几个函数(聚合函数,统计函数):
select count(sub_type) from table where table.sub_type=‘type’;
select count(if(table.sub_type=‘type‘,1,0)) count1 count(if(table.sub_type=‘type‘,1,0)) count2 from table;
select count(table.sub_type=‘type‘ or null) count1 count(table.sub_type=‘type‘ or null) count2 from table;
having子句其实概念跟where子句完全一样
where是针对"表的字段的值"进行条件判断
having是针对"groupby之后的组数据"进行条件判断
order by 排序字段1 [排序方式], 排序字段2 [排序方式],...
对数据集按指定按某个字段的大小进行排列(排序),排序只有2种方式:
ASC:正序(默认值)
DESC:倒序
如果指定多个字段排序(虽然不常见),则其含义是,在前一个字段排序中相同的那些数据里,再按后一字段的大小进行指定的排序。
形式:
limit [起始行号start], 要取出的行数num
取得数据集局部连续的若干条数据
起始行号:可以省略,为默认行号0(尽量不用,很影响性能)
要取出的行数:如果结果集中从指定的行号开始到最后没有这么多行,则就只取到最后
from 表1 [连接方式] join 表2 [on 连接条件];
连接就是指两个或2个以上的表(数据源)连接起来成为一个数据源
==注意:==
==连接查询过程:==
from 表1 [cross] join 表2;(交叉连接没有on条件)
cross这个词也可以省略,还可以使用inner这个词代替
from 表1 [inner] join 表2 on 表1.字段1=表2.字段2;
找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行
from 表1 left [outer] join 表2 on 表1.字段1=表2.字段2
在内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应本应放右边表的字段的位置就自动补为“null”值。
from 表1 right [outer] join 表2 on 表1.字段1=表2.字段2
在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。
from 表1 full [outer] join 表2 on 表1.字段1=表2.字段2
内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。
selelct 字段或表达式或(子查询1) [as 别名] from 表名或(子查询2) [as 别名] where 字段或表达式或(子查询3)的条件判断
在一个select查询语句中又出现了select查询语句,此时就称后者为“子查询”,前者就是“主查询”
==注意:==
select test.id from test left join (select test.id id from test) as child_test on test.id = child_test.id;
select column1,(select column1 from table2) as tb2_col1 from table1; #这里子查询应该只有一个数据(一行一列,标量子查询)
select column1 from table1 where column1 in (select column1 from table2); #这里子查询可以是多个数据(多行一列,列子查询,以及标量子查询)
select column1 from (select column1, column2 from table2) as tb2; #这里子查询可以是任意查询结果(表子查询)
where 操作数 in(列子查询);
表示该操作数等于该子查询的其中任意一个只,就算满足条件
where 操作数 比较运算符 any (列子查询);
表示该操作数的值只要跟列子查询的任意一个值满足给定的比较运算,就算满足了条件
where 操作数 比较运算符 all/some (列子查询);
该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件
where exists (子查询);
如果要查询的字段在子查询中返回true
where not exists (子查询);
如果要查询的字段在不子查询中返回true
联合查询就是将两个select语句的查询结果“层叠”到一起成为一个结果。
两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。
(select语句1) union [ALL | DISTINCT] (select 语句2) [order by排序] [limit限定];
mysql中,权限是系统内定的一些名词,大约30个,每个权限表示可以做什么工作。
分配权限就是相当于让某个用户可以做哪些工作。
创建用户或分配权限后必须刷新权限:flush privileges;
create user ‘用户名‘@‘允许其登录的地址‘ identified by ‘密码‘;
说明:
GRANT ALL ON 库.* to ‘用户‘@‘localhost‘ IDENTIFIED BY ‘密码‘;
)drop user ‘用户名‘@‘允许其登录的地址‘;
增加权限:
grant 权限名1, 权限名2,... on 数据库名.对象名 to ‘用户名‘@‘允许其登录的地址‘ identified by ‘密码‘;
说明:
删除权限:
revoke 权限名1,权限名2,... on 数据库名.对象名 from ‘用户名‘@‘允许其登录的地址‘;
表示从某个用户身上“取消”某些权限(也许还保留了其他权限)。
mysql用户表位于mysql库下,eg:select host, user from mysql.user;
“事务”是一种可以保证“多条语句一次性执行完成”或“一条都不执行”的机制。
事务模式:让每条执行语句是否当作“一个事务”来看到的设定项。
mysql默认安装好之后,其事务模式是:一条语句当作一个事务。
set autocommit = 0;//false
,关闭自动提交模式,即此时不再是一条语句一个事务了必须使用commit语句才能够生效。
FIND_IN_SET(要找的字符串,被寻找的字符串)
REPLACE(要替换的字符串,‘被替换的字符‘,‘替换的字符‘)
在mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法。
但又有所区别:
一个bigin...end;块,可以给定一个“标识符”,并且可以使用leave语句来“退出”该语句块。
if语句
case语句
while循环语句
有两种环境:
两种变量:
变量的赋值语法:
CREATE FUNCTION 存储函数名(形参1 类型1, 形参2 类型2,...)
RETURNS 返回类型
BEGIN
要执行的代码
RETURN XX;
END;
CREATE PROCEDURE 存储过程名([IN|OUT|INOUT]形参1 类型1, ([IN|OUT|INOUT]形参2 类型2,...)
BEGIN
要执行的代码,增加删除修改查询语句。
END;
触发器其实是预先定义好的一段代码。该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行。
通常就这几个情形:对某个数据表的增(或删或改)之前(或之后)。一共6种
CREATE TRIGGER 触发器名字 BEFORE(或AFTER)INSERT(或UPDATE或DELETE)ON 表名 FOR EACH ROW
BEGIN
要执行的代码,但这里也不能使用SELECT语句。
END;
3范式(3NF)
第一范式(1NF)原子性:一个字段不存两类数据
第二范式(2NF)唯一性:非主键字段完全依赖于主键字段(别一张表里两行数据才能确定一个信息)
第三范式(3NF)独立性:每张表只存一种数据(减少冗余)
select inet_aton(‘127.0.0.1‘);#2130706433
select inet_ntoa(‘2130706433‘);#127.0.0.1
方法1:
select (@i:=@i+1) as i,tablename.* from tablename,(select @i:=0) as table1;
方法2:
set @rownum=0;
select @rownum:=@rownum+1 as rownum, tablename.* from tablename;
mysqli_query($link, ‘SET NAMES utf8‘);
执行SET NAMES utf8
的效果等同于同时设定如下:
SET character_set_client=‘utf8‘;
SET character_set_connection=‘utf8‘;
SET character_set_results=‘utf8‘;
php执行mysqli_query($link, ‘CHARSET utf8‘);
还是会乱码(dos下执行CHARSET不会乱码,并且和SET NAMES utf8一样改变了client,connection,results)。
mysql> show variables like ‘%character%‘;
character_set_client
character_set_connection
character_set_database
character_set_filesystem
character_set_results
character_set_server
character_set_system
character_sets_dir
标签:生日 mysql基础 func arc inno 引号 两种 inux 改变
原文地址:https://www.cnblogs.com/jffun-blog/p/9732557.html