mysql入门笔记2

模糊查询 like

用%代替任意字符

Where goods_name like ‘诺基亚%’;

明确几个字符就下划线

下划线统配单个字符,%统配任意

习题

把一堆10几,20几的30几的数变成10,20,30

也就是去掉个位数

查询出来 select出来

用到了mysql的函数

Floor 返回不大于x的最大整数

先让一堆数除10 ,然后floor 就是一个数了,也就取到了那个十位数,再乘10

就变成了10,20,30

也就是说可以这样更新数据~~~

Set的num =那个参与计算的值

2

把字符串 诺基亚改为 HTC

SUBSTRING

同样去那个mysql的文档去查对应的函数

第12课 奇怪的NULL

创建表

mysql> create table tmp(

-> id int,

-> name varchar(20)

-> )charset utf8 engine myisam;

写进去

mysql> insert into tmp

-> values

-> (1,’lili’),

-> (2,NULL);

定义了NULL

去查询,where name= NULL

结果没有,,,查询不等于NULL,也是没有

mysql> select * from tmp;

+——+——+

| id | name |

+——+——+

| 1 | lili |

| 2 | NULL |

+——+——+

2 rows in set (0.00 sec)

mysql> select * from tmp where name=NULL;

Empty set (0.00 sec)

mysql> select * from tmp where name!=NULL;

Empty set (0.00 sec)

NULL就是没有的意思,没法去比,也就是后面的where比较语句,不行

有专门查NULL的

Where name is NULL

第13课,group分组与统计函数

Max() 最大

Count() 求行数

Avg()

Min()

Sum() 求总和

以上是统计函数

其中

Avg是平均值

mysql> select avg(shop_price) from goods;

+—————–+

| avg(shop_price) |

+—————–+

| 1232.526774 |

+—————–+

1 row in set (0.00 sec)

取行数也就是有多少个

mysql> select count(shop_price) from goods

+——————-+

| count(shop_price) |

+——————-+

| 31 |

+——————-+

1 row in set (0.00 sec)

mysql> select count(*) from goods;

+———-+

| count(*) |

+———-+

| 31 |

+———-+

1 row in set (0.00 sec)

mysql> select count(1) from goods;

+———-+

| count(1) |

+———-+

| 31 |

+———-+

1 row in set (0.00 sec)

以上是简单的统计

下面是分组统计

既然是分组统计,那么就有一个按什么统计,比如说是按小标题,那么就要先给这小标题先拍个序,然后在算,所以用group还是有点耗费资源的,

也有可能利用索引

命令: from user group by 按的啥分组

记得是group by

先按如 cat_id

mysql> select cat_id , avg(shop_price) from goods group by cat_id;

+——–+—————–+

| cat_id | avg(shop_price) |

+——–+—————–+

| 2 | 823.330000 |

| 3 | 1746.066667 |

| 4 | 2297.000000 |

| 5 | 3700.000000 |

| 8 | 75.333333 |

| 11 | 31.000000 |

| 13 | 33.500000 |

| 14 | 54.000000 |

| 15 | 70.000000 |

+——–+—————–+

9 rows in set (0.00 sec)

每个栏目下剩的库存量 用的count

mysql> select cat_id , count(*) from goods group by cat_id;

+——–+———-+

| cat_id | count(*) |

+——–+———-+

| 2 | 1 |

| 3 | 15 |

| 4 | 3 |

| 5 | 1 |

| 8 | 3 |

| 11 | 2 |

| 13 | 2 |

| 14 | 2 |

| 15 | 2 |

+——–+———-+

9 rows in set (0.00 sec)

就是按了那个分组!!!!!!!!!!!!!

14课 having筛选

就是说,如果把用计算的列了出来,后面的条件又是这个的话,就要计算两次,所以可以向语言那样进行变量赋值,把这个计算的赋值给另一个变量~~~

就是

Selecct goods_name , (market_price-shop_price) as sheng from goods having sheng >200;

正常的查询,就是先看后面的条件,先把磁盘中的数据按着条件取出来放在临时的存储中。。。。。

也就是说提出来的数据中的有那些运算的,但是磁盘的真实数据中是没有的。

然后想在这个提出来的临时表的基础上再进行数据的筛选就要用having了~~~

Where是针对磁盘的,having是针对取出来的临时表

就是说先

