数据库基础知识点-mysql

目录

表(table)

检索:

数据库的知识:

多表设计:

约束

使用聚合函数:

表的操作增删改:-

视图:

存储过程:


数据库(database)

保存有组织的数据的容器(通常是一个文件或一组文件)。
 

表(table)

      某种特定类型数据的结构化清单 

     表名的唯一性取决于多个因素,如数据库名和表名等的结合。这表示,虽然在相同数据库中不能两次使用相同的表名,但在不同的数据库中却可以使用相同的表名。
     列(column) 表中的一个字段。所有表都是由一个或多个列组成的。
     数据类型(datatype) 所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
     行(row) 表中的一个记录。
     主键(primary key)①一一列(或一组列),其值能够唯一区分表中每个行。
表中的任何列都可以作为主键,只要它满足以下条件:

  •  任意两行都不具有相同的主键值;
  •  每个行都必须具有一个主键值(主键列不允许NULL值)。
  • 主键的最好习惯 除MySQL强制实施的规则外,应该坚持的几个普遍认可的最好习惯为:
  •  不更新主键列中的值;
  •  不重用主键列的值;
  •  不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)

    模式(schema) 关于数据库和表的布局及特性的信息。
SQL是结构化查询语言(Structured Query Language)的缩写。 SQL是一种专门用来与数据库通信的语言。
设计SQL的目的是很好地完成一项任务,即提供一种从数据库中读写数据的简单有效的方法。
SQL有如下的优点。

  •  SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库
  • 打交道。
  •  SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。
  •  SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
     

检索:

使用通配符 一般,除非你确实需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。行0 检索出来的第一行为行0而不是行1。因此, LIMIT 1, 1将检索出第二行而不是第一行。
 


数据库的知识:
 

查看数据库:show databases;
创建数据库:create database db_book;
创建表:ceate table t_bookType(
id int primary key auto_increment,
bookTypeName varchar(20),
bookTypeDesc varchar(200)
);
创建带有外键的外键是用来约束作用
create table t_book(
id int primary key auto_increment,
bookName varchar(10),
author varchar(10),
price decimal(6,2),
bookTypeId int,
constraint 'fk'foreign key('bookTypeId') refrences
't_bookType'('id')
);

 

  • 修改表名:alter table 旧表名 rename 新表名
  • 修改字段:alter table 表名 change 旧属性 新属性 新数据类型;
  • 增加字段: alter table 表名 add 属性名 数据类型[完整性约束条件][FIRST|AFTER 属性名2]//在第一个和哪个属性后添加;
  • 删除字段:alter table 表名 drop属性名;
  • 删除表:DROPE TABLE 表名;

单表查询:
     一查询表数据库:不同的数据的查询;

  • .查询所有:

select id stuName,age,sex,gradeName from t_student;

select *from t_student;

select stuName,gradeName from t_student;

  • 2.条件查询:

select* from t_student where id=1;

select* from t_student where age>22;

  • 3.带IN的范围查询:

select* from t_student where age IN(21,23);

select* from t_student where age NOT IN(21,23);

  • 4.带between and的范围查询:

select* from t_student where age between 21 and 24;

select* from t_student where age not between 21 and 24;

  • 5.模糊查询:

select* from t_student where stuName like '张三';

select* from t_student where stuName like '张三%';

select* from t_student where stuName like '张三   ';

select* from t_student where stuName like '%张三%';

注意尾空格 尾空格可能会干扰通配符匹配。例如,在保存词anvil 时 , 如 果 它 后 面 有 一 个 或 多 个 空 格 , 则 子 句 WHEREprod_name LIKE '%anvil'将不会匹配它们,因为在最后的l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。

 

  • 6.空值查询:

select * from t_student where sex is null;

select * from t_student where sex is not null;

  • 7.多条件查询

select * from t_student where age =23 and gradeName='一年级';

select * from t_student where age =23 or gradeName='一年级';

在WHERE子句中使用圆括号 任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义

  • 8.对查询结果排序;

select * from t_student order by age ASC;

select * from t_student order by age DESC;ORDER BY子句的位置 在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

  • 9.分组排序:

GROUP BY 属性名 [HAVING 条件表达式][WITH ROLLUP]

 

  1. 单独使用(毫无意义);
  2. 与 GROUP_CONCAT()函数一起使用;
  3. 与聚合函数一起使用;
  4. 与 HAVING 一起使用(限制输出的结果);
  5. 与 WITH ROLLUP 一起使用(最后加入一个总和行)

