mysql语句的进行种种难题

 

| i | n    |  

| character_set_filesystem | binary                     | 

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

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bi  

mysql> show variables like ‘collation%’;

3 rows in set  

| 4 |     4 |     20 | 4800   | 

mysql> alter table t drop index t_idx;  

mysql>

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

第二个查询 条件是 having @a=5 的时候 结果集为什么是空的呢?? 

select…for update在mysql和oracle间锁行为的比较

1 row in set (0.00 sec)

| 张三 | 语文    |     53 |  

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

  www.2cto.com  

结论:字符集从数据库、表、列的字符集是逐级继承的关系

mysql笔试题一:查询where having以及统计函数的使用

Empty set 

mysql> update t set n=’f’ where i=2;  

更改表的默认字符集

sum(score < 60) 就是统计 挂科数目。

| 6 |     6 |     40 | 14500  | 

| 2 | b  

| character_set_connection | utf8                       | 

只用一个select语句查询:不及格科目大于或等于2科的学生,的平均分(所有科目的平均分)。

 

  

 

<span style=”font-size:18px;”>mysql> select
name,avg(score),sum(score < 60) as cnt from student group by name
having cnt >= 2;  

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

[sql] 

 

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

| 1 |     1 |     10 | 5500   | 

0x02   0x0004.026.00000142  0x008000a3.00c7.04  –U-    1  fsc
0x0000.00091339  

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

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

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

 

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

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

 

    对mysql而言,select for
update必须在一个事务中,当事务commit,锁也就释放了。因此,在实验时,务必加个begin、start
transaction 或者 set autocommit=0。

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

误解一:使用count统计。count永远是统计的所有行!

| 9 |     9 |     50 | 7500   | 

SQL> select * from v$version where rownum=1;  

mysql> show full columns from t3;

| 李四 | 语文    |     56 |  

是select 先执行还是group by 先执行?

被阻塞…  

A.客户端字符集:通过系统变量”character_set_client“表示,通知server端,客户端提交的sql语句编码格式

| 李四 | 英语    |     50 |  

mysql语句的执行顺序问题

col  0: [ 1]  61 

   www.2cto.com  

误解1:

  www.2cto.com  

  www.2cto.com  

C.字段字符集

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

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

       SID TY      LMODE  

| Database | Create Database                                            
   |

 

为什么 当条件 使用having empid=5 的时候能够正常返回数据记录 

+—+——+  

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

| name | subject | score |  

是select 先执行 还是 having 子句先执行?? 

———–session_A————-  

在[client]下添加如下参数

1、where 子查询 (先找到每个学生的最大分数, 在根据分数刷新出记录)。

mysql> select (@a :=empid) a ,heyf_t10.* from heyf_t10 ; 

SQL> select sid,type,lmode from v$lock where sid=159;  

| Variable_name  | Value  |

| name | subject | score |  

| 5 |     5 |     40 | 6500   | 

    于mysql,select … for update
对行记录加个X锁。其他任何事务想在这些行上加任何锁都会被阻塞。这也符合InnoDB行级锁的概念。

Records: 0  Duplicates: 0  Warnings: 0

 

| a | empid | deptid | salary | 

| version() |  

mysql> alter table t2 add a2 varchar(10);

2、from子查询 (先排序,在group by 拿到第一个,即最大分数的那条记录)

| 2 |     2 |     10 | 4500   | 

+—+——+  

创建指定字符集的表

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

| 7 |     7 |     40 | 44500  | 

| storage_engine | InnoDB |  

指定字符集的库

  www.2cto.com  

 

+—+——+  

1 row in set (0.00 sec)

 

mysql> select (@a :=empid) a ,heyf_t10.* from heyf_t10 having @a
=5; 

+———–+  

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

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

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

  

| character_set_system     | utf8                       | 

[sql] 

 

SQL> select * from t  for update;  

| Table | Create Table                                                  
                                                                       
        |

| 王五 | 数学    |    100 |  

是select 先执行还是group
by 先执行? 是select 先执行 还是 having 子句先执行?? mysql select (@a
:=empid) a ,heyf_t10.* from…

| 3 | c  

Query OK, 1 row affected (0.00 sec)

 