Selecct goods_name , (market_price-shop_price) as sheng from goods where 1

把这些都去取出来,然后在对取出来的临时数据表进行操作就用到having了。

Having sheng >200;

和上面的那个直接用having的结果是一样的。

Cout是数的行数 ,score<60,无论什么,一定会有结果,0或1,那么用count的话就会去不管0或1都去数行了。应该用sum!!!!求那个和,然后用group by name 分组,

用where取出来,在用having在取 sum那个大于2的

mysql> select name,subject,sum(score<60) as gk, avg(score) from result group by

name ;

+——+———+——+————+

| name | subject | gk | avg(score) |

+——+———+——+————+

| 张三 | 数学 | 2 | 60.0000 |

| 李四 | 语文 | 2 | 50.0000 |

| 王五 | 政治 | 1 | 30.0000 |

+——+———+——+————+

3 rows in set (0.00 sec)

mysql> select name,subject,sum(score<60) as gk, avg(score) from result group by

name ;

+——+———+——+————+

| name | subject | gk | avg(score) |

+——+———+——+————+

| 张三 | 数学 | 2 | 60.0000 |

| 李四 | 语文 | 2 | 50.0000 |

| 王五 | 政治 | 1 | 30.0000 |

+——+———+——+————+

3 rows in set (0.00 sec)

mysql> select name,subject,sum(score<60) as gk, avg(score) from result group by

name

-> having gk>=2;

+——+———+——+————+

| name | subject | gk | avg(score) |

+——+———+——+————+

| 张三 | 数学 | 2 | 60.0000 |

| 李四 | 语文 | 2 | 50.0000 |

+——+———+——+————+

2 rows in set (0.00 sec)

mysql>

15、order by 排序

就是order by 后面加排序的条件,以什么排序!

很简单额

Select goods_id goods_name from goods order by shop_price;

就是以商品价格的去排序,如果在磁盘上是没有排序的,那么就要在内存中排序

但是吧有正序,倒叙,等

默认是升序 asc

直接后面加desc就变成了降序了

select goods_id,goods_name,shop_price from goods order by shop_price;

但是可以能会有,就是先按cat_id 排序,然后发现商品的价格是乱的,那么让价格也是

排序的。。

第一个字段没有比较完,直接在后面加个逗号加比较的字段。

并且可以第一个比较是升序,第二个是降序也可以。

mysql> select goods_id,goods_name,shop_price from goods order by shop_price desc

,shop_price desc;

+———-+——————————+————+

| goods_id | goods_name | shop_price |

+———-+——————————+————+

| 22 | 多普达touch hd | 5999.00 |

| 23 | 诺基亚n96 | 3700.00 |

| 32 | 诺基亚n85 | 3010.00 |

| 18 | 夏新t5 | 2878.00 |

还可以继续去加

也就是分列排序。

17课 limit 限制取出条目

如,取出价格前三高,

选择性的拿出几条,先排序,然后就可以跳过几个还可以直接取

有,两个参数 ,1 偏移量 就是跳过几个

2取几行。

mysql> select goods_id,goods_name,shop_price from goods order by shop_price limit 0,3;

+———-+———————–+————+

| goods_id | goods_name | shop_price |

+———-+———————–+————+

| 30 | 移动20元充值卡 | 18.00 |

| 26 | 小灵通/固话20元充值卡 | 19.00 |

| 5 | 索爱原装m2卡读卡器 | 20.00 |

+———-+———————–+————+

3 rows in set (0.00 sec)

mysql> select goods_id,goods_name,shop_price from goods order by shop_price asc limit 0,3;

+———-+———————–+————+

| goods_id | goods_name | shop_price |

+———-+———————–+————+

| 30 | 移动20元充值卡 | 18.00 |

| 26 | 小灵通/固话20元充值卡 | 19.00 |

| 5 | 索爱原装m2卡读卡器 | 20.00 |

+———-+———————–+————+

3 rows in set (0.00 sec)

mysql> select goods_id,goods_name,shop_price from goods order by shop_price desc limit 0,3;

+———-+—————-+————+

| goods_id | goods_name | shop_price |

+———-+—————-+————+

| 22 | 多普达touch hd | 5999.00 |

| 23 | 诺基亚n96 | 3700.00 |

| 32 | 诺基亚n85 | 3010.00 |

+———-+—————-+————+

3 rows in set (0.00 sec)

