MySQL 语法整理

    注:MySql 中的 sql 语句是以“;”为结束点的,即只要遇到“;”时编译器就认为其上的所有语句就是一整句 sql 语句

       但是结束标签可以更改:mysql>delimiter //

基本常用语法:

1mysql> select version(),current_date;   =======   获得服务器的版本号和当前日期

2mysql> show databases;   ====》找出服务器上当前存在什么数据库:(mysql是必需的,因为它描述用户访问权限,test数据库经常作为用户试身手的工作区。)

3mysql> select distinct name from student    ======>   查询所有的不重复的学员名字                    

4mysql> create database MyBookShop   ======》创建数据库

5mysql> show tables       ======》显示当前使用的数据库中的表

6mysql> describe student     =====》显示此表的列的信息,类似于SqlServer中设计表的模式

7、要想找出正好包含5个字符的名字,使用“_”模式字符:

    mysql> SELECT * FROM pet WHERE name LIKE '^.....$';

    mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';  ====>可以使用“{n}”“重复n次”操作符重写前面的查询

8mysql提供了些函数:

   Year(date)Month(date)DayOfMonth(date)分别用来获取时间的某个部分。返回 int 类型的数据

   egMonth(2010-06-08)=6;

9Mod(5,2)=1   ,   Mod(4,2)=0     ====>取模函数

10mysql> show variables like 'character_set_client';     ======>客户端字符集

    mysql> show variables like 'character_set_database';   =======》数据库字符集

    mysql> show variables like 'character_set_server';     =======》服务器字符集

11

    mysql> SELECT * FROM pet WHERE name regexp '^b';   =============>找出以“b”开头的名字

    mysql> SELECT * FROM pet WHERE name regexp 'fy$';  ===============>找出以“fy”结尾的名字

    mysql> SELECT * FROM pet WHERE name regexp 'w';  ============>找出包含一个“w”的名字

    mysql> select username form user where age>20 limit 3;   =============>limit 限定一次最多显示的行数,也就是说查询出前三个年龄大于20的人的名字

12、利用自定义变量

  1> mysql> set @age = 20;                ======》必须直接对其赋值,且不用标定其类型

      mysql> set @name = 'Issac';

      mysql> select * from user where age = @age and name = @name;

 

   2> mysql> select @age2:=avg(age) from user;  

      mysql> update user set age=@age2 where id=2;

13mysql> select * from

    -> \c                      ========》结束本次mysql语句的执行,进行下条语句

   mysql>

 

14、特殊数值 null 的比较应用

mysql> select 0 is null, 0 is not null, '' is null, '' is not null;

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

| 0 is null | 0 is not null | '' is null | '' is not null |

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

|         0 |             1 |          0 |              1 |

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

 

15mysql> select sin(pi()/4),(4+1)*5;    ========mysql用作一个简单的计算器:

 

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

| SIN(PI()/4)      | (4+1)*5 |

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

| 0.70710678118655 |      25 |

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

1 row in set (0.02 sec)

 

16、创建表的时候直接添加主外键约束:

mysql> create table person(

    -> id smallint unsigned not null auto_increment,

    -> name char(60) not null,

    -> primary key (id)

    -> );

 

mysql> create table shirt(

    -> id smallint unsigned not null auto_increment,

    -> style enum('t-shirt','polo','dress') not null,   ===》切注意此处:mysql是不支持check

    -> color enum('red','blue','orange','white','black') not null,

    -> owner smallint unsigned not null references person(id),

    -> primary key (id)

    -> );

 

事务:

一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了,整个事务才能被提交到数据库,如果有一项操作没有完成,就必须撤消整个事务。

mysql> start transaction;

mysql> select @a:=avg(age) from user;

mysql> update user set age=@a where name='Jim';

mysql> commit/rollback;

 

 视图

mysql> create view view_user as select name , age from user;

mysql> select * from view_user;

 

存储过程:

在数据库系统开发过程中,如果能够应用存储过程,可以使整个系统的运行效率有明显的提高

MySQL中存储过程的建立(MySQL的存储过程名称不区分大小写)

create procedure + procName(参数列表)

 

存储过程的参数一般由3部分组成。第一部分可以是inoutinoutin表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。

 

MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符

mysql>delimiter //

存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。

 drop procedure proc_name 

 

实现过程:

1)更改语句结束符号,本实例将语句结束符更改为“//”。代码如下:

delimiter // 

 

2)创建存储过程前应首先选择某个数据库。代码如下:

use db_name

 

3)创建存储过程。

如何创建传入参数的存储过程,实现代码如下:

delimiter //

create procedure pro_reg (in @age int, in @name varchar(50))

begin

insert into user (age,name)

    values (@age,@name);

    end;

    //

 

4)通过call语句调用存储过程。

mysql> call pro_reg(3,'Tom');

5) 删除已经存在的 procedure

drop procedure if exists pr_param_in;

 

触发器:

触发器在数据库系统开发过程中具有非常重要的作用,例如可以防止有害数据录入数据库,可以改变或取消insertupdatedelete语句的执行及在一个会话中监听数据库中的数据的改变。

 

如果用户打算在数据库中通过触发器实现某一动作的监听,那么首先应该创建触发器,触发器是在“命令提示符”下创建的,

spacer.gif

 

MySQL数据库创建触发器的格式如下:


create trigger <触发器名称>   // 创建一个新触发器,并指定触发器的名称 user_tri

 before | after           // 用于指定在insertupdatedelete语句执行前触发还是在语句执行后触发。

insert | update | delete on <表名>                  // 用于指定响应该触发器的表名。

for each row             // 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。

<触发器SQL语句>           // 触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在begin&hellip;end块中。


