MySQL 语法整理

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

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

基本常用语法:

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

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

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

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

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

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

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

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

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

8、mysql提供了些函数:

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

eg:Month(2010-06-08)=6;

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

10、mysql> 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 [email protected] where id=2;

13、mysql> 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 |

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

15、mysql> 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 [email protected] 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部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;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;

触发器:

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

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

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

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

before | after           // 用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。

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的更新速度。

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

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

这里没有 city,age这样的组合索引,是因为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只对<,<=,=,>,>=,between,in ,以及某些时候的 like 才会使用索引。例如:

eg:select 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索引类型进行了介绍。

时间: 2024-10-26 01:29:08

MySQL 语法整理的相关文章

MySQL语法大全

select * from emp;  #注释#---------------------------#----命令行连接MySql--------- #启动mysql服务器net start mysql #关闭   net stop mysql   #进入mysql -h 主机地址 -u 用户名 -p 用户密码 #退出exit #---------------------------#----MySql用户管理--------- #修改密码:首先在DOS 下进入mysql安装路径的bin目录下

学习mysql语法--基础篇(二)

  前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: [SQL语句的组成]   DML 数据操作语言(插入.删除和修改数据库中的数据)INSERT UPDATE DELETE   DQL 数据查询语言(用来查询数据库中的数据)SELECT   DCL 数据控制语言(用来控制存取许可.存取权限等)CREATE   DDL 数据定义语言(用来建立数据库.数据库对象和定义表的列)CREATE

学习mysql语法--基础篇(一)

  前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分:    一.创建用户,创建数据库,给用户分配权限,删除用户权限.    二.MYSQL中常见的数据类型 三.表-创建表.主键.外键    四.数据库设计的三大范式 以下所有代码全部在新建查询表里面使用mysql语法编辑. 1.创建用户,创建数据库,给用户分配权限,删除用户权限. /* SQL 多行注释 */-- SQL 单行注释 创建

MySql 语法细节补充

一.注释: 1.单行注释#开始到行结束. 2.多行注释/* ...  */. 二.数据库存在性判断: 1.例如:如果数据库存在则删除 drop database if exists 数据库名; 2.例如:如果数据库不存在则创建 create database if not exists 数据库名; MySql 语法细节补充,布布扣,bubuko.com

mysql待整理

前面讲到的:insert - select - where not exist 其实好像也是为了实现:插入数据时,如果有重复则不插入.参见:http://snowolf.iteye.com/blog/1568926 和INSERT IGNORE INTO 差不多,不过前者可以自己加条件,后者只能根据主键来判断是否重复. MySql一些开发规范:http://www.2cto.com/database/201403/285170.html 1. MYSQL SQL_NO_CACHE的真正含义 ht

MYSQL 语法大全自己总结的

mysql语法大全--------数据链接---------------------数据库服务启动net start mysql --关闭服务net stop mysql --登录 -u,-p后面不需要空格mysql -uroot -p[密码]--退出exit;----MySql用户管理-----------数据库root密码修改操作系统:windows操作系统,xp或win7.1.dos命令行窗口 进入e:\mysql5.5\bin ,停止mysql 服务    e:\mysql5.5\bin

mysql 命令整理

登录命令 mysql -uroot -p21313 新建用户 insert into mysql.user(Host,User,Password) values("localhost","phplamp",password("1234")); 刷新权限 flush privileges; 创建数据库 create database 数据库名; 显示数据库 show database; 切换数据库 use 数据库名: 数据库授权 grant all

Markdown语法整理

Markdown语法整理 目录 6.1.竖杠|下划线-写法 6.2.htmltable写法 5.1.无需列表 5.2.有序列表 5.3.定义型列表 5.4.列表缩进 5.5.包含段落的列表 4.1.页内超链接 4.2.文章内部标题链接 3.1.行内式: 3.2.参考式 3.3.自动连接 一.分级目录 二.斜体与粗体 三.超链接 四.锚点 五.列表 六.表格 说明:本文中中语法里面的代码就是需要写的Markdown语法,展示效果就是最后生成的页面此语法编写和测试环境:windows上使用Markd

MySQL语法执行工作原理

目录 [TOC] 一.MySQL语法执行工作原理 客户端请求由Nginx等负载均衡服务器转交给Tomcat,Tomcat从MySQL中捞取数据,如果请求的数据在MySQL缓存中,那么MySQL会将缓存中捞取到的数据返回给客户端,如果缓存中没有请求的数据,那么MySQL会通过解析器解析SQL语法是否有问题(用户权限问题),在SQL语法没有问题的情况下,将SQL转交给优化器,看SQL是否通过索引等来进行查询,再通过存储引擎在磁盘中捞取数据. 详细流程如下,对于IE-->TOMCAT-->MySQL