记住两个参数,一个偏移量,一个取出条目数

取出最新的

就是先按goods_id 倒叙,然后0,1 就是直接取出了最新的漏洞e

在oracle中没有

在分页中发挥作用

18、子句的查询陷阱

查询每个栏目下最大最新的产品。Goods_id 作为最大最新

综合运用

每个栏目下的最新的就是id最大的。

这5种子句是有顺序也就是我们现在学习的顺序。

子查询了就~~~

19课 where型子查询

内层的查询结果作为外面查询的条件

就是上面的题,不用排序和limist

假如只取直接就最大的话,不是按cat_id分的话,

可以 select goods_id ,goods_name from goods where =32;

但是不知道最大的是32,所以

可以

先查 select max(goods_id) from goods;

返回了最大的,然后在就可以了。

那么让返回的这个最大值给那么32的位置

子查询 :

Select goods_id ,goods_name from goods where goods_id =

(select max(goods_d) from goods);

mysql> select goods_id goods_name from goods where goods_id = (select max(goods_id) from goods);

+————+

| goods_name |

+————+

| 32 |

+————+

1 row in set (0.03 sec)

解决上面的问题,就是先查出每个标题下最大的也就是

Select max(goods_id) from goods group by cat_id ;

返回每个标题下最大的goods_Id;

那么在此基础上查询他们的信息就行了但是他们没有规律

那么用in语句去查

就是

Select goods_id ,goods_name where goods_id in

(select max(goods_id) from goods group by cat_id);

不用group by的话就是整个的最大的goods_id ,用了group by来分组

就在每个标题下的最大的goods_id ~~~~

mysql> select goods_id,goods_name from goods where goods_id in

-> (select max(goods_id) from goods group by cat_id )

-> ;

+———-+——————————+

| goods_id | goods_name |

+———-+——————————+

| 6 | 胜创kingmax内存卡 |

| 7 | 诺基亚n85原装立体声耳机hs-82 |

| 16 | 恒基伟业g101 |

| 18 | 夏新t5 |

| 23 | 诺基亚n96 |

| 26 | 小灵通/固话20元充值卡 |

| 28 | 联通50元充值卡 |

| 30 | 移动20元充值卡 |

| 32 | 诺基亚n85 |

+———-+——————————+

9 rows in set (0.00 sec)

如果不用子查询返回的序号和名字会乱

20课 from型子查询

正常的查询后,会返回一个列表,也就是一个表,然后可以

在用from来对这个表进行查询

就是把第一次的查询的结果是个列表 as tmp 作为一个临时表,然后

From 这个临时表,后面还可以正常的加条件,就是单纯的在临时的表上进行查询

As 就是起名

Select goods_id,goods_name from goods where goods_id<25 ;

Select goods_id ,goods_name from ( Select goods_id,goods_name from goods where goods_id<25 ) as tmp order by goods_id;

21课 exists 子查询

查出所有有商品的栏目,

mysql> select * from category where exists(select * from goods where goods.cat_i

d = category.cat_id);

+——–+——————-+———–+

| cat_id | cat_name | parent_id |

+——–+——————-+———–+

| 2 | CDMA手机 | 1 |

| 3 | GSM手机 | 1 |

| 4 | 3G手机 | 1 |

| 5 | 双模手机 | 1 |

| 8 | 耳机 | 6 |

| 11 | 读卡器和内存卡 | 6 |

| 13 | 小灵通/固话充值卡 | 12 |

| 14 | 移动手机充值卡 | 12 |

| 15 | 联通手机充值卡 | 12 |

+——–+——————-+———–+

9 rows in set (0.00 sec)

两个表之间的的查询,对应的让他们显示都存在的cat_id 号显示出来。

Esists 存在的意思。

22课,新手1+N模式查询

查询价格大于2000元的商品及栏目名称。

一个goods表的话,根本查不出来栏目名称的,但是有栏目的id ,

先查出来商品价格大于2000的,包含栏目id的,然后查出N条数据,由这N条数据

可以再次去另一个表中进行查询。代码实现。

这样很麻烦,是新手嘛,然后就可以引出连接查询

23课 内连接查询

删除表,,,, drop table 表的名字; 就可以删除了

truncate 和 delete 只删除数据不删除表的结构(定义)

速度,一般来说: drop> truncate > delete

