Mysql的连接方式:
1.原生函数:mysql_connect($server,$username,$password); //打开一个到Mysql服务器的连接
mysql_select_db($dbname); //选择Mysql数据库
mysql_query(); //发送一条mysql查询
mysql_fetch_assoc(); //读取返回的资源,返回一个以字段为下标的数组,相当于mysql_fetch_array('',MYSQL_ASSOC)
mysql_fetch_row(); //读取返回资源,数字数组,以数字为下标
mysql_fetch_array(); //读取返回资源,返回一个关联数组,也可是一个数字数组,或是两者兼有,如果加上第二个参数MYSQL_ASSOC,
mysql_num_rows(); //取得查询结果集总数
mysql_affected_rows(); // 判断操作是否成功,返回受影响的行数
mysql_insert_id(); //获取上一条insert操作的id
<?php
// 1,打开数据库连接
// 2,选择要操作的数据库
//$db=[
// 'server'=>'localhost:3306',//ip hostname:port mysql默认端口3306
// 'username'=>'root',
// 'password'=>'123456'
//];// 数据库配置信息
$db=include 'db_config.php';
$con=@mysql_connect($db['server'], $db['username'], $db['password']);
if (!$con){
echo "数据库连接失败:". mysql_error($con);
exit;
}
mysql_select_db("my_blog");// 选择数据库 $sql="select * from v_s_f";//返回全部数据
$result=mysql_query($sql,$con);// 发送一条sql,返回资源类型
//var_dump(mysql_fetch_array($result));// 返回数字下标和字段下标的一个数组
//echo '<br>';
$r=[];
while($row=mysql_fetch_assoc($result)){ //读取数据集合,一般使用assoc,返回以字段为下标的数组
$r[]=$row;
}
echo '<br>'; $sql="select * from v_s_f where price=1";
$row= mysql_query($sql,$con);
var_dump(mysql_fetch_row($row));// 读取一条数据 $sql="update fruit set fruit_name='青苹果3' where id=2";
$result=mysql_query($sql, $con);
$rows= mysql_affected_rows();//更新操作是否成功,返回的是受影响的行数
if($rows){
echo "更新成功";
}else{
echo "更新失败";
} //$sql="insert into fruit(supplier_id,fruit_name,price) values (1,'番茄',4.4)";
//mysql_query($sql,$con);
//$id=mysql_insert_id();//获取上一条insert操作的主键id
//echo $id;
$sql="delete from fruit where id=13";
mysql_query($sql);
$rows= mysql_affected_rows();//受影响的行数
if($rows>0){
echo "更新成功";
}else{
echo "更新失败";
}
2.使用mysqli连接数据库
new 一个连接对象,
对象名->query(); //发送一个sql语句,返回一个result类
$r[]=$row; //把$row每次的结果存放在$r数组中
$result->fetch_assoc(); //读取返回的result类,返回一个以字段为下标的数组
对象名->prepare(sql语句); //准备一条sql语句,返回stmt类,sql语句中的值可用?(通配符)表示,可以用在任何文字数据里,相当于一个模板。
bind_param("isd", $supplier_id,$fruit_name,$price); //绑定参数,对应填充内容。字符串中的特殊字符会自动加上转义字符,防止sql注入
execute(); //执行sql
<?php
//使用mysqli或者是pdo来操作数据库
$db=[
'host'=>'localhost',
'user'=>'root',
'password'=>'123456',
'port'=>'3306',
'db_name'=>'my_blog'
];
// mysqli 是PHP的一个扩展,面向对象
try {
$con=new mysqli($db['host'], $db['user'], $db['password'], $db['db_name'], $db['port']); $sql="select * from v_s_f";//返回数据集合,是一个列表
$result=$con->query($sql);// 返回的是mysqli_result类
if(!$result){
echo "查询失败";
exit;
}
while($row=$result->fetch_assoc()){
$r[]=$row;
}
echo '<br>';
// var_dump($r);
echo '<br>';
$sql="select * from v_s_f where price=1";
$result=$con->query($sql);
$row=$result->fetch_row();//处理单条数据
// print_r($row); $sql="insert into fruit(supplier_id,fruit_name,price) values (1,'山楂',1.2)";
// $result=$con->query($sql);
if(!$result){
echo "插入失败";
exit;
}
// $id=$con->insert_id;
// echo $id; $sql="update fruit set fruit_name='葡萄' where price=1";
$result=$con->query($sql);
if(!$result){
echo "更新失败";exit;
}
// echo $con->affected_rows;//受影响的行 // $smt=$con->prepare("insert into fruit (supplier_id,fruit_name,price) values (?,?,?)");//准备一个sql,返回的是mysqli_stmt类 i-int s-string d-double
//?号是通配符,可以用在任何有文字的数据里,相当于是一个模板
// $supplier_id=2;
// $fruit_name='葡萄柚';
// $price=2.3;
// $smt->bind_param("isd", $supplier_id,$fruit_name,$price);//绑定参数,对应填充内容。字符串中的特殊字符会自动加上转义字符,防止sql注入
// $smt->execute();//执行sql
// echo "插入的数据:".$smt->insert_id;
// echo "<br>"; $smt1=$con->prepare("select fruit_name,price from fruit");
$smt1->execute();
$smt1->bind_result($fruit_name,$price);//绑定的名字可以随意写
while ($smt1->fetch()){
echo $fruit_name.'价格:'.$price."<br>";
}
}catch(Exception $ex){
echo "error:".$con->connect_error;
}
3.使用pdo连接:
PDO->php data object
pdo是PHP的一个扩展类,
<?php
//PDO连接数据库
$dsn="mysql:dbname=my_blog;host=127.0.0.1";//dbname和host顺序可变
$username="root";
$password="123456";
try {
$pdo=new PDO($dsn, $username, $password);
} catch (PDOException $ex) {//抛出错误信息$ex
echo "Error:".$ex->getMessage();//异常错误信息用getmessage()抛出
}
$sql="select * from v_s_f";//返回一个列表
$result=$pdo->query($sql);//返回一个pdo statement object,一个对象
if($result===false){
echo "查询失败";
exit;
}
$rows=$result->fetchAll(PDO::FETCH_ASSOC);//返回以字段为下标的数组,双冒号代表后面的值是一个常量,fetchall读取的是列表
print_r($rows);
$sql="select * from fruit where price=1";
$result=$pdo->query($sql);//查询使用query
$row=$result->fetch(PDO::FETCH_ASSOC);//读取一条数据使用fetch,读取列表使用fetchall
print_r($row);
$sql="update fruit set fruit_name='葡萄柚' where id=4";
$num=$pdo->exec($sql);//exec()返回的是受影响的行数
echo $num; $sql="delete from fruit where id=4";
$num= $pdo->exec($sql);
echo "删除的行数:".$num; $sql="insert into fruit(supplier_id,fruit_name,price) values (2,'香蕉梨',3.4)";
$num=$pdo->exec($sql);
$id=$pdo->lastInsertId();//返回最后一次插入行的id
echo "插入行数:".$num."返回id".$id; $stm=$pdo->prepare("delete from fruit where id=:id");//:id 也可以写成?号
$id=4;
$stm->bindParam(":id", $id, PDO::PARAM_INT);
//$stm=$pdo->prepare("delete from fruit where id=?");
//$stm->bindParam(1, $id, PDO::PARAM_INT);//1是下标
$stm->execute();
echo "删除行数".$stm->rowCount();//返回受影响的行数
这是一个数据库的操作类:
<?php
//数据库操作类,
class Model{
private $pdo;
public $table;//代表要操作的表
static $m=1;
public function __construct() {
try {
$this->pdo=new PDO("mysql:dbname=my_blog;host=localhost", "root", "123456");//,array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)
} catch (PDOException $ex) {
echo "Exception:".$ex->getMessage();//getMessage()获取异常的方法
}//出现异常会抛出,catch会抓取异常信息exception
}
public static function test(){
return self::test1();//调用静态方法用self::
}
public static function test1(){
return self::$m;
}
//获取数据列表
public function getList($sql){
$stm=$this->pdo->query($sql);//pdostatement对象
return $stm->fetchAll(PDO::FETCH_ASSOC);
}
//添加数据 supplier_id=2,fruit_name='' ,price=''
public function insertData($data){//$data必须是一个数组
if(!is_array($data)){
return false;
}
$fileds_arr=array_keys($data);
$fileds_val= array_values($data);
// $val= implode(',', $fileds_val);
$fileds=implode(',', $fileds_arr);
$fileds_len=count($fileds_arr);//获取字段的个数
$i=1;
$val="'{$data[$fileds_arr[0]]}'";//组合成values(1,2,3)
while($i<$fileds_len){
$val.=",'{$data[$fileds_arr[$i]]}'";
$i++;
}
$sql="insert into ".$this->table." ($fileds) values ($val)";//sql语句都是组合出来的
// echo $sql;
return $this->pdo->exec($sql);//返回受影响的行数,带有执行的功能
}
public function del($data){
if(!is_array($data)){
return FALSE;
}
$fileds_arr=array_keys($data);
$len= count($fileds_arr);
$i=0;
$where="1=1";//1=1 and n=2 and m=3
while($i<$len){
$where.=" and $fileds_arr[$i]='".$data[$fileds_arr[$i]]."'";
$i++;
}
$sql="delete from ".$this->table." where ".$where;//delete from fruit where 1=1 and fruit_name='11'
echo $sql;
return $this->pdo->exec($sql);
}
public function updateData($data,$condition){
if(!is_array($data) || !is_array($condition)){
return false;
}
$condition_fileds=array_keys($condition);
$i=0;
$where="";
$len=count($condition_fileds);
while($i<$len){
if($i==0){
$where.="$condition_fileds[$i]='".$condition[$condition_fileds[$i]]."'";
}else{
$where.=" and $condition_fileds[$i]='".$condition[$condition_fileds[$i]]."'";
}
$i++;
}
$data_a= array_keys($data);
$i=0;
$str="";
$len= count($data_a);
while($i<$len){
if($i==0){
$str.="$data_a[$i]='".$data[$data_a[$i]]."'";
}else{
$str.=", $data_a[$i]='".$data[$data_a[$i]]."'";
}
$i++;
}
$sql="update ".$this->table." set ".$str." where ".$where;
return $this->pdo->exec($sql);
}
public function select($fileds="",$condition=array()){
if(empty($fileds)){//没有传字段的情况下查询的是所有字段
$fileds="*";
}
$where="";
if(!empty($condition) && is_array($condition)){
$keys= array_keys($condition);
$i=0;
$where=" where 1=1";
$len= count($keys);
while($i<$len){
$where.= " and $keys[$i]='".$condition[$keys[$i]]."'";
$i++;
}
}
$sql="select ".$fileds." from ".$this->table.$where;
$result= $this->pdo->query($sql);
$row=$result->fetchall(PDO::FETCH_ASSOC);
echo "<pre>";
print_r($row);
}
} //$m=new Model();
//$data=[
// 'supplier_id'=>1,
// 'fruit_name'=>'红苹果',
// 'price'=>3.2
//];
//$condition=['price'=>3.2];
//$fileds="fruit_name,price";
//$m->table="fruit";
////$m->insertData($data);
////$m->del($data);
////echo $m->updateData($data, $condition);
//$m->select($fileds,$condition);
启动Mysql的四种方式:
1.bitnami;
2.任务管理器->服务->wampstactmysql;
3.进程中通过mysqld.exe可以关闭MySQL;
4.通过运行->cmd->net stop/start wampstackmysql 关闭/打开;
命令行操作数据库:
命令行连接数据库的方法:
mysql>create database 数据库名称 //创建数据库
mysql>show create database 数据库名称 //展示内容
mysql>drop database 数据库名称 //删除数据库
mysql>use 数据库名称 //use用在cmd中表示选中要操作的数据库
mysql>select * from 表名;
mysql>show engines\G; //列出支持的存储引擎(不同表之间的存储引擎可以不同)。\G是以列的方式排列(仅在cmd中)
存储引擎:
innerDB 事务型数据库首选引擎,支持事务操作,不支持全文索引
MyISAM 不支持事务操作,支持全文索引
事务:为了保证数据的统一性,正确性。是用户定义的一个操作过程,要么全部操作,要么都不做(若果出现错误,会收到一个返回值,然后判断是否回滚rollback);
事务的使用:1,开启事务mysql>start transaction
2,插入数据/删除数据
insert into 表名(username,password) valuse (22,333);
delete from 表名 where id=3;
3,如果有错误,rollback; 回滚,撤销上面插入/删除的值。同时也有关闭事务的功能;
4,commit操作,保存数据到数据库,关闭事务,只有开始事务的时候才会使用commit。
注意:commit之前的操作对数据库没有任何影响,一直是在内存中进行的,只有使用commit之后才会对数据库中的数据残生影响
show variables like 'storage_engine'; 查看默认的存储引擎(命令行查看)
Navicat中是通过邮件->设计表查看。
Navicat操作数据库:
打开Navicat->连接->mysql
Mysql函数:select version(); 查看当前Mysql的版本号
select username; 查看当前用户名
select last_insert_id(); 获取最后一个自动生成的id
修改数据库root用户的登录的密码:两种方式(命令行)
1,mysqladmin -u username(用户名) -h localhost -p password(当前密码) -> 回车->输入原来的密码->输入新密码->再次输入新密码
2,mysqladmin -u username -h localhost -p password 新密码 ->回车->输入原密码->成功
还可以在navicat中直接修改。
如果root用户密码丢失:两种方法
1,先停止MySQL服务,命令行net stop wampstackmysql(先停止) -> mysqld--skip-grant-tables (跳过grant权限),然后不写密码即可连接数据库
2,打开MySQL->my.ini->在[mysqldump]上面写--skip-grant-tables //mysqld用来启动MySQL数据库的命令
然后打开另一个命令行窗口->mysql -u root
mysql>update mysql.user set password=password('新密码') where user='root' and host='localhost' //重新设置密码
mysql>flush privileges //最后必用这个加载权限表
数据库的备份/还原: 通过命令行要比界面工具快
备份: mysqldump -u root -p dbname(表名)>文件.sql/txt //d:/test.sql 保存为sql或者是txt文件
mysqldump -u root -p --databases dbname1 dbname2 >路径 //备份多个
mysqldump -u root -p --all-database>路径 //备份所有
还原:
mysql -u root -p dbname <路径
SQL语句:
字段属性:
字段类型:varchar 可变类型 25个汉字或字符
int 整型 最多10位
时间戳存成int型
CREATE TABLE test_index(
id INT(11) PRIMARY KEY auto_increment,
username VARCHAR(15),
sex CHAR(1),
INDEX(username) -- 创建一个索引,INDEX
);
INSERT into test_index(username,sex) VALUES(123,1),(123,2),(123,3),(123,1),(123,1),(123,1),(123,1),
(123,1),(123,1),(123,1),(123,1),(123,1),(123,1); explain SELECT * FROM test_index WHERE username=123; EXPLAIN SELECT num FROM num1 UNION SELECT num from num2; CREATE TABLE test_index1(
id INT(11) PRIMARY KEY auto_increment,
username VARCHAR(15),
sex CHAR(1),
UNIQUE INDEX(username) -- 创建一个唯一索引
); CREATE TABLE test_index2(
id INT(11) PRIMARY KEY auto_increment,
username VARCHAR(15),
sex CHAR(1),
INDEX single (username(10)) -- 创建一个单列索引
); CREATE TABLE test_index3(
id INT(11) PRIMARY KEY auto_increment,
username VARCHAR(15),
sex CHAR(1),
INDEX sex_username_idx(sex,username(10)) -- 创建一个组合索引
);
EXPLAIN SELECT * FROM test_index3 WHERE sex=1 and username='';-- EXPLAIN 查看是否用到索引 ALTER TABLE plus_t add unique INDEX (id);-- 在已有的表上增加索引 ALTER TABLE plus_t add INDEX user1 (username);
CREATE INDEX idx on fruit(supplier_id);
CREATE FULLTEXT INDEX idx1 on fruit (fruit_name);-- 全文索引,只能用在MYISAM存储引擎上
alter table plus_t drop index user1;-- drop 删除索引
drop index user1 on plus_t;-- 删除索引,一般情况下不删除索引
查询:
CREATE TABLE plus_t(
id INT(11) PRIMARY KEY auto_increment,
num INT(11)
);
ALTER TABLE plus_t add salary DECIMAL(10,2);
INSERT INTO plus_t(num) VALUES (2);
SELECT num+2 as t1,num/2,num-1 from plus_t;
insert INTO plus_t(num,salary) VALUES (3,3.2);
SELECT salary+3,salary+num,salary/0 FROM plus_t;
SELECT 1=0,''=2,2=2,'0.02'=0,'b'='b',(1+3)=(2+2),NULL=NULL;
INSERT INTO plus_t (num,salary) VALUES ('3a','3.2');
SELECT * FROM plus_t;
SELECT 'goog'<>'gog',1<>2,4!=4,5.5!=5,(1+3)!=(2+1),NULL<>NULL;
SELECT NULL IS NULL, ISNULL(NULL),ISNULL(10),''IS NOT NULL;
SELECT * FROM plus_t WHERE salary IS NOT NULL;
SELECT * FROM plus_t WHERE num BETWEEN 2 AND 4 AND salary IS NOT NULL;
SELECT LEAST(num,salary) FROM plus_t;
SELECT GREATEST(num,salary) FROM plus_t;
SELECT * FROM plus_t where num in (1,2,3);
SELECT * FROM plus_t where num not in (1,2);
ALTER TABLE plus_t add username VARCHAR(15);
INSERT INTO plus_t(num,salary,username) VALUES (2,5.3,'张三');
INSERT INTO plus_t(num,salary,username) VALUES (2,5.3,'李四三');
INSERT INTO plus_t(num,salary,username) VALUES (2,5.3,'李张三');
INSERT INTO plus_t(num,salary,username) VALUES (2,5.3,'李张');
SELECT * from plus_t WHERE username LIKE '%张三'; -- %放在前面,字段的值是以%后面的值结尾
SELECT * from plus_t WHERE username LIKE '张%'; -- %放在后面是以%前面的值为开头
SELECT * from plus_t WHERE username LIKE '%张三%'; -- 查询字符中是否包含某个值,字段的值是否包含某个字符
SELECT * FROM plus_t WHERE username LIKE '_三'; -- _代表一个字符,下划线在前面是以某个字符结尾并且下划线的个数决定了字符前面的字符个数
SELECT * FROM plus_t WHERE username LIKE '李_三';-- LIKE是模糊查询,=是精确查询
SELECT * FROM plus_t WHERE num=2 or username='张三';
SELECT if(1<2,'true','false'),if(1>2,'true','false');
SELECT IF(num<salary,salary,num),salary,num from plus_t; -- 此判断始终取得都是最大值
SELECT IFNULL(salary,'test') from plus_t;-- 如果salary值为空,返回test,否则返回自身
SELECT case 2 when 1 then 'one' when 2 then 'second' ELSE 'more' end;
SELECT CASE num when 0 then 'first' when 2 then 'second' when 3 then 'three' ELSE 'five' END as num_v, num FROM plus_t;
-- 如果要让查询出的结果直接显示男或女,可以用case....WHEN....THEN相当于swith...CASE....case... CASE..... default
SELECT case when num=0 then 'first' when num=2 then 'second' ELSE 'third' end as num_r, num from plus_t;
-- 相当于if elseif elseif 。case when .... then ..ALTER. 可以判断大于小于,而case... when ...then ...只能判断相等
SELECT version();
INSERT INTO plus_t(num,salary,username) VALUES (4,23,'王五');
SELECT LAST_INSERT_ID();-- 获取最后一次插入数据的主键id
insert INTO plus_t(num,salary,username) VALUES (5,23,'王五'),(6,23,'王五2');-- 一次性插入多条数据,相当于一种批量处理
SELECT username,salary,num from plus_t;-- 查询字段 *号代表所有字段,一般不用*号,为了提高速度
SELECT username,salary,num from plus_t WHERE id=9; -- 查询id=9的数据信息,id 唯一标识一条数据,
SELECT username,salary,num from plus_t WHERE num>2;-- 查询num>2的数据集合
SELECT username,salary,num from plus_t where num in(2,3,5);
SELECT * from plus_t WHERE salary is NULL;
SELECT * from plus_t where salary is not null and username like '张%';
SELECT * from plus_t where salary=5.3 OR username like '%三';
SELECT DISTINCT salary from plus_t;-- 过滤某个字段的重复值,DISTINCT后面只能跟一个字段名
SELECT num,salary from plus_t ORDER BY num; -- 默认排序是从小到大(asc)
SELECT num,salary from plus_t ORDER BY num desc;-- DESC是倒序排列,发布新闻
SELECT num,salary from plus_t ORDER BY salary,num;-- 优先排序 优先以salary排序,如果salary中几个值是空值或者相等,那么按num排序
SELECT COUNT(num),num from plus_t GROUP BY num;-- count() group by num统计字段num的值在表内出现的次数
SELECT COUNT(num),num from plus_t ORDER BY num;
SELECT COUNT(num),GROUP_CONCAT(salary,'-') a,num from plus_t GROUP BY num;-- 统计num的值所对应的salary的值组合 CREATE TABLE fruit(
id INT(11) PRIMARY KEY auto_increment,
supplier_id INT(11),
fruit_name VARCHAR(15)
);
-- 供应商1 苹果 香蕉 梨 芒果 2 草莓 芒果 苹果
INSERT into fruit (supplier_id,fruit_name) VALUES (1,'苹果'),(2,'苹果'),
(1,'香蕉'),(2,'芒果'),(1,'梨'),(2,'草莓');
INSERT into fruit (supplier_id,fruit_name) VALUES (1,'芒果');
-- 统计 每个供应商供应的水果都有什么
SELECT COUNT(supplier_id),GROUP_CONCAT(fruit_name),supplier_id from fruit GROUP BY supplier_id;
-- GROUP_CONCAT(fruit_name) 把名字放在一起 GROUP BY 按照supplier_id来分组
SELECT COUNT(supplier_id),GROUP_CONCAT(fruit_name),supplier_id from fruit GROUP BY supplier_id
HAVING COUNT(fruit_name)>3;-- 使用having必须使用group by ,水果个数大于3的
SELECT * from fruit LIMIT 1,3;-- limit 限制条数,查询从第一条数据开始查询3条数据,从下标0开始查询(在数据库中相当于是数组),
慢查询语句:explain 解释sql语句
show STATUS LIKE 'slow_queries';-- 查找慢查询
EXPLAIN SELECT * FROM fruit;
-- 简单查询 rows 扫描多少条数据,数据12条
EXPLAIN SELECT * from fruit f INNER JOIN supplier s ON f.supplier_id=s.id; EXPLAIN SELECT * FROM fruit WHERE fruit_name='苹果' AND price=3 AND supplier_id=2;
-- 把fruit_name 字段设为索引,可以提高查询速度。如果where后有多个字段,可以设置组合索引
-- 设置索引要根据where后的条件来创建,用到哪个字段创建哪个字段,不用的不创建,否则会增加磁盘空间 EXPLAIN SELECT * FROM fruit WHERE fruit_name like '%苹果%';
-- 使用like 进行匹配的时候,索引是不起作用的 ,所以要减少like的使用 EXPLAIN SELECT * FROM fruit WHERE fruit_name='苹果' OR price=12;-- or 索引对or也不起作用 SELECT * FROM num1 UNION SELECT * FROM num2;-- 分表,同时查询两张表
视图:
创建:create view 视图名 as select 字段名1,2,3…… //以字段名1,2,3……创建单表视图
create view 视图名 as (select * from supplier s innor join fruit f on s.id=f.supplier_id); //在多表上创建视图
修改视图: create or replace view …… as ……
删除视图: drop view 视图名
SELECT * FROM supplier s INNER JOIN fruit f ON s.id=f.supplier_id; CREATE VIEW v_s_f1 AS(
SELECT s.supplier_name,s.supplier_mobile,f.fruit_name,f.price FROM supplier s INNER JOIN
fruit f ON s.id=f.supplier_id
);
-- 视图是为了简单化sql ,来查询所需的信息,提高执行速度
-- 安全性,只能修改查看可看到的信息
-- 视图是一个虚拟表,屏蔽了表中的一些信息
-- 视图多用于select操作
SELECT * FROM v_s_f;
SELECT * FROM v_s_f1;
DESCRIBE v_s_f;-- 展示视图信息
SHOW TABLE STATUS LIKE 'v_s_f';
SHOW CREATE VIEW v_s_f; CREATE OR REPLACE VIEW v_s_f as (
SELECT s.supplier_name,s.supplier_mobile,s.supplier_address,f.fruit_name,f.price FROM
supplier s INNER JOIN fruit f ON s.id=f.supplier_id
);-- 修改视图
EXPLAIN SELECT * FROM v_s_f; UPDATE fruit SET fruit_name='青苹果' WHERE id=2;
SELECT * FROM fruit f LEFT JOIN supplier s ON f.supplier_id=s.id;
-- sql语句第一次执行比较慢,以后执行速度会比第一次快,因为第一次需要 分析解析执行 sql语句,而以后sql语句已经在内存空间里,
ALTER VIEW v_s_f1 as SELECT s.supplier_name,s.supplier_mobile,s.supplier_address,f.fruit_name,f.price FROM supplier s INNER JOIN
fruit f ON s.id=f.supplier_id;-- 修改视图
UPDATE v_s_f1 SET fruit_name='青苹果1' WHERE price=12;-- 更改视图信息时,原表的信息也会随着更改
DELETE FROM v_s_f1 WHERE price=12;-- 不能通过视图删除关联类(join)的表中的信息
DROP VIEW v_s_f1;-- 删除视图 删除数据用delete(只能删除数据)
统计
SELECT COUNT(*) from plus_t;-- 统计总行数,一般不建议使用*,影响速度
SELECT COUNT(id) from plus_t;-- 统计id出现的次数
SELECT COUNT(salary) from plus_t;-- 统计非空字段列的行数 null
SELECT COUNT(supplier_id),supplier_id from fruit GROUP BY supplier_id;
alter TABLE fruit add price DECIMAL(10,2);
SELECT SUM(price) as total ,supplier_id from fruit GROUP BY supplier_id ;-- sum()是统计某个字段的总和 返回的是指定列的组合
SELECT num+salary from plus_t where username='张三';-- 统计字段之间的和
SELECT AVG(price),supplier_id ,SUM(price) total,COUNT(supplier_id) from fruit GROUP BY supplier_id;
-- AVG(expr) 求平均值
SELECT MAX(price),supplier_id from fruit GROUP BY supplier_id;-- 求某一列的最大值
SELECT MIN(price),supplier_id from fruit GROUP BY supplier_id;-- 求某一列的最小值 CREATE TABLE supplier (
id INT(11) PRIMARY KEY auto_increment,
supplier_name VARCHAR(25) NOT NULL,
supplier_address VARCHAR(100),
supplier_mobile char(11)
);
INSERT into supplier (supplier_name,supplier_address,supplier_mobile)
VALUES ('日天集团','郑州市',''),
('中天集团','北京市',''),
('南天集团','上海市','');
SELECT * from fruit f inner join supplier s on f.supplier_id=s.id;
-- 多表连接查询(内连接完全匹配),可以连接多张表 INNER JOIN和on 是同时使用的
SELECT * from supplier s LEFT JOIN fruit f on s.id=f.supplier_id;
-- 左连接(以左表为主表) 没有完全匹配,以左表的信息为主,依次匹配右表数据,如果右表中没有要匹配的信息,则左表会赋空值显示出来
SELECT * from fruit f RIGHT JOIN supplier s on s.id=f.supplier_id;
-- 右连接(以右表为主表) 以右表的信息为主,依次匹配左表数据
子查询 联合查询 插入 删除 更新
create TABLE num1(
num INT(11)
);
CREATE TABLE num2(
num INT(11)
);
INSERT INTO num1(num) VALUES (11),(12),(13),(14);
INSERT INTO num2(num) VALUES (2),(22),(23),(24); SELECT num FROM num1 WHERE num > ANY(SELECT num from num2);-- any 任意一个
SELECT num FROM num1 WHERE num > ALL(SELECT num from num2);-- all 是全部 SELECT * from fruit WHERE EXISTS(SELECT supplier_id FROM fruit where supplier_id=1);-- EXISTS 满足条件
SELECT * from fruit WHERE NOT EXISTS(SELECT supplier_id FROM fruit where supplier_id=3);
SELECT * from fruit WHERE id in (1,3,6,9);-- in 后面可以跟数据集
SELECT * from fruit WHERE id in (SELECT id from fruit WHERE supplier_id=1);-- in 后面也可以跟子查询
SELECT * from fruit WHERE id not in (SELECT id from fruit WHERE supplier_id=1);
SELECT * FROM fruit WHERE supplier_id in (SELECT id FROM supplier);
SELECT * FROM fruit WHERE supplier_id = (SELECT id FROM supplier WHERE supplier_name='中天集团');
SELECT * FROM plus_t WHERE salary>num;
sELECT * FROM plus_t WHERE id in (SELECT id FROM plus_t WHERE salary>num);-- 效果和上边的一样
SELECT * FROM plus_t WHERE salary = (SELECT MAX(salary) FROM plus_t);-- 查询最大值的信息一条sql不能实现,就需要使用子查询
SELECT * FROM num1 UNION SELECT * FROM num2;-- union 同时查询两张没有任何关联关系的表的信息
SELECT * FROM num1 UNION ALL SELECT * FROM num2;-- 不删除重复行,使用union的时候最好加上all
-- 增 删 改 查
INSERT INTO fruit (supplier_id,fruit_name,price) VALUES (1,'芒果',12),(2,'芒果2',13);-- 插入
INSERT INTO num1 (num) (SELECT num from num2 WHERE num>1);-- 把第二张表中的信息插入到第一张表中,没有values
INSERT INTO plus_t(num,salary,username) (SELECT supplier_id,price,fruit_name from fruit);
INSERT INTO plus_t(num,salary,username) (SELECT supplier_id,fruit_name,fruit_name from fruit);-- 如果相对应的值类型不一样,会自动类型转换
UPDATE supplier SET supplier_name='郑州供应商',supplier_mobile='' WHERE supplier_address='郑州市';-- 修改,更新
UPDATE fruit SET fruit_name='青苹果' WHERE supplier_id=1 and fruit_name='苹果';
-- 逻辑删除 UPDATE 还在数据库中 物理删除 delete 彻底删除
-- 一般情况下使用的都是update 更新操作,而不是物理删除
DELETE FROM fruit WHERE supplier_id=1 and fruit_name='芒果';-- 从数据库中删除是使用delete操作
DELETE FROM fruit WHERE supplier_id NOT in (SELECT id from supplier);-- 删除供应商不存在的信息 DELETE FROM fruit WHERE fruit_name='张三';