MySQL的一些基本查询,创建存储过程等
常用的查询条件有1、比较:=,<,>,<=,>=,!=,<>,!>,!<
2、确定范围:between and,not between and
3、确定集合:in,not in
4、字符匹配:like,not like
5、空值:is null, is not null
下面举个确定范围的简单例子:
select * from s2 where a between '2012-2-1' and '2013-2-2';
select * from s2 where a >='2012-2-1' and a<='2013-2-2';
在微软的sqlserver中取前三条记录用top如:select top 3 * from stu order by score desc;
而在Mysql中取前三条记录用limit如: select * from stu order by score desc limit 3; -- 按成绩降序排列,只取前三条
select * from stu order by score desc limit 2,3;-- 按成绩降序排列,从第二条开始取三条记录,limit是从0开始计数的 (分页用到limit)
bin() 函数
传一个十进制给它,它将十进制转换为二进制
eg:
mysql> select bin(255) as 'binary';
+----------+
| binary |
+----------+
| 11111111 |
+----------+
1 row in set (0.00 sec)
like模糊查询
这里%代表任意0个或多个字符eg:
mysql> select * from stu where stuName like'张%';
+---------------------+---------------------+-------+-----+-----------+
| a | b | price | sno | stuName |
+---------------------+---------------------+-------+-----+-----------+
| 2012-10-14 00:00:00 | 2013-07-19 09:11:17 | 100.0 | 1 | 张三 |
| 2013-07-18 18:00:11 | 2013-07-19 09:10:57 | 120.0 | 2 | 张三丰 |
| 2013-07-18 18:00:47 | 2013-07-19 09:10:57 | 170.0 | 3 | 张三丰 |
| 2012-02-04 00:00:00 | 2013-07-19 09:10:57 | 370.0 | 4 | 张三丰 |
+---------------------+---------------------+-------+-----+-----------+
这里_表示一定要有一个字符,且只有一个.eg:
select * from stu where stuName like '张_';
(如果查询出乱码的话,先查看一下客户端字符集是否是utf8,若不是则 set names utf8;将客户端字符集改为utf8,再更新开始插入的姓名,再进行查询。)
max(price)取价格最高的 min(price)取价格最低的 avg(price)求价格的平均值 sum(price)求价格的总和 count(*)计数,计算有多少条记录等
用法如下:
mysql> select type,max(price) ,count(1) from prod group by type;
+---------+------------+----------+
| type | max(price) | count(1) |
+---------+------------+----------+
| 类别1 | 200.5 | 2 |
| 类别2 | 200.5 | 2 |
+---------+------------+----------+
2 rows in set (0.00 sec)
mysql> select type,max(price) ,count(1) from prod group by type with rollup;
+---------+------------+----------+
| type | max(price) | count(1) |
+---------+------------+----------+
| 类别1 | 200.5 | 2 |
| 类别2 | 200.5 | 2 |
| NULL | 200.5 | 4 |
+---------+------------+----------+
3 rows in set (0.00 sec)
mysql> select deptID,max(stuID),count(1) from stu where stuID>3 group by deptID having count(1)>2;
分完组后的刷选一定是用having,而不是用order by
多表查询
内连接 inner join
select stuName,deptName from stu,dept where stu.deptID=dept.deptID;
这两条语句查询结果是一样的,只是下面这条用了inner join 内连接,其中on还可以改为where,但是在微软的sqlServer中on 不能改为where。
select stuName,deptName from stu inner join dept on stu.deptID=dept.deptID;
select stuName,coursesName,score from stud,courses,sc where stud.sno=sc.sno && courses.coursesID=sc.coursesID;
在两张表以上的内连接时,on就不能改为where了,所以在内连接时,不建议使用where.
select stuName,score,coursesName from stud inner join sc on stud.sno=sc.sno
左外连接 left join
inmysql> select stuName,score from stud left join sc on stud.sno=sc.sno;
+---------+-------+
| stuName | score |
+---------+-------+
| tom | 80 | 左外连接会将left join左边这张表的所有字段都显示出来
| tom | 70 |
| jerry | 90 | 右外连接跟左外连接相似,只是将right join右边的这张表的所有字段
| mike | NULL | 都显示出来
+---------+-------+
4 rows in set (0.00 sec)
mysql> select stuName,score from stud inner join sc on stud.sno=sc.sno;
+---------+-------+
| stuName | score |
+---------+-------+ 而内连接只显示满足条件的
| tom | 80 |
| tom | 70 |
| jerry | 90 |
+---------+-------+
3 rows in set (0.00 sec)ner join courses on sc.coursesID=courses.coursesID;
mysql> select stuName,coursesName,score from stud left join sc on stud.sno=sc.sno left join courses on sc.coursesID=courses.coursesID;
+---------+-------------+-------+
| stuName | coursesName | score |
+---------+-------------+-------+
| tom | c | 80 |
| tom | ds | 70 |
| jerry | ds | 90 |
| mike | NULL | NULL |
+---------+-------------+-------+
4 rows in set (0.00 sec)
子查询
不推荐,因为效率不高
select * from emp where deptID = (select deptID from dept order by deptID limit 1);
select deptID into @a from dept where deptName = ‘cc’;
update … where deptID = @a;
记录联合
union all -- union去重复 sqlserver可用,mysql中不可用,会出错
select * from stu union all select * from stu2; 会有重复的记录
select * from stu union select * from stu2; 自动去掉了重复的记录
下午----创建存储过程----------------------------------------------------------------------------------
在MySQL中声明变量给变量赋值取变量的值
局部变量
-- declare声明的即局部变量
-- 在declare语句前不能有任何非declare语句
drop procedure if exists sp1;
delimiter // -- 定义为碰到//才表示语句结束
-- 如果没有将结束符定义为//的话,那么下面这个创建存储过程碰到;就结束了,根本执行不下去
create procedure sp1()
begin -- 体
declare a int;
declare b,c,d float default 3.14;
set a=10;-- 若不给a赋值,则a的值为null,若b,c,d无默认值且未赋值,则也为null
set b=1.23,c=2.34;
select a,b,c,d;
end//
delimiter ; -- 定义为碰到;表示语句结束
call sp1(); -- 调用存储过程时最好加上(),避免出错
drop procedure if exists sp1; -- 删除存储过程时不需要加();
全局变量 一个@开头的
全局变量可以一赋值马上就用 eg: mysql> set @a=10
select @c :='xyz' 这里:=也是赋值,赋值后会在屏幕上显示出来
@@开头的变量是MySQL内置的系统变量
显示存储过程的基本信息:show procedure status\G;
显示存储过程的创建信息:show create procedure sp1;
调用存储过程时输入参数插入数据表中的存储过程的创建如下:
drop procedure if exists sp1;
delimiter //
create procedure sp1(id int,name varchar(32))
begin
-- create table,insert into,select
create table if not exists stu2(
stuId int,
stuName varchar(16))engine=innodb charset=utf8;
insert into stu2 values(id,name);
select * from stu2;
end //
delimiter ;
call sp1(10,'王五');
-------------------------------------------------------------------------
创建存储过程时即插入数据到数据表中的存储过程的创建
drop procedure if exists sp1;
delimiter //
create procedure sp1()
begin
-- create table,insert into,select
create table if not exists stu2(
stuId int,
stuName varchar(16))engine=innodb charset=utf8;
insert into stu2 values(1,'张三'),(2,'李四');
select * from stu2;
end //
delimiter ;
call sp1();
---------------------------------------------------------------------------------------------
首先设定一个全局变量@x,将@x的值传入存储过程中的变量a之后,经在存储过程中计算后得出的结果又赋值给@x从存储过程中传出来,举例如下:
drop procedure if exists sp1;
delimiter //
create procedure sp1(inout a int)
begin
set a=a+10;
end //
delimiter ;
mysql> set @x =20;
Query OK, 0 rows affected (0.00 sec)
mysql> call sp1(@x);
Query OK, 0 rows affected (0.01 sec)
mysql> select @x;
+------+
| @x |
+------+
| 30 |
+------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------
再举一个简单例子:
drop procedure if exists sp1;
delimiter //
create procedure sp1(a int ,b int,out c int)
begin
select a + b into c;
end //
delimiter ;
call sp1(10,20,@x);select @x;
eg:mysql> call sp1(10,20,@x);
Query OK, 1 row affected (0.00 sec)
mysql> select @x;
+------+
| @x |
+------+
| 30 |
+------+
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------------------------
今天所学的差不多就这些了,还有些不怎么明确的也就没写出来。在连接别台机子的数据库时,可以用[root@localhost ~]# ssh root@10.0.0.254 这条命令连接ip地址为10.0.0.254这台机子的数据库,但是前提是你得知道这机子的密码。但是还是不知道怎么连接别台机子装的mysql-5.6.11。
MySQL的一些基本查询,创建存储过程等的更多相关文章
- MySQL多表关联查询与存储过程
-- **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...
- 【转】图解MySql命令行创建存储过程
一 操作实例 首先登录mysql: 使用source命令,从命令行执行sql脚本,创建表: 创建第一个存储过程: 事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";&q ...
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...
- mysql命令行创建存储过程命令行定时执行sql语句
mysql -uroot -p show databases; use scm; show tables; show procedure status; 其他命令: SHOW VARIABLES LI ...
- 关于如何使用Navicat(11.1.13) for MySQL如何创建存储过程
1.ƒ()函数(右键)→新建函数(左键)→过程(选择) 2.会遇到的问题 问题一:因为sql语句默认以;为结束符,所以应该修改结束符,但是这在Navicat(11.1.13) for MySQL中是不 ...
- iBatis调用存储过程以及MySQL创建存储过程
首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...
- mysql 中创建存储过程
mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...
- mysql创建存储过程中的问题
1.在创建存储过程成功后,使用call 存储过程名执行时报错: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_gener ...
- mysql 创建存储过程 创建1000w测试数据表
存储过程:The stored procedure 结构 CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE stored_procedure_n ...
随机推荐
- AngularJS应用开发思维之2:数据绑定
在声明式模板中显示数据 因为不能像jQuery一样将DOM操作混在模板里,声明式模板很快让我们变得束手束脚. 一个典型的问题:在声明式模板里怎么显示数据? 假设我们有某人的基本信息,保存在一个json ...
- RabbitMQ基本管理(上)
1.1.2 显示RabbitMQ进程 查看RabbitMQ进程信息,输入以下命令: <span style="font-size:18px;"><strong& ...
- ASP.NET MVC3中Model验证
原文:ASP.NET MVC3中Model验证 概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验 ...
- TextArea中定位光标位置
原文:TextArea中定位光标位置 在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用"+"号来作为明 ...
- Spring IOC 之Bean定义的继承
一个Bean的定义可以包含大量的配置信息,包括构造器参数.属性值以及容器规范信息,比如初始化方法.静态工厂方法名字等等.一子bean的定义可以从父bean的定义中继承配置数据信息.子bean定义可以覆 ...
- leetcod Pow(x, n)
题目:就是实现一个指数函数. 直接用一个while一直乘以n词肯定是会超时的. 自己写了用递归(而且是很挫的递归),测试了无数次,根据每个case去修改代码.终于可以AC了.不忍直视,自己写了好长,如 ...
- Cocos2d-x在Android在竖屏切换
在Cocos2d-x在,屏幕类型的默认设置是横屏,当我们需要切换到肖像,能够在项目目录打开proj.android目录.找到AndroidManifest.xml文件,直接打开,然后就可以看到里面:s ...
- Ubuntu 14.04 字体设置
ubuntu 14.04消息公布后,我迫不及待地安装和使用.不知道怎么搞的,整个系统彻底改变了字体.有罪,看. 后来.听说文泉驿米黑效果不错.就试了一下,确实还行. 以下是设置方法: 1.安装文泉驿米 ...
- ZA7783:MIPI转LVDS/MIPI转RGB888/RGB转LVDS
在消费类电子越来越白热化阶段.好多设计project师已经開始慢慢关注到成本控制,小金在这里就给大家带来一颗转接IC.希望能帮助贵公司控制成本.当然性能也是可靠的,已经好多产品设计了. 多多不吝赐教 ...
- C#泛型回顾点滴
前言 C#的泛型一直是学习者津津乐道的课题了,这确实是一个非常有用的特性,不过在实际使用中,还是有很多需要注意的地方,我们需要通过自己动手实践以及结合理论进行理解,最终总结出自己的编码规范和最佳实践 ...