实现过程

 1)修改结束字符

      delimiter // 

2)创建触发器,实现无论用户向表 user 添加什么数据都使字段 name 的内容为&ldquo;Issac&rdquo;。

mysql> create trigger user_tri

    -> before insert on user

    -> for each row

    -> set new.name='Issac'

    -> //

4)向表 user 添加一条记录,并查看添加后的结果。

 insert into user(name) values('aaaaa');//

 select * from tb_test  此时发现插入的结果不是&lsquo;aaaa&rsquo;而是&lsquo;Issac'


MySQL数据库中,创建触发器前应先查看数据库中的触发器,这样既可以使开发人员对指定的数据库中的所有触发器及功能有一个直观的把握,而且又可以避免创建同名或类似功能的触发器。

查看MySQL数据库中的触发器详细信息,可以通过如下语句实现:

   show triggers

使用show triggers语句前应先指明要查看的数据库。

删除:drop trigger 触发器名称


eg:


mysql> create trigger test_tri

    -> before insert

    -> on test

    -> for each row

    -> update person set name='bbbb' where id=1;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from person;

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

| id | name                |

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

|  1 | Jim                 |

|  3 | Tom                 |

|  4 | Issac               |

|  5 | lilliana Angelovska |

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

4 rows in set (0.00 sec)


mysql> insert into test(id,username,city,age)

    -> values(1,'Jim','wh',23);

Query OK, 1 row affected (0.06 sec)


mysql> select * from person;

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

| id | name                |

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

|  1 | bbbb                |

|  3 | Tom                 |

|  4 | Issac               |

|  5 | lilliana Angelovska |

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


索引:

索引是快速搜索的关键。在数据库表中,对字段建立索引可以大大提高查询速度。MySQL索引的建立对于MySQL的高效运行是很重要的。

下面是几种常见的MySQL索引类型。


创建了一个 user 表:

create table user(id int not null , username varchar(20) not null); 

我们随机向里面插入了10000条记录,其中有一条:5555, admin


在查找username="admin"的记录 select * from user where username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。


索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。


一》创建普通索引的不同方法

1)创建普通索引

语法:create index index_name on table (filed(length));

eg:  create index index_user on user (username(length)); 如果是 char varchar 类型,length可以小于字段实际长度;如果是 blod text 类型,必须指定 length 下同。


(2) 修改表结构,即向已经创建好的表中添加索引

语法:alter tableName add index indexName on (filed(length));

eg: alter user add index index_user on (username(20));


(3) 创建表的时候直接指定

mysql> create table test(

    -> id int not null,

    -> username varchar(20) not null,

    -> index ix_test(username(20))

    -> );

(4) 删除索引:

        drop index indexName on table;

        eg: drop index ix_test on test;


   二》创建唯一索引的不同方法


它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

1)创建索引

create unique index indexName on table(filed(length));

eg:create unique index ix_test on test(username(20));


(2)修改表结构,即向已经创建好的表中添加索引

alter table add unique indexName on (filed(length));

eg:alter test add unique ix_test on (username(20));


(3) 创建表的时候直接指定

mysql> create table test(

    -> id int not null,

    -> username varchar(20) not null,

    -> unique ix_test(username(20))

    -> );

三》创建主键索引

   它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

mysql> create table test(

    -> id int not null,

    -> username varchar(20) not null,

    -> primary key(id)

    -> );

当然也可以用 ALTER 命令。记住:一个表只能有一个主键。


四》创建组合索引


为了形象地对比单列索引和组合索引,为表添加多个字段:


mysql> create table test(

    -> id int not null,

    -> username varchar(20) not null,

    -> city varchar(20) not null,

    -> age int not null

    -> );

为了进一步提高MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

alter table test add index ix_name_city_age(name(10),city,age);

这里指明的长度必须小于或等于其创表时设定的长度,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

如果单独分别在 usernnamecityage上建立单列索引,让该表有3个单列索引,但查询时并不比组合索引快,因为mysql只会自动选择其中效率最高的一个。

上面的组合索引就相当于创建了usernname,city,age   usernname,city   usernname  这三组组合索引

这里没有 cityage这样的组合索引,是因为MySQL组合索引&ldquo;最左前缀&rdquo;的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引。


下面的几个SQL就会用到这个组合索引:

select * from test where username='admin' and city='武汉&lsquo; ;

select * frm test where username='admin' ;

   而下面几个则不会用到:

select * from test where age=20 and city='武汉&rsquo; ;

select * from test where city='武汉&lsquo;


  五》什么时候创建索引最适合呢

一般来说,在 where Join 中出现的列需要建立索引,但也不完全如此,因为MySQL只对<<==>>=betweenin ,以及某些时候的 like 才会使用索引。例如:

egselect user.username ,exam.score from user left join exam on user.id=exam.uId where user.username like 'Jim%&rsquo; and age<30;

此时就需要对 username age 建立索引,由于 mytable 表的 userame 也出现在了JOIN子句中,也有对它建立索引的必要。


刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%_开头作查询时,MySQL不会使用索引。

select * from test where username like 'admin%' ;    此句会使用索引

select * from test where username like '%admin';   此句就不会使用因此


六》使用索引的注意事项


◆索引不会包含有NULL值的列


只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL


◆索引列排序


MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引列

like语句操作


一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like &ldquo;%aaa%&rdquo; 不会使用索引而like &ldquo;aaa%&rdquo;可以使用索引。


◆不要在列上进行运算

select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成


select * from users where adddate<&lsquo;2007-01-01&rsquo;;

 ◆不使用NOT IN<>操作


以上,就对其中MySQL索引类型进行了介绍。

 

你可能感兴趣的:(mysql,基础语法,mysql笔记)