查询时两张表连接是 inner join 后面 on 是条件 连接规则

想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.

想删除表,当然用 drop

想保留表而将所有数据删除,如果和事务无关,用truncate即可

http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html

SQL truncate 、delete与drop区别

相同点:

1.truncate和不带where子句的delete、以及drop都会删除表内的数据。

2.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。

不同点:

1. truncate 和 delete 只删除数据不删除表的结构(定义)

drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。

  1. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

    truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动

drop 语句将表所占用的空间全部释放。

truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。

4.速度,一般来说: drop> truncate > delete

5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及

使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大.

想删除表,当然用 drop

想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。

如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。

7、TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

8、TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

9、对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

10、TRUNCATE TABLE 不能用于参与了索引视图的表。

…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

| hid | bname |

+——+——–+

| A | 屌丝 |

| B | 杨过 |

| C | 陈冠希 |

+——+——–+

3 rows in set (0.00 sec)

mysql> select * from girl;

+——+——–+

| hid | gname |

+——+——–+

| B | 小龙女 |

| C | 张柏芝 |

| D | 死宅女 |

+——+——–+

3 rows in set (0.00 sec)

mysql>

mysql>

mysql> select boy.hid , boy.bname ,girl.hid ,girl.gname

-> from

-> boy inner join girl

-> on boy.hid = girl.hid

-> ;

+——+——–+——+——–+

| hid | bname | hid | gname |

+——+——–+——+——–+

| B | 杨过 | B | 小龙女 |

| C | 陈冠希 | C | 张柏芝 |

+——+——–+——+——–+

2 rows in set (0.04 sec)

也就是 select 表.什么什么 另一个表.

From 表1 inner join 表2

On 连接的条件

24课 左右连接查询

之前那么查,左面的boy 没有把,因为没有对应的,

那么现在让他对应NULL

如左连接,就是以左边的为主导

mysql> select boy.hid , boy.bname ,girl.hid ,girl.gname

-> from

-> boy left join girl

-> on boy.hid = girl.hid;

+——+——–+——+——–+

| hid | bname | hid | gname |

+——+——–+——+——–+

| A | 屌丝 | NULL | NULL |

| B | 杨过 | B | 小龙女 |

| C | 陈冠希 | C | 张柏芝 |

+——+——–+——+——–+

3 rows in set (0.00 sec)

就是先把左面的表全找出来,然后以左表数据为准,

查不到的写NULL

右连接

就是把left改为 right

mysql> select boy.hid , boy.bname ,girl.hid ,girl.gname

-> from

-> boy right join girl

-> on boy.hid = girl.hid;

+——+——–+——+——–+

| hid | bname | hid | gname |

+——+——–+——+——–+

| B | 杨过 | B | 小龙女 |

| C | 陈冠希 | C | 张柏芝 |

| NULL | NULL | D | 死宅女 |

+——+——–+——+——–+

3 rows in set (0.00 sec)

Inner就是内连接 他们俩的交集

Left就是左面的加上交集。

Mysql不支持外连接也就是所有的并集。

例如

mysql> select goods_id,goods_name,shop_price,cat_name

-> from

-> goods left join category

-> on goods.cat_id = category.cat_id;

写表.是因为不同的表中有相同的字段,为了区别

mysql> select goods_id,cat_name,shop_price

-> from

-> goods left join category

-> on goods.cat_id = category.cat_id

-> where goods.cat_id = 4;

+———-+———-+————+

| goods_id | cat_name | shop_price |

+———-+———-+————+

| 1 | 3G手机 | 1388.00 |

| 14 | 3G手机 | 2625.00 |

| 18 | 3G手机 | 2878.00 |

+———-+———-+————+

3 rows in set (0.00 sec)

Select m.*,t1.tname as htame,t2.tame as gteam

From

M inner join t as t1 on m.hid = t1.tid inner join t as t2 on m.gid = t2.tid

还有 输入 \c后就让前面的语句没用了,有时候输入错误了,回车,输入\c 就可以结束

这个语句的书写

mysql> select m.*,t1.tname as htname ,t2.tname as gtname

-> from

-> m inner join t as t1 on m.hid = t1.tid inner join t as t2 on m.gid = t

id;

+——+——+——+——+————+———-+———-+

| mid | hid | gid | mres | matime | htname | gtname |

+——+——+——+——+————+———-+———-+