select * from t_student Group by gradeName;

select  gradeName ,Group_CONCAT(stuName) from t_student  Group by gradeName;

select  gradeName ,Group_CONCAT(stuName) from t_student  Group by gradeName HAVING COUNT(stuName>30);

  • 10.LIMIT 分页查询

select * from t_student LIMIT 0,5;

select * from t_student LIMIT 5,5;

select * from t_student LIMIT 10,5;

 

SELECT提供了测试和试验函数与计算的一个很好的办法。虽然SELECT通常用来从表中检索数据,但可以省略FROM子句以便简单地访问和处理表达式。例如, SELECT 3*2;将返回6, SELECT Trim('abc');将返回abc,而SELECTNow()利用Now()函数返回当前日期和时间。通过这些例子,可以明白如何根据需要使用SELECT进行试验。
   补充:

用正则表达式进行匹配搜索:LIKE匹配整个列。如果被匹配的文本在列值中出现, LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现, REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。 REGEXP能用使用^和$定位符( anchor)匹配整个列值MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关字,如WHERE prod_name REGEXPBINARY 'JetPack .000'使用|从功能上类似于在SELECT语句中使用OR语句, 多个OR条件可并入单个正则表达式。为了匹配反斜杠( \)字符本身,需要使用\\\。\或\\? 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠( MySQL自己解释一个,正则表达式库解释另一个)。



例子:

select prod_name from products where prod_name REGEXP '\\([0-9] stricks?\\)' order by prod_name;正则表达式\\([0-9] sticks?\\)需要解说一下。 \\(匹配),[0-9]匹配任意数字(这个例子中为1和5), sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现), \\)匹配)。没有?,匹配stick和sticks会非常困难。

匹配字符类:

  • [:alnum:] 任意字母和数字(同[a-zA-Z0-9])
  • [:alpha:] 任意字符(同[a-zA-Z])
  • [:blank:] 空格和制表(同[\\t])
  • [:cntrl:] ASCII控制字符(ASCII 0到31和127)
  • [:digit:] 任意数字(同[0-9])
  • [:graph:] 与[:print:]相同,但不包括空格
  • [:lower:] 任意小写字母(同[a-z])
  • [:print:] 任意可打印字符
  • [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
  • [:space:] 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
  • [:upper:] 任意大写字母(同[A-Z])
  • [:xdigit:] 任意十六进制数字(同[a-fA-F0-9])
  •  

例子:匹配四个任意的数字

select  prod_name from products where prod_name REGEXP '[[:digit:]]{4}'

匹配多个实例:

(1)重复元字符
 

  • * 0个或多个匹配
  • + 1个或多个匹配(等于{1,})
  • ? 0个或1个匹配(等于{0,1})
  • {n} 指定数目的匹配
  • {n,} 不少于指定数目的匹配
  • {n,m} 匹配数目的范围(m不超过255)



 

(2)定位元字符:

  • ^ 文本的开始
  • $ 文本的结尾
  • [[:<:]] 词的开始
  • [[:>:]] 词的结尾

例子:匹配一个以小数点开始的数字:
select prod_name from products where pro_name REGEXP '^[0-9\\.]' order by prod_name;^的双重用途 ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。使REGEXP起类似LIKE的作用 本章前面说过, LIKE和REGEXP的不同在于, LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样
 



多表设计


1.创建表时指定约束:

create table tb(
id int primary key auto_increment,
name varchar(20) unique not null,
ref_id int,
foreign key(ref_id) references tb2(id)
);

create table tb2(
id int primary key auto_increment
);



2.外键约束:
用来保存数据与数据关系的储存表的依赖关系,命令数据库维持这样的表关系;

create table exam(
id int primary key auto_increment,
name varchar(20) not null,
chinese double,
math double,
english double
);


insert into exam values(null,'关羽',85,76,70);
insert into exam values(null,'张飞',70,75,70);
insert into exam values(null,'赵云',90,65,95);




create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values (null,'财务部'),(null,'人事部'),(null,'科技部'),(null,'销售部');


create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key(dept_id) references dept(id)


);
insert into emp values (null,'张飞',1),(null,'关羽',2),(null,'刘备',3),(null,'赵云',4);



