数据库的学习

Group by

DROP TABLE IF EXISTS `employee_tbl`;

CREATE TABLE `employee_tbl` (

  `id` int(11) NOT NULL,

  `name` char(10) NOT NULL DEFAULT '',

  `date` datetime NOT NULL,

  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-- ----------------------------

--  Records of `employee_tbl`

-- ----------------------------

BEGIN;

INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');

COMMIT;

 

SET FOREIGN_KEY_CHECKS = 1;

mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name   | date                | singin |
+----+--------+---------------------+--------+
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
|  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
+----+--------+---------------------+--------+
6 rows in set (0.00 sec)
mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
+--------+----------+
| name   | COUNT(*) |
+--------+----------+
| 小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+--------+----------+

Inner join

mysql> SELECT * FROM tcount_tbl;
+-----------------+----------------+
| runoob_author | runoob_count |
+-----------------+----------------+
| mahran          |             20 |
| mahnaz          |           NULL |
| Jen             |           NULL |
| Gill            |             20 |
| John Poul       |              1 |
| Sanjay          |              1 |
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from runoob_tbl;
+-------------+----------------+-----------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-------------+----------------+-----------------+-----------------+
|           1 | Learn PHP      | John Poul       | 2007-05-24      |
|           2 | Learn MySQL    | Abdul S         | 2007-05-24      |
|           3 | JAVA Tutorial  | Sanjay          | 2007-05-06      |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>
 
 
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         1 | John Poul     |            1 |
|         3 | Sanjay        |            1 |
+-----------+---------------+--------------+
2 rows in set (0.00 sec)

< Inner join可以省略用where>

left join

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

+-------------+-----------------+----------------+

| runoob_id | runoob_author | runoob_count |

+-------------+-----------------+----------------+

|           1 | John Poul       |              1 |

|           2 | Abdul S         |           NULL |

|           3 | Sanjay          |              1 |

+-------------+-----------------+----------------+

3 rows in set (0.02 sec)

RIGHT JOIN

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据

mysql> SELECT b.runoob_id, b.runoob_author, a.runoob_count FROM tcount_tbl a RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author;

+-------------+-----------------+----------------+

| runoob_id | runoob_author | runoob_count |

+-------------+-----------------+----------------+

|           1 | John Poul       |              1 |

|           2 | Abdul S         |           NULL |

|           3 | Sanjay          |              1 |

+-------------+-----------------+----------------+

3 rows in set (0.02 sec)

以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 runoob_tbl 的所有选取的字段数据,即便在左侧表tcount_tbl中没有对应的runoob_author字段值。(没有的就显示null)

MySQL NULL 值处理

我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符:

  • IS NULL: 当列的值是NULL,此运算符返回true。
  • IS NOT NULL: 当列的值不为NULL, 运算符返回true。
  • <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。

MySQL中处理NULL使用IS NULL和IS NOT NULL运算符。

ID  lastname   firstname   address       year   city

1       Adams        John       Oxford street   1970   London

2       Bush       George     Fifth avenue      1975  New York

3       Carter        Thomas        Changan Street  1980 Beijing

4       Gates         Bill                Xuanwumen 10  1985 Beijing

Order by    [desc|asc]

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

     提示:"%" 可用于定义通配符(模式中缺少的字母)。

通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM person

WHERE City NOT LIKE '%lon%'

SQL 通配符

在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一起使用。

在 SQL 中,可使用以下通配符:

通配符                          描述

%                               替代一个或多个字符

_                               仅替代一个字符

[charlist]                      字符列中的任何单一字符

[^charlist]或者[! charlist]     不在字符列中的任何单一字符

现在,我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人:

SELECT * FROM Persons
WHERE City LIKE '[ALN]%'

IN 操作符允许我们在 WHERE 子句中规定多个值。

SQL IN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期

SQL BETWEEN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
 
SELECT column_name(s)
FROM table_name
AS alias_name
 
列的 SQL Alias 语法(表也可以)
SELECT column_name AS alias_name
FROM table_name

SELECT column_name(s)

FROM table_name

AS alias_name

函数

函数
描述
AVG()
 
CONUT()
 
Max()
 
Min()
 
Sum()
 
sqrt
这是用来生成给定数的平方根
RAND()
使用MySQL命令产生一个随机数
CONCAT()
- 这是用来连接MySQL命令中的任何字符串
DATE和TIME
 
 

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
  • 事务用来管理insert,update,delete语句
mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引.
单列索引:一个索引只包含一个列,一个表可以有多个单列索引.
组合索引:一个组合索引包含两个或两个以上的列,
1.    单列索引
1-1)  其sql格式是 CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 或者 ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))
CREATE TABLE `award` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
   `aty_id` varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id',
   `nickname` varchar(12) NOT NULL DEFAULT '' COMMENT '用户昵称',
   `is_awarded` tinyint(1) NOT NULL DEFAULT 0 COMMENT '用户是否领奖',
   `award_time` int(11) NOT NULL DEFAULT 0 COMMENT '领奖时间',
   `account` varchar(12) NOT NULL DEFAULT '' COMMENT '帐号',
   `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
   `message` varchar(255) NOT NULL DEFAULT '' COMMENT '获奖信息',
   `created_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
   `updated_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='获奖信息表';
CREATE INDEX account_Index ON `award`(`account`); 
ALTER TABLE award ADD INDEX account_Index(`account`)
 注释:award是表名,account是列名(字段名)
如果是CHAR,VARCHAR,类型,length可以小于字段的实际长度,如果是BLOB和TEXT类型就必须指定长度
 
1-2)唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值,
 
其sql格式是 CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length)); 或者 ALTER TABLE TableName ADD UNIQUE (column_list)  

1-3)    主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)

主键索引建立的规则是 int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的

2.组合索引

一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称

其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

 CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

1、不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where `c2` = `aaa` and `c3`=`sss` 不能使用索引

2、查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)

Where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 改查询只会使用索引中的前两列,因为like是范围查询

3、不能跳过某个字段来进行查询,这样利用不到索引,

select * from `award` where nickname > 'rSUQFzpkDz3R' and account = 'DYxJoqZq2rd7' and created_time = 1449567822; 那么这时候他使用不到其组合索引.

因为我的索引是 (nickname, account, created_time),如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果我是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引是(nickname),

因为上面说了建立组合索引(nickname, account, created_time), 会出现三个索引

(3)全文索引

文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定.

如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column lick '%xxxx%' 这样做会让索引失效

.这个时候全文索引就祈祷了作用了

ALTER TABLE tablename ADD FULLTEXT(column1, column2)

有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。

ELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘xxx′, ‘sss′, ‘ddd′)

这条命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来

(二)索引的删除

删除索引的mysql格式 :DORP INDEX IndexName ON `TableName`

 

id    name     sex   birth   department   adress

901    张老大    1    1985    计算机系    北京市海淀区
902    张老二    1    1986    中文系    北京市昌平区
903    张三    0    1990    中文系    湖南省永州市
904    李四    1    1990    英语系    辽宁省阜新市
905    王五    1    1991    英语系    福建省厦门市
906    王六    1    1988    计算机系    湖南省衡阳市

id   stu_id   c_name   grade

1    901    计算机    98
2    901    英语    80
3    902    计算机    65
4    902    中文    88
5    903    中文    95
6    904    计算机    70
7    904    英语    92
8    905    英语    94
9    906    计算机    90
10    906    英语    85

查询同时参加计算机和英语考试的学生的信息

方式一:

SELECT a.* FROM student a ,score b ,score c WHERE a.id=b.stu_id  AND b.c_name='计算机'  AND a.id=c.stu_id AND c.c_name='英语';

方式二:

SELECT *  FROM student WHERE id =ANY ( SELECT stu_id FROM score WHERE stu_id IN ( SELECT stu_id FROM score WHERE c_name=  '计算机') AND c_name= '英语' );

方式三:

select * from student where id in( select s.stu_id from (select stu_id from score where c_name = '计算机') s 

(select stu_id from score where c_name='英语') as t where s.stu_id=t.stu_id)

方式四:

 select * from student where id in (

 select stu_id from score where c_name ='计算机' and stu_id in(

 select stu_id from score where c_name ='英语'));

将计算机考试成绩按从高到低进行排序

SELECT stu_id , grade from score WHERE c_name='计算机' ORDER BY grade DESC;

从student表和score表中查询出学生的学号,然后合并查询结果

SELECT id  from student UNION SELECT stu_id FROM score;

查询姓张或者姓王的同学的姓名、院系和考试科目及成绩

SELECT s.id,s.`name`,s.birth,s.department,s.adress,sc.c_name,sc.grade from student s  LEFT JOIN score sc on s.id=sc.stu_id
WHERE name LIKE "张%"  OR  name LIKE "王%";

查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩

SELECT s.id,s.`name`,s.birth,s.department,s.adress,sc.c_name,sc.grade from student s   LEFT JOIN score sc on s.id=sc.stu_id
WHERE s.adress LIKE "湖南%";

原文地址:https://www.cnblogs.com/JohnsonZilch/p/6548293.html