Mysql
Posted Dreamkily
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql相关的知识,希望对你有一定的参考价值。
2017-09-13
1.sql语句规范:
sql是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持sql。
<1> 在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。建议命令大写,表名库名小写;
<2> SQL语句可单行或多行书写,以“;”结尾。关键词不能跨多行或简写。
<3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。
SELECT * FROM tb_table WHERE NAME="YUAN";
<4> 注释:单行注释:--
多行注释:/*......*/
<5>sql语句可以折行操作
2.数据类型
作用:存储年龄,等级,id,手机号,身高,薪水等数字
2.1 无符号类型
=========有符号和无符号tinyint========== #tinyint默认为有符号 MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号 MariaDB [db1]> desc t1; MariaDB [db1]> insert into t1 values -> (-129), -> (-128), -> (127), -> (128); MariaDB [db1]> select * from t1; +------+ | x | +------+ | -128 | #-129存成了-128 | -128 | #有符号,最小值为-128 | 127 | #有符号,最大值127 | 127 | #128存成了127 +------+ #设置无符号tinyint MariaDB [db1]> create table t2(x tinyint unsigned); MariaDB [db1]> insert into t2 values -> (-1), -> (0), -> (255), -> (256); MariaDB [db1]> select * from t2; +------+ | x | +------+ | 0 | -1存成了0 | 0 | #无符号,最小值为0 | 255 | #无符号,最大值为255 | 255 | #256存成了255 +------+
2.1 显示长度和存储字节
mysql> create table test(id int); Query OK, 0 rows affected (0.01 sec) mysql> desc test; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ row in set (0.00 sec)
int(11)是默认的显示宽度,因为int是用4个字节存储,所以能存储的最大数就是4294967295,是一个十位数字,对于无符号类型,所以默认显示宽度就是11;
同理:tinyint的默认显示宽度是4位。
2.3 decimal类型
float:浮点型,含字节数为4,32bit, 数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit 数值范围-1.7E308~1.7E308(15个有效位) decimal:数字型,128 数值范围 ±1.0 × E28 to ±7.9 × E28(28个有效位)
decimal的精度比double大,所能储存的最大数却比double要小 。decimal是存在精度损失的,只不过较小而已!
2.4 BIT
BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
bin()显示为二进制
hex()显示为十六进制
mysql> create table t(id bit); Query OK, 0 rows affected (0.03 sec) mysql> desc t; +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ row in set (0.00 sec) mysql> insert t values (1); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +------+ | id | +------+ | | +------+ row in set (0.00 sec) mysql> select bin(id) from t; +---------+ | bin(id) | +---------+ | 1 | +---------+ row in set (0.00 sec)
mysql> alter table t modify id bit(5); Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t values(8); Query OK, 1 row affected (0.00 sec) mysql> select bin(id),hex(id) from t; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 1000 | 8 | +---------+---------+ rows in set (0.00 sec)
2.5 字符串类型
存储字符串:
CHAR系列 :CHAR VARCHAR
TEXT系列 : TINYTEXT TEXT MEDIUMTEXT LONGTEXT
存储二进制数据:
BINARY系列: BINARY VARBINARY
BLOB 系列 : TINYBLOB BLOB MEDIUMBLOB LONGBLOB
解析:
/* char (m) CHAR列的长度固定为创建表时声明的长度: 0 ~ 255。其中m代表字符串的长度。 PS: 即使数据小于m长度,也会占用m长度 varchar(m) VARCHAR列中的值为可变长字符串,长度: 0 ~ 65535。其中m代表该数据类型所允许保存的字符串 的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。 注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度 更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡 text text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。 mediumtext A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters. longtext A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters. */
注意:
在查询的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格。 mysql> create table t1(x char(5),y varchar(5)); mysql> insert into t1 values(\'你瞅啥 \',\'瞅你妹 \'); mysql> select x,length(x),y,length(y) from t1; +--------+-----------+----------+-----------+ | x | length(x) | y | length(y) | +--------+-----------+----------+-----------+ | 你瞅啥 | 9 | 瞅你妹 | 11 | +--------+-----------+----------+-----------+
2.6 日期类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
2.7 year
============year=================== create table t_year(born_year year); insert into t_year values (1901), (2155); select * from t_year; +-----------+ | born_year | +-----------+ | 1901 | | 2155 | +-----------+ rows in set (0.00 sec)
2.8 data and datatime
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2017-08-01 19:38:54 |
+---------------------+
1 row in set (0.00 sec)
============date,time,datetime===========
create table t_mul(d date,t time,dt datetime);
insert into t_mul values(now(),now(),now());
select * from t_mul;
mysql> select * from t_mul;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2017-08-01 | 19:42:22 | 2017-08-01 19:42:22 |
+------------+----------+---------------------+
row in set (0.00 sec)
2.9 timestamp
create table t_stamp(t TIMESTAMP); insert into t_stamp values(); insert into t_stamp values(NULL ); select * from t_stamp; +---------------------+ | t | +---------------------+ | 2017-08-01 19:46:24 | | 2017-08-01 19:46:24 | +---------------------+ rows in set (0.00 sec)
datatime and timestamp
/* 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒, 但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。 在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的 空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间 (CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默 认更新为当前时间。 */ datetime与timestamp
2.10 枚举类型和集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
解析:
/* 枚举类型(enum) An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) 示例: CREATE TABLE shirts ( name VARCHAR(40), size ENUM(\'x-small\', \'small\', \'medium\', \'large\', \'x-large\') ); INSERT INTO shirts (name, size) VALUES (\'dress shirt\',\'large\'), (\'t-shirt\',\'medium\'), (\'polo shirt\',\'small\'); 集合类型(set) A SET column can have a maximum of 64 distinct members. 示例: CREATE TABLE myset (col SET(\'a\', \'b\', \'c\', \'d\')); INSERT INTO myset (col) VALUES (\'a,d\'), (\'d,a\'), (\'a,d,a\'), (\'a,d,d\'), (\'d,a,d\'); */
3 数据库操作
-- 1.创建数据库(在磁盘上创建一个对应的文件夹) create database [if not exists] db_name [character set xxx] -- 2.查看数据库 show databases;查看所有数据库 show create database db_name; 查看数据库的创建方式 -- 3.修改数据库 alter database db_name [character set xxx] -- 4.删除数据库 drop database [if exists] db_name; -- 5.使用数据库 切换数据库 use db_name; -- 注意:进入到某个数据库后没办法再退回之前状态,但可以通过use进行切换 查看当前使用的数据库 select database();
4 数据表操作
4.1 创建表
-- 语法 CREATE TABLE tab_name( field1 type[完整性约束条件], field2 type, ... fieldn type )[character set xxx];
示例:
CREATE TABLE employee( id int primary key auto_increment , name varchar(20), gender bit default 1, birthday date, department varchar(20), salary double(8,2) unsigned, resume text );
4.2 查看表信息
desc tab_name 查看表结构 show columns from tab_name 查看表结构 show tables 查看当前数据库中的所有的表 show create table tab_name 查看当前数据库表建表语句
4.3 修改表结构
-- (1)增加列(字段) alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名]; #添加多个字段 alter table users2 add addr varchar(20), add age int first, add birth varchar(20) after name; -- (2)修改一列类型 alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名]; -- (3)修改列名 alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名]; -- (4)删除一列 alter table tab_name drop [column] 列名;-- (5)修改表名 rename table 表名 to 新表名; -- (6)修该表所用的字符集 alter table student character set utf8;
4.4 删除表
drop table tab_name;
5 表记录操作
5.1 增加表记录
/* <1>插入一条记录: insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); <2>插入多条记录: insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......), (value1,value2,.......), ... ; <3>set插入: insert [into] tab_name set 字段名=值 */
示例:
INSERT employee (name,gender,birthday,salary,department) VALUES ("alex",1,"1985-12-12",8000,"保洁部"), ("egon",1,"1987-08-08",5000,"保安部"), ("yuan",1,"1990-06-06",20000,"教学部"); INSERT employee VALUES (8,"女神",0,"1992-02-12","教学部",7000,""); INSERT employee SET name="wusir",birthday="1990-11-11";
5.2修改表记录
update tab_name set field1=value1,field2=value2,......[where 语句]
示例:
update employee_new set birthday="1989-10-24" WHERE id=1; --- 将yuan的薪水在原有基础上增加1000元。 update employee_new set salary=salary+4000 where name=\'yuan\';
5.3 删除表记录
方式1: delete from tab_name [where ....] 方式2: truncate table emp_new; /* 如果不跟where语句则删除整张表中的数据 delete只能用来删除一行记录 delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在 事务中恢复。 */
示例:
-- 删除表中名称为’alex’的记录。 delete from employee_new where name=\'alex\'; -- 删除表中所有记录。 delete from employee_new; -- 注意auto_increment没有被重置:alter table employee auto_increment=1;
6 查询表记录
-- 查询语法: SELECT *|field1,filed2 ... FROM tab_name WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 -- Mysql在执行sql语句时的执行顺序: -- from where select group by having order by
6.1 准备表和数据
CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), gender ENUM("male","female","other"), age TINYINT, dep VARCHAR(20), city VARCHAR(20), salary DOUBLE(7,2) ); INSERT INTO emp (name,gender,age,dep,city,salary) VALUES ("yuan","male",24,"教学部","河北省",8000), ("egon","male",34,"保安部","山东省",8000), ("alex","male",28,"保洁部","山东省",10000), ("景丽阳","female",22,"教学部","北京",9000), ("张三", "male",24,"教学部","河北省",6000), ("李四", "male",32,"保安部","北京",12000), ("王五", "male",38,"教学部","河北省",7000), ("赵六", "male",19,"保安部","河北省",9000), ("猪七", "female",24,"保洁部","北京",9000); SELECT * FROM emp;
mysql> SELECT * FROM emp; +----+-----------+--------+------+-----------+-----------+----------+ | id | name | gender | age | dep | city | salary | +----+-----------+--------+------+-----------+-----------+----------+ | 1 | yuan | male | 24 | 教学部 | 河北省 | 8000.00 | | 2 | egon | male | 34 | 保安部 | 山东省 | 8000.00 | | 3 | alex | male | 28 | 保洁部 | 山东省 | 10000.00 | | 4 | 景丽阳 | female | 22 | 教学部 | 北京 | 9000.00 | | 5 | 张三 | male | 24 | 教学部 | 河北省 | 6000.00 | | 6 | 李四 | male | 32 | 保安部 | 北京 | 12000.00 | | 7 | 王五 | male | 38 | 教学部 | 河北省 | 7000.00 | | 8 | 赵六 | male | 19 | 保安部 | 河北省 | 9000.00 | | 9 | 猪七 | female | 24 | 保洁部 | 北京 | 9000.00 | +----+-----------+--------+------+-----------+-----------+----------+ rows in set (0.00 sec)
6.2 where字句过滤查询
-- where字句中可以使用: -- 比较运算符: > < >= <= <> != between 80 and 100 值在10到20之间 in(80,90,100) 值是10或20或30 like \'以上是关于Mysql的主要内容,如果未能解决你的问题,请参考以下文章连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段
使用 json rereiver php mysql 在片段中填充列表视图
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段