| a | empid | deptid | salary | 

[sql] 

 

 

总结 不能在group by, having,ORDER BY子句后边使用 用户变量

create index t_idx on t(i)  

在[mysqld]下添加如下参数

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

mysql> select (@a :=empid) a ,heyf_t10.* from heyf_t10 having
empid =5; 

BANNER  

Records: 0  Duplicates: 0  Warnings: 0

查询每个学生的最大分数的科目及分数。

  www.2cto.com  

 

| t2    | CREATE TABLE `t2` (

| 王五 | 数学    |   100 |  

| 5 |     5 |     40 | 6500   | 

+—+——+  

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

 

| 3 |     3 |     20 | 1900   | 

———- ——————–  

1 row in set (0.01 sec)

当然也可以用 子查询 左链接, 这样反到麻烦了。

————————————————————— 

———- — ———-  

mysql> show create database db2; //显示库字符集

[sql] 

| 8 |     8 |     50 | 6500   | 

被阻塞…  

default-character-set=utf8

| name | avg(score) | cnt |  

1 row in set 

   |  

 

题目:

 

—–  

  www.2cto.com  

 

9 rows in set 

a  

No query specified

整两种方法是有很大区别的,第二种只能取出一条记录,如果最大分数相同的话。

       159 TX          6  

+——-+————————————————————————————–+
 www.2cto.com  

| 李四 | 53.6667    | 3   |  

+—+——+  

| Database | Create Database                                            
 |

题目2:还是上面的表。

    mysql:

alter table t3 change a2 a2 varchar(10) character set utf8;
//更能改字段的字符集

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

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
 

| Database | Create Database      www.2cto.com                          
                 |

| 王五 | 数学    |   100 |  

  

在[mysqld]下添加如下参数

mysql> select * from student where score in(select max(score) from
student group by name);  

  

mysql> show variables like ‘storage%’;

 

SQL> delete from t where i=1;  

Query OK, 0 rows affected (0.01 sec)

| 李四 | 数学    |    55 |         56 |  

  

mysql> alter table t2 convert to character set latin1;

  www.2cto.com  

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

) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 

3 rows in set  

  

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

[sql] 

0x01   0x000a.029.0000013b  0x008000dd.00c8.2b  C—    0  scn
0x0000.000911f4  

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

| 张三 | 数学    |    80 |         80 |  

  

  `a1` int(11) default NULL

| name | subject | score |  

+———–+  

| character_set_client     | utf8                       | 

2 rows in set</span>  

[sql] 

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

 

    在oracle中,我们再做下一个测试:

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

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

SQL> create index t_idx on t(i);  

| character_set_database   | utf8                       | 

| 张三 | 数学    |     80 |  

    trc部分摘录如下:

  `a1` int(11) default NULL

having 是用于筛选的,这里不用用where。where只能用于存在的列。

——————sesson_A—————:  

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

| 王五 | 数学    |   100 |        100 |  

  www.2cto.com  

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

[sql] 

| Variable_name  | Value  |  

  `a` varchar(10) default NULL

| name | subject | score | max(score) |  

  

1 row in set (0.00 sec)

<span style=”font-size:18px;”>mysql> select * from student;  

—————————————————————-  

创建默认字符集的表

mysql> select * from (select * from student order by score desc) as
tmp group by name;  

  

| t4    | CREATE TABLE `t4` (

| 王五 | 语文    |     90 |  

mysql> begin;  

Database changed

 

    对oracle,当发出select … for
update的时候、得到的是RX锁(lmode=3),同时通过trc文件,我们还可以发现,Lck被置为1,也也就是同时被加上了行级锁。

1 row in set (0.00 sec)

要点:  www.2cto.com  

     1 think big  

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

| 李四 | 语文    |    56 |  

1 row in set (0.00 sec)  

mysql> use db2;

| 李四 | 数学    |     55 |  

SQL> select * from t where i=1 for update;  

Records: 0  Duplicates: 0  Warnings: 0

 

  

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

having以及统计函数的使用
题目: 有表如下: www.2cto.com
只用一个select语句查询:不及格科目大于或等于2科的学生,…

mysql> select * from t where i=2 for update;  

 

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注