| 1 | 1 | 2 | 2:0 | 2006-05-21 | 国安 | 申花 |

| 2 | 2 | 3 | 1:2 | 2006-06-21 | 申花 | 布尔联队 |

| 3 | 3 | 1 | 2:5 | 2006-06-25 | 布尔联队 | 国安 |

| 4 | 2 | 1 | 3:2 | 2006-07-21 | 申花 | 国安 |

+——+——+——+——+————+———-+———-+

4 rows in set (0.00 sec)

这个T表连了两次,连了两次就要起别名

时间: 2024-10-09 11:26:40

mysql入门笔记2的相关文章

MySQL入门笔记(一)

MySQL入门笔记(二) 一.数据类型 1. 整型 2. 浮点型 3. 字符型 4. 日期时间型 二.数据库操作 1. 创建库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; ??上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一): ??添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产

php+mysql入门笔记

一 :Web开发分为 1.静态web开发(html页面) 2..动态web开发. 发帖,网上支付,发短信,发邮件. Php是嵌入到html代码中,php脚本运行在服务器端.   二:数据库编程 1.Mysql 2.Mysqli pdo   1.mysql环境的搭建. 在php.Ini中配置mysql扩展库 Extension=php_mysql.dll. 可以通过phpinfo()函数 在数据库中创建密码时,使用md5进行加密. 中文不能添加的问题. 使用ANSI能添加,使用utf8不能,客户端

mysql入门笔记3

26课 union查询 就是把两条或者多条的查询结果合并成一个结果 两条语句的where 都比较复杂,在一起写就很麻烦,分成两个简单的 mysql> select * from goods where cat_id =3 -> union -> select * from goods where cat_id = 4; +----+--------+--–+----+---–+- -+----+----–+-----+ | goods_id | goods_name | cat_id |

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于

MySQL学习笔记-基础入门

MySQL学习笔记

iBatis 入门笔记

iBatis简介 iBatis是一个"半自动"的轻量级O/R Mapping框架. O/R Mapping是指对象与数据库之间的映射,而iBatis就是这样一个映射器,映射器的主要作用是在对象和数据库之间搬运数据,同时保证对象.数据库和映射器之间相互独立. 通过O/R Mapping你将不用再面对那一堆令人厌恶的JDBC代码,为一堆打开连接.关闭连接的代码而眼花头昏. 何为"半自动"?    这里的半自动是与Hibernate这样的O/R Mapping方案对比得出

Hive入门笔记-----架构以及应用介绍

Hive这个框架在Hadoop的生态体系结构中占有及其重要的地位,在实际的业务当中用的也非常多,可以说Hadoop之所以这么流行在很大程度上是因为Hive的存在.那么Hive究竟是什么,为什么在Hadoop家族中占有这么重要的地位,本篇文章将围绕Hive的体系结构(架构).Hive的操作.Hive与Hbase的区别等对Hive进行全方面的阐述. 在此之前,先给大家介绍一个业务场景,让大家感受一下为什么Hive如此的受欢迎: 业务描述:统计业务表consumer.txt中北京的客户有多少位?下面是

MySQL入门(三)

写了两篇<MySQL入门>以后我发现,写书的人还是都挺有本事的,起码人家知道怎么编排自己想讲的知识点,我实在是不知道该先说那里后说哪里,那我就想到什么讲什么吧. 一 写SQL 其实我是不想写有关SQL的部分的,因为这个部分其实很简单,基本上大学只要好好听听数据库概论这门课基本上都能写满足功能的SQL,但是后来想想,SQL其实是人和数据库交互的一种接口,不会SQL确实是不可以的,写的不好感觉不出数据库有多么的强大,甚至有可能会让人产生出数据库慢的坏印象. MySQL作为most popular的

mysql数据库笔记

虽然select语句可以一次性查出所有的数据,但受计算机屏幕大小的限制,每次只能看到部分行的内容,要看其它内容的时候就要用到滚动条.由于网络的限制,对于web应用来说,这种方式的效率非常低下,数据量比较大的时候几乎是不能使用的. 事实上,通常采用的方法是根据屏幕的大小,一次只查出部分行并显示,如果要看其它的内容,通常采用分页的方式. 那如何在SQL语句中查部分行的内容呢?就要用到limit关键字了. kingbase中可以用下面的语句: 1.查询第一行记录:  select * from 表名