MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型:
tinyint smallint mediumint int bigint float double
decimal(size,d) numeric(size,d) 等价
"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。
日期和时间类型:
date YYYY-MM-DD
time HH:MM:SS
year YYYY
datetime YYYY-MM-DD HH:MM:SS
timestamp YYYYMMDD HHMMSS TIMESTAMP类型有专有的自动更新特性
字符串类型:
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
------------------------------------------------------------------------------------
创建MySQL数据表需要以下信息:
表名
表字段名
定义每个表字段
国家标准GB2312: 一个汉字=2个字节
UTF-8:一个汉字=3个字节(一般)
首先要确定mysql版本
4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节)
5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以
存放50个
create table nangua(nangua_id INT NOT NULL AUTO_INCREMENT,
nangua_title VARCHAR(200),
nangua_author VARCHAR(30),
nangua_date DATE,
PRIMARY KEY(NANGUA_ID));
不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
PHP方式创建:
header("content-type:text/html;charset=utf-8");
$con=mysql_connect(‘localhost‘,‘root‘,123);
if(!$con){
die(‘不能连接到数据库‘.mysql_error());
}
echo ‘成功连接数据‘.‘<br/>‘;
$sql="create table qiezi(".
"nangua_id INT NOT NULL AUTO_INCREMENT,".
"nangua_title VARCHAR(200),".
"nangua_author VARCHAR(30),".
"nangua_date DATE,".
"PRIMARY KEY(nangua_id)".
")";
mysql_select_db(‘managerie‘);
$newtable=mysql_query($sql,$con);
if(!$newtable){
die(‘不能创建表‘.mysql_error());
}
echo ‘成功创建表!‘.‘<br/>‘;
mysql_close($con);
------------------------------------------------------------------------------------
删除表:
header("content-type:text/html;charset=utf-8");
$con=mysql_connect(‘localhost‘,‘root‘,123);
if(!$con){
die(‘不能连接到数据库‘.mysql_error());
}
echo ‘成功连接数据‘.‘<br/>‘;
mysql_select_db(‘managerie‘);
$sql=‘DROP TABLE qiezi‘;
$drop=mysql_query($sql,$con);
if(!$drop){
die(‘未删除成功‘.mysql_error());
}
echo ‘删除成功!‘;
mysql_close($con);
------------------------------------------------------------------------------------
插入数据:
<?php
header(‘content-type:text/html;charset=utf-8‘);
if(isset($_POST[‘sub‘])){
$con=mysql_connect(‘localhost‘,‘root‘,‘123‘);
if(!$con){
die(‘连接不成功!‘.mysql_error());
}
echo ‘链接成功!‘;
if(! get_magic_quotes_gpc()){
$nangua_title=addslashes($_POST[‘nangua_title‘]);
$nangua_author=addslashes($_POST[‘nangua_author‘]);
$nangua_date=addslashes($_POST[‘nangua_date‘]);
}else{
$nangua_title=$_POST[‘nangua_title‘];
$nangua_author=$_POST[‘nangua_author‘];
$nangua_date=$_POST[‘nangua_date‘];
}
$sql="create table kk4(".
"nangua_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT ,".
"nangua_title VARCHAR(200),".
"nangua_author VARCHAR(100),".
"nangua_date DATE,".
"PRIMARY KEY(nangua_id)".
")";
mysql_select_db(‘managerie‘);
if(mysql_num_rows(mysql_query("SHOW TABLES LIKE ‘kk4‘"))==0){
$newtable=mysql_query($sql,$con);
if(!$newtable){
die(‘创建表不成功‘.mysql_error().‘<br/>‘);
}
echo ‘创建表成功‘.‘<br/>‘;
}
$insert_sql="INSERT INTO kk4(".
"nangua_title,nangua_author,nangua_date)".
"VALUES".
"(‘$nangua_title‘,‘$nangua_author‘,‘$nangua_date‘)";
$write=mysql_query($insert_sql,$con);
if(!$write){
die(‘写入数据不成功‘.mysql_error().‘<br/>‘);
}
echo ‘写入数据成功!‘;
mysql_close($con);
}
else{
?>
<form method="post" action="<?php $_PHP_SELF ?>">
<table width="600" border="0" cellspacing="1" cellpadding="2">
<tr>
<td width="250">Tutorial Title</td>
<td>
<input name="nangua_title" type="text" id="nangua_title">
</td>
</tr>
<tr>
<td width="250">Tutorial Author</td>
<td>
<input name="nangua_author" type="text" id="nangua_author">
</td>
</tr>
<tr>
<td width="250">Submission Date [ yyyy-mm-dd ]</td>
<td>
<input name="nangua_date" type="text" id="nangua_date">
</td>
</tr>
<tr>
<td width="250"> </td>
<td> </td>
</tr>
<tr>
<td width="250"> </td>
<td>
<input name="sub" type="submit" id="sub" value="">
</td>
</tr>
</table>
</form>
<?php
}
?>
------------------------------------------------------------------------------------
SELECT 查询数据:
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
查询语句中可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
可以使用 WHERE 语句来包含任何条件。
可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
可以使用 LIMIT 属性来设定返回的记录数。
header(‘content-type:text/html;charset=utf-8‘);
$con=mysql_connect(‘localhost‘,‘root‘,‘123‘);
if(!$con){
die(‘连接不成功!‘.mysql_error());
}
echo ‘链接成功!‘;
$sql="SELECT nangua_title,nangua_author,nangua_date FROM kk4";
mysql_select_db(‘managerie‘);
$return_result=mysql_query($sql,$con);
if(!$return_result){
die(‘查询不到数据‘.mysql_error());
}
while($row=mysql_fetch_array($return_result,MYSQL_ASSOC)){
echo "标题是:{$row[‘nangua_title‘]}<br/>".
"作者是:".$row[‘nangua_author‘].‘<br/>‘.
"发表时间是:{$row[‘nangua_date‘]}<br/>";
}
mysql_free_result($con);
echo ‘遍历完成!‘;
mysql_close($con);
在我们执行完SELECT语句后,释放游标内存是一个很好的习惯。 。可以通过PHP函数mysql_free_result()来实现
内存的释放。
------------------------------------------------------------------------------------
UPDATE 更新修改数据:
需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作
$sql="UPDATE kk4 SET nangua_title=11111111111 WHERE nangua_id =122";
mysql_select_db(‘managerie‘);
$return_result=mysql_query($sql,$con);
------------------------------------------------------------------------------------
DELETE删除:
$sql="DELETE FROM kk4 WHERE nangua_title=11111111111";
------------------------------------------------------------------------------------
LIKE子句:
LIKE 子句中使用百分号(%)字符来表示任意字符,类似于UNIX或正则表达式中的星号 (*)
如果没有使用百分号(%), LIKE 子句与等号(=)的效果是一样的。
$sql=‘SELECT nangua_id FROM kk4 WHERE nangua_author LIKE "4%" ‘;
mysql_select_db(‘managerie‘);
$return_result=mysql_query($sql,$con);
while($xx=mysql_fetch_assoc($return_result)){
echo "{$xx[‘nangua_id‘]}";
}
------------------------------------------------------------------------------------
ORDER BY 排序子句
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
$sql=‘SELECT nangua_date FROM kk4 ORDER BY nangua_id DESC‘;
mysql_select_db(‘managerie‘);
$return_result=mysql_query($sql,$con);
while($xx=mysql_fetch_array($return_result,MYSQL_ASSOC)){
echo "{$xx[‘nangua_date‘]}<br/>";
}
------------------------------------------------------------------------------------
select VERSION(); 查看mysql版本信息
如需从列中仅选取唯一不同的值,需要使用 SELECT DISTINCT 语句:
select current_date(); 查看当前日期 select curdate();
select 5*2; 计算
select now(); 查看当前时间
\c 取消
quit 退出 \q 退出
select user(); 查看当前用户
LOAD DATA LOCAL INFILE ‘/path/pet.txt‘ INTO TABLE pet; 载入文本文件到数据库
LINES TERMINATED BY ‘\r\n‘;
YEAR() 截取年份
right(curdate(),5)回最右边的len个字符的字符串
drop 删除表 删除数据库 drop table if exists kk4; drop database kk4;
alter 修改表结构 删除 增加列
alter table test rename test1; //修改表名
ALTER TABLE table_name ADD column_name datatype //增加列
ALTER TABLE table_name DROP COLUMN column_name //删除列
ALTER TABLE `TableName` MODIFY COLUMN `FieldName` VARCHAR(14) //修改列属性
alter table pp modify id int default 1; 修改列属性
alter table pp change id newid int; 修改列名
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值不要使用引号。
TOP 子句
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
select * from name limit 4;
select * from name order by id desc limit 2;
要先order by再limit
"%" 可用于定义通配符(模式中缺少的字母)一个或者多个
select * from name where firstname like ‘%7‘;
不包含:not like
select * from name where firstname not like ‘%7%‘;
% 替代一个或多个字符
_ 仅替代一个字符
IN 操作符允许我们在 WHERE 子句中规定多个值。
select * from name where firstname in (‘bb8‘,‘bb6‘);
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
注意 不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。
select * from name where newid between 2 and 7; mysql是包含2和7的
别名 alias AS或者省略 一般多表查询的时候加个别名比较方便一点
select * from name as n where n.firstname=‘bb3‘;
select * from name n where n.firstname=‘bb3‘;
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName=‘Adams‘ AND p.FirstName=‘John‘
JOIN==inner join: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行 mysql不支持
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中
的列的顺序必须相同。
select into mysql不支持
约束用于限制加入表的数据的类型
NOT NULL
UNIQUE 约束 唯一的 unique和primary key 区别是一个表中主键只能有一个
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE, 设置约束
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
删除约束
alter table nangua drop index name ;
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束:
alter table nangua add unique(Id_P)
命名unique 约束
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
foreign key 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes‘)
)
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes‘)
ALTER TABLE Persons
DROP CHECK chk_Person
alter table users AUTO_INCREMENT=10000; 修改起始值
default 设置默认值
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes‘
)
ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES‘
CREATE INDEX 语句用于在表中创建索引。
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的
做法是仅仅在常常被搜索的列(以及表)上面创建索引。
CREATE INDEX PersonIndex
ON Person (LastName)
CREATE INDEX PersonIndex
ON Person (LastName DESC)
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
ALTER TABLE table_name DROP INDEX index_name
SQL Date 函数:
NOW() 函数返回当前的日期和时间。
alter table wokao add orderdate datetime not null default now();
insert into wokao (name,age2)values(‘z‘,20);
CURDATE() 函数返回当前的日期。
select curdate();
CURTIME() 函数返回当前的时间。
DATE() 函数返回日期或日期/时间表达式的日期部分。
date(curtime()) 提取日期部分
EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
EXTRACT(unit FROM date) date 参数是合法的日期表达式。
SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,
EXTRACT(MONTH FROM OrderDate) AS OrderMonth,
EXTRACT(DAY FROM OrderDate) AS OrderDay
FROM Orders
WHERE OrderId=1
select extract(year from orderdate) from wokao;
DATE_ADD() 函数向日期添加指定的时间间隔。
select date_add(orderdate,interval 2 week) from wokao where id=102;
DATE_SUB() 从日期减去指定的时间间隔
select date_sub(orderdate,interval 2 week) from wokao where id=102;
DATEDIFF() 返回两个日期之间的天数
DATEDIFF(date1,date2)
SQL函数:
select avg(nihao) from wokao; 求平均数
count COUNT() 函数返回匹配指定条件的行数。
select count(nihao) from wokao where nihao=12;
select count(distinct nihao) from wokao; 去掉重复的
FIRST() 函数
FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
//mysql 没有first函数
MAX() 函数
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
select max(nihao) from wokao;
SUM() 函数
SUM 函数返回数值列的总数(总额)。
GROUP BY 语句 分类汇总。
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
select name,sum(nihao) from wokao group by nihao;
select name,sum(nihao) from wokao group by nihao order by nihao desc
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和
having字句前。而 having子句在聚合后对组记录进行筛选。
select name,sum(nihao) from wokao group by name having sum(nihao)<20;
select name,sum(nihao) from wokao where name=‘nn‘ group by name having sum(nihao)<20;
UCASE() 函数
UCASE 函数把字段的值转换为大写。
SELECT UCASE(column_name) FROM table_name
LCASE() 函数
LCASE 函数把字段的值转换为小写。
MID() 函数
MID 函数用于从文本字段中提取字符。
SELECT MID(column_name,start[,length]) FROM table_name
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
select mid(nihao,1,1) from wokao;
ROUND() 函数
ROUND 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM table_name
select round(ff,2) from wokao;