(1)增加外键:

             可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。

  •               RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
  •              CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。

alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];

(2)删除外键
                alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);


3.主键约束:

  • (1)增加主键(自动增长,只有主键可以自动增长)
  • Alter table tb add primary key(id) [auto_increment];
  • (2)删除主键
  • alter table 表名 drop primary key
  • (3)增加自动增长
  • Alter table employee modify id int auto_increment;
  • (4)删除自动增长
  • Alter table tb modify id int;

     

约束



1.创建表时指定约束:

create table tb(
id int primary key auto_increment,
name varchar(20) unique not null,
ref_id int,
foreign key(ref_id) references tb2(id)
);

create table tb2(
id int primary key auto_increment
);

 

(1)增加外键:

             可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。

  •               RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
  •              CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。

alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];

(2)删除外键
                alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);


3.主键约束:

  • (1)增加主键(自动增长,只有主键可以自动增长)
  • Alter table tb add primary key(id) [auto_increment];
  • (2)删除主键
  • alter table 表名 drop primary key
  • (3)增加自动增长
  • Alter table employee modify id int auto_increment;
  • (4)删除自动增长
  • Alter table tb modify id int;



多表设计

  • 一对一(311教室和20130405班级,两方都是一):在任意一方保存另一方的主键作为外键
  • 一对多、多对一(班级和学生,其中班级为1,学生为多):在多的一方保存一的一方的主键作为外键
  • 多对多(教师和学生,两方都是多):使用中间表,保存对应关系

多表查询

create table tb (id int primary key,name varchar(20) );
create table ta (
id int primary key,
name varchar(20),
tb_id int);
);
insert into tb values(1,'财务部');
insert into tb values(2,'人事部');
insert into tb values(3,'科技部');

insert into ta values (1,'刘备',1);
insert into ta values (2,'关羽',2);
insert into ta values (3,'张飞',3);


mysql> select * from ta;
+----+------+-------+
| id | name | tb_id |
+----+------+-------+
|  1 | aaa  |     1 |
|  2 | bbb  |     2 |
|  3 | bbb  |     4 |
+----+------+-------+
mysql> select * from tb;
+----+------+
| id | name |
+----+------+
|  1 | xxx  |
|  2 | yyy  |
|  3 | yyy  |
+----+------+



1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
select * from ta ,tb;

mysql> select * from ta ,tb;
+----+------+-------+----+------+
| id | name | tb_id | id | name |
+----+------+-------+----+------+
|  1 | aaa  |     1 |  1 | xxx  |
|  2 | bbb  |     2 |  1 | xxx  |
|  3 | bbb  |     4 |  1 | xxx  |
|  1 | aaa  |     1 |  2 | yyy  |
|  2 | bbb  |     2 |  2 | yyy  |
|  3 | bbb  |     4 |  2 | yyy  |
|  1 | aaa  |     1 |  3 | yyy  |
|  2 | bbb  |     2 |  3 | yyy  |
|  3 | bbb  |     4 |  3 | yyy  |
+----+------+-------+----+------+
2.内连接:查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
       select * from ta ,tb where ta.tb_id = tb.id;
      select * from ta inner join tb on ta.tb_id = tb.id;

      mysql> select * from ta inner join tb on ta.tb_id = tb.id;
       +----+------+-------+----+------+
       | id | name | tb_id | id | name |
       +----+------+-------+----+------+
        |  1 | aaa  |     1 |  1 | xxx  |
       |  2 | bbb  |     2 |  2 | yyy  |
       +----+------+-------+----+------+
3.外连接
(1)左外连接:在内连接的基础上增加左边有右边表没有的结果
select * from ta left join tb on ta.tb_id = tb.id;

mysql> select * from ta left join tb on ta.tb_id = tb.id;
+----+------+-------+------+------+
| id | name | tb_id | id   | name |
+----+------+-------+------+------+
|  1 | aaa  |     1 |    1 | xxx  |
|  2 | bbb  |     2 |    2 | yyy  |
|  3 | bbb  |     4 | NULL | NULL |
+----+------+-------+------+------+
(2)右外连接:在内连接的基础上增加右边有左边表没有的结果
select * from ta right join tb on ta.tb_id = tb.id;

mysql> select * from ta right join tb on ta.tb_id = tb.id;
+------+------+-------+----+------+
| id   | name | tb_id | id | name |
+------+------+-------+----+------+
|    1 | aaa  |     1 |  1 | xxx  |
|    2 | bbb  |     2 |  2 | yyy  |
| NULL | NULL |  NULL |  3 | yyy  |
+------+------+-------+----+------+

(3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
select * from ta full join tb on ta.tb_id = tb.id; --mysql不支持全外连接
select * from ta left join tb on ta.tb_id = tb.id 
union
select * from ta right join tb on ta.tb_id = tb.id;

mysql> select * from ta left join tb on ta.tb_id = tb.id
   -> union
   -> select * from ta right join tb on ta.tb_id = tb.id; --mysql可以使用此种方式间接实现全外连接
+------+------+-------+------+------+
| id   | name | tb_id | id   | name |
+------+------+-------+------+------+
|    1 | aaa  |     1 |    1 | xxx  |
|    2 | bbb  |     2 |    2 | yyy  |
|    3 | bbb  |     4 | NULL | NULL |
| NULL | NULL |  NULL |    3 | yyy  |
+------+------+-------+------+------+



使用聚合函数:


1.COUNT()函数
 

  • COUNT()函数用来统计记录的条数;与 GOUPE BY 关键字一起使用;

select count(*) from t_grade;
select count(*) as total from t_grade;
select stuName, COUNT(*) from t_grade Group BY stuName;
select stuName, COUNT(*) from t_grade Group BY stuName="张三";
2,SUN()函数

  • 1,SUM()函数是求和函数;
  • 2,与 GOUPE BY 关键字一起使用;

select stuName,SUM(score) from t_grade where stuName="张三";
select stuName,SUM(score)from t_grade Group BY stuName;
3,AVG()函数

  • 1,AVG()函数是求平均值的函数;
  • 2,与 GOUPE BY 关键字一起使用;

select stuName,AVG(score) from t_grade where stuName="张三";
select stuName,AVG(score)from t_grade Group BY stuName;
4,MAX()函数

  • 1,MAX()函数是求最大值的函数;
  • 2,与 GOUPE BY 关键字一起使用

select stuName,Max(score)from t_grade Group BY stuName;
select stuName,Max(score)from t_grade where stuName="张三";
5,MIN()函数

  • 1,MIN()函数是求最小值的函数;
  • 2,与 GOUPE BY 关键字一起使用

select stuName,course,min(score)from t_grade Group BY stuName;
select stuName,course,min(score)from t_grade where stuName="张三";
三:连接查询:
     3.1.1内连接查询:
                      内连接查询是一种最常用的连接查询。内连接查询可以查询两个或者两个以上的表;
select *from t_book,t_bookType;
select *from t_book,t_bookType where t_book.bookTypeId=t_bookType. id;
select bookName,author,bookTypeName from t_book,t_bookType where t_book.bookTypeId=t_bookType. id;
select tb.bookName,tb.author,tby.bookTypeName from t_book tb,t_bookType tby where tb.bookTypeId=tby.id;

  •     外连接查询

                   外连接可以查出某一张表的所有信息;
SELECT 属性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.属性名 1=表名 2.属性名 2;

  •       左连接查询

                        可以查询出“表名 1”的所有记录,而“表名 2”中,只能查询出匹配的记录
                            select * from t_book left join t_bookType on t_book.bookTypeId=t_bookType.id;
                select tb.bookName,tb.author,tby.bookTypeName from t_book tb left join t_bookType tby on tb.bookTypeId=tby.id;

  •     右连接查询

                      可以查询出“表名 2”的所有记录,而“表名 1”中,只能查询出匹配的记录
                      select * from t_book right join t_bookType on t_book.bookTypeId=t_bookType.id;
                    select tb.bookName,tb.author,tby.bookTypeName from t_book tb right join t_bookType tby on tb.bookTypeId=tby.id;

  •   多条件连接查询

       select tb.bookName,tb.author,tby.bookTypeName from t_book tb , t_bookType tby where tb.bookTypeId=tby.id and tb.price>70;

  •    子查询:

select * from t_book where booktypeId in (select id from t_booktype);
select * from t_book where booktypeId not in (select id from t_booktype);
select * from t_book where price>=(select price from t_pricelevel where priceLevel=1);
select * from t_book where exists (select * from t_booktype);
select * from t_book where not exists (select * from t_booktype);
select * from t_book where price>= any (select price from t_pricelevel );
select * from t_book where price>= all (select price from t_pricelevel );

  •     合并查询:

select id from t_book;
select id from t_booktype;
select id from t_book union select id from t_booktype;
select id from t_book union all select id from t_booktype;

  •  为字段更改别名:

select *from t_book where id=1;
select *from t_book  t where t.id=1;
select t.bookName from t_book t where t.id=1;
select t.bookName bName from t_book t where t.id=1;
select t.bookName as bName from t_book t where t.id=1;
 

表的操作增删改:
-


一.插入更新删除数据:

insert into t_book values(null,'ao',20,'张三',1);
insert into t_book (id,bookName,price,author,bookTypeId)values(null,'大河山',20,'张三',1);
insert into t_book(bookName,author)values('我爱我机器','李四');
insert into t_book(id,bookName,price,author,bookTypeId) values (null,'北京北京',21,'王五b',1), (null,'北京北京2',21,'王五c',1)

update t_book set bookName='java',price=120 where id=1;
update t_book set bookName='ao'where bookName like'%北京北京%';
update t_book set bookName='北京北京'where bookName like'%ao%';
delete from t_book where id=19;
delete from t_book where bookName='北京北京';


索引:有一列或者多列组合而成,提高数据的查询速度,缺点:创建和维护时间增多了;为什么需要索引:根据索引存储类型,可以将索引分为btree和hash索引以下适合创建索引:

  • 1.经常被查询的字段,即where字句出现的字段
  • 2.在分组的字段即group by字句出现的字段
  • 3.存在依赖关系的字表和父表之间的联合查询,即主键和外键字段
  • 4.设置唯一约束的字段

以下不适合创建索引:

  • 1.在查询中很少被使用的字段
  • 2.拥有许多超重复的字段
  • 用iNDEx或key参数用来指定索引字段为索引
  • index|key[索引名](属性1[长度][ASC|DESC])
  • mysql所支持的存储引擎每个表至少支持16个索引总长度至少为256字节。

例如:

Use company;
create table t_dept{
deptno INT,
dnmae varchar(20),
Ioc varchar(40),
INDEX index_deptno(deptno)
};


校验是否创建成功:show create TABLE t_dept\G
校验数据库表
EXPLaIN
select *from t_dept where deptno=1\G;
在已经存在的表上创建普通索引
create index 索引名 on 表名( 属性名[长度] [asc|Desc])asc升序,desc降序,

  •    创建和查看唯一索引

唯一索引:创建索引时,限制索引的值的必须唯一的,mysql中有自动索引和手动索引你
例如:

Use company;
create table t_dept{
deptno INT,
dnmae varchar(20),
Ioc varchar(40),
unique INDEX index_deptno(deptno)
};


校验是否创建成功:show create TABLE t_dept\G
校验数据库表EXPLaIN
select *from t_dept where deptno=10\G;

  • 在已经存在的表上创建唯一索引

creat enique index 索引名 on 表名( 属性名[长度] [asc|Desc])asc升序,desc降序,用sql语句ALTER TAble 创建唯一的索引
AlTER TABle table_name add unique index|key 索引名(索性名[(长度)][desc|asc])

  •     创建和查看全文索引:

全文索引主要关联在数据类型为char varchar text的字段

  • 创建表时创建全文索引:

例如:

Use company;
create table t_dept{
deptno INT,
dname varchar(20),
Ioc varchar(40),
FullTEXT INDEX index_deptno(deptno)
}ENGINE=MyISAM;


校验是否创建成功:show create TABLE t_dept\G校验数据库表EXPLaIN
select *from t_dept where dname='cjgong';
在已经存在的表上创建唯一索引creat FULLTEXT index 索引名 on 表名( 属性名[长度] [asc|Desc])asc升序,desc降序,用sql语句ALTER TAble 创建唯一的索引AlTER TABle table_name add FUllTEXT index|key 索引名(索性名[(长度)][desc|asc])
创建多列索引:

Use company;
create table t_dept{
deptno INT,
dname varchar(20),
Ioc varchar(40),
FullTEXT INDEX index_deptno(deptno,dname)
}

校验是否创建成功:show create TABLE t_dept\G
 


视图:

 

虚表不会对数据产生影响;

  • 1.视图就是能够进行对表的使操作简便化;
  • 2,增加数据的安全性;
  • 3,提高表的逻辑独立性; 

    创建视图:
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 视图名 [ ( 属性清单) ]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
ALGORITHM 是可选参数,表示视图选择的算法;
“视图名”参数表示要创建的视图的名称;
“属性清单”是可选参数,其指定了视图中各种属性的名词,默认情况下与 SELECT 语句中查询的属性相同;
SELECT 语句参数是一个完整的查询语句,标识从某个表查出某些满足条件的记录,将这些记录导入视图中;
WITH CHECK OPTION 是可选参数,表似乎更新视图时要保证在该视图的权限范围之内;
视图的操作:

  • 插入:insert into values(null,'java good',120,'feng',1);
  • 更新:update v1 set bookName='java very good',price=200 where id=5;
  • 删除视图:drop view if exists v4;
  • 触发器:是由事件来触发某个操作.这些事件包括insert语句update语句delete语句,当数据库系统执行这些事件时会激活相应的操作;
SELECT CURDATE(),CURTIME(),MONTH(birthday) AS m FROM t_t;
SELECT userName,CHAR_LENGTH(userName),UPPER(userName),LOWER(userName) FROM t_t
SELECT num,ABS(num) FROM t_t;
SELECT SQRT(4),MOD(9,4) FROM t_t;

INSERT INTO t_t VALUES(NULL,'2013-1-1','a',1,PASSWORD('123456'));


INSERT INTO t_t VALUES(NULL,'2013-1-1','a',1,MD5('123456'));


INSERT INTO t_t VALUES(NULL,'2013-1-1','a',1,MD5('123456'),ENCODE('abcd','aa'));


SELECT DECODE(pp,'aa') FROM t_t WHERE id=5;

存储过程:

 

是数据库中定义sql语句的集合,然后直接调用避免开发人员反复编写相同的sql语句可以减少客户端对数据库的操作;
创建存储过程:

  • CREATE PROCEDURE sp_name([proc_parameter[,...]])
  • [characteristic...] routine_body
  • sp_name 参数是存储过程的名称;
  • proc_parameter 表示存储过程的参数列表;
  • characteristic 参数指定存储过程的特性;
  • routine_body 参数是 SQL 代码的内容,可以用 BEGIN...END 来标志 SQL 代码的开始和结束。
  • proc_parameter 中的每个参数由 3 部分组成。这 3 部分分别是输入输出类型、参数名称和参数类型。
  • [ IN | OUT | INOUT ] param_name type其中,IN 表示输入参数;OUT 表示输出参数;INOUT 表示既可以是输入,也可以是输出;param_name 参数是存储过程的参数名称;type 参数指定存储过程的参数类型,该类型可以是 MySQL 数据库的任意数据类型;
  • Characteristic 参数有多个取值。其取值说明如下:
  • LANGUAGE SQL:说明 routine_body 部分是由 SQL 语言的语句组成,这也是数据库系统默认的语言。[ NOT ] DETERMINISTIC :指明存储过程的执行结果是否是确定的。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC 表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。
  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用 SQL 语句的限制;CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句;NO SQL 表示子程序中不包含 SQL语句;READS SQL DATA 表示子程序中包含读数据的语句;MODIFIES SQL DATA 表示子程序中包含写数据的语句。默认情况下,系统会指定为 CONTAINS SQL;
  • SQL SECURITY { DEFINER | INVOKER };指明谁有权限来执行。DEFINER 表示只有定义者自己才能够执行;
  • INVOKER 表示调用者可以执行。默认情况下,系统指定的权限是 DEFINER。
  • COMMENT ‘string’ :注释信息;

创建储存函数:
CREATE FUNCTION sp_name ( [func_parameter[,...]] )RETURNS type[ characteristic... ] routine_body

  • sp_name 参数是存储函数的名称;func_parameter 表示存储函数的参数列表;
  • RETURNS type 指定返回值的类型;characteristic 参数指定存储过程的特性,该参数的取值与存储过程中的取值是一样的;
  • routine_body 参数是 SQL 代码的内容,可以用 BEGIN...END 来标志 SQL 代码的开始和结束;
  • func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:
  • param_name type 其中,param_name 参数是存储函数的参数名称;type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kay三石 [Alay Kay]

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值