MySQL 基础 (1) -- 入门

1. 连接

-- 启动 MySQL
net start mysql

-- 关闭 MySQL
net stop mysql

-- 登录
mysql -uroot -p123456

-- 退出
exit 或者 quit

-- 添加用户:先到 mysql 数据库,对 user 表进行操作即可
USE mysql;
INSERT INTO user(host,user,authentication_string,select_priv,insert_priv)
			VALUES('127.0.0.1','root',PASSWORD('123456'),'Y','Y');
/*
	1.MySQL 5.7 之前,authentication_string 用 password 表示
	2.select_priv 这些表示的是用户具有的权限,'Y' 表示授予该权限给用户,此外还有 insert_priv、update_priv、delete_priv、create_priv、drop_priv、reload_priv、shutdown_priv、process_priv、file_priv、grant_priv、reference_priv、index_priv、after_priv
	3.密码需要用 PASSWORD() 来加密
*/

-- 创建用户,最好是养成习惯,在用户名后面加上 @‘localhost’
CREATE USER root2 IDENTIFIED BY '123456';

-- 修改用户名,如果root2后面不加@‘localhost’,那么当需要填写用户名时也不用加@‘localhost’  此时该用户 root2 的 host 字段值为 %,若有指定则 host 字段值为 localhost
RENAME USER ‘root’@‘localhost’ TO ‘root2’;

-- 修改密码
1.
mysqladmin -uroot -p123456 password 123 --亲测可用
2.
USE mysql;
UPDATE user SET authentication_string = PASSWORD('123456') WHERE user='root' AND host='localhost';
3.
set password for root@localhost = password('123'); 

-- 删除用户
DROP USER myuser;

-- 另一种给用户授予权限的写法
GRANT SELECT,INSERT,UPDATE ON mydatabase.* TO 'root'@'localhost';

-- 删除权限
REVOKE SELECT,INSERT,UPDATE ON mydatabase.* FROM 'root'@'localhost';

-- 查看权限
SHOW GRANTS FOR 'root'@'localhost';

2. 数据库

1. 创建数据库

  1. 使用 mysqladmin

    mysqladmin -uroot -p123456 CREATE mysql2
    
  2. 登录后创建

    CREATE DATABASE mysql2;
    

2. 删除数据库

  1. 使用 mysqladmin

    mysqladmin -uroot -p123456 DROP mysql2
    
  2. 登录后删除

    DROP DATABASE mysql2;
    

3. 使用数据库

  1. 登录后选择

    USE mysql2;
    

3. 数据类型

数据库字段的数据类型与数据库优化息息相关

MySQL 支持的数据类型大致可以分为三类:数值 、日期/时间 和 字符类型

1.数值类型
在这里插入图片描述
2.日期与时间类型
在这里插入图片描述
3.字符类型
在这里插入图片描述
char 和 varchar 的比较:

  1. varchar 可以节省空间,但是性能上要比 char 差(varchar 在插入和删除的时候会保留末尾的空格)
  2. binary 和 varbinary 和 char 和 varchar 类似,只不过他们是存储 字节字符串 而不是 字符字符串

4. 数据库表

1. 创建表

CREATE TABLE hello (
	id INT PRIMARY_KEY AUTO_INCREMENT DEFAULT 100,
    name VARCHAR(11) NOT NULL COMMETNT '名字'
);

2. 删除数据库表

DROP TABLE table_name ;

3. 插入数据

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

4. 查询数据

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]

你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
你也可以使用 LIMIT 属性来设定返回的记录数。

5. 更新数据

UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

若不指定where,则默认更新整张表

6. 删除数据

DELETE FROM table_name [WHERE Clause]

如果没有指定 WHERE 子句,MySQL表中的所有记录将被删除,这种情况下建议使用 TRUNCATE TABLE table_name,这条语句会将整张表删除,然后重新建立一张一模一样的表但没有任何记录,如果要删除表的所有记录,它的效率比使用 delete 快

7. 删除字段

-- 使用 ALTER 命令及 DROP 子句来删除表的 i 字段
ALTER TABLE testalter_tbl  DROP i;

8. 添加字段

-- 在表 testalter_tbl 中添加 i 字段,并定义数据类型
ALTER TABLE testalter_tbl ADD i INT;

如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

ALTER TABLE testalter_tbl ADD i INT FIRST;

ALTER TABLE testalter_tbl ADD i INT AFTER c;

9. 修改字段

修改字段有 MODIFY 和 CHANGE 子句

-- 把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称

ALTER TABLE testalter_tbl CHANGE i j BIGINT;
-- 把字段 j 从 BIGINT 修改为 INT
ALTER TABLE testalter_tbl CHANGE j j INT;

10. ALTER 处理 NULL 值和默认值

当你修改字段时,你可以指定是否包含 NULL 值、是否设置默认值。

-- 指定字段 j 为 NOT NULL 且默认值为100
 ALTER TABLE testalter_tbl 
       MODIFY j BIGINT NOT NULL DEFAULT 100;

如果你不设置默认值,MySQL会自动设置该字段默认为 NULL

另外,我们可以使用 ALTER 来修改字段的默认值

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

也可以使用 ALTER 命令及 DROP子句来删除字段的默认值

ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; -- 删除后字段初始值变为 NULL

11. 修改表

将数据表 testalter_tbl 重命名为 alter_tbl

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

12. 查看数据表类型

语法是:SHOW TABLE STATUS LIKE table_name,STATUS 后面需要跟过滤条件,否则会把数据库所有表都查询出来

SHOW TABLE STATUS LIKE 'testalter_tbl'\G

-- 结果
           Name: testalter_tbl
           Type: MyISAM
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 25769803775
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2007-06-03 08:04:36
    Update_time: 2007-06-03 08:04:36
     Check_time: NULL
 Create_options:
        Comment:

13. 复制表

如果我们需要完全的复制 MySQL 的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE … SELECT 命令,是无法实现的。

如何完整的复制 MySQL 数据表,步骤如下:

  1. 使用 HOW CREATE TABLE命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
  2. 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  3. 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。

案例:
复制表 w3cschool_tbl

  1. 获取数据表的完整结构
    在这里插入图片描述
  2. 修改SQL语句的数据表名,并执行SQL语句
    在这里插入图片描述
  3. 在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句来实现
    在这里插入图片描述

执行以上步骤后,你将完整地复制表,包括表结构及表数据。

5. WHERE 子句

1. 基本操作符

在这里插入图片描述

2. 模糊查询

SELECT field1, field2,...fieldN 
FROM table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

常和通配符 % 一起搭配使用

SELECT * from w3cschool_tbl 
         WHERE w3cschool_author LIKE '%jay';

SELECT * from w3cschool_tbl 
         WHERE w3cschool_author LIKE '%jay%';

SELECT * from w3cschool_tbl 
         WHERE w3cschool_author LIKE 'jay%';

SQL 中的通配符主要有两个:
1.%:匹配单个字符
2. _:匹配任意个字符,包括零个字符

3. NULL 值处理

为了处理空值,MySQL提供了三大运算符:

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

在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。所以关于 NULL 值必须使用特殊的运算符

4. 正则表达式

举几个案例:

-- 查找name字段中以'st'为开头的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^st';
-- 查找name字段中以'ok'为结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
-- 查找name字段中包含'mar'字符串的所有数据
SELECT name FROM person_tbl WHERE name REGEXP 'mar';
-- 查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

6. 排序

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
你可以添加 WHERE…LIKE 子句来设置条件。

7. 分组

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

1. WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

例如我们将数据表按名字进行分组,再统计每个人登录的次数:

SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;

-- 结果
+--------+--------------+
| name   | singin_count |
+--------+--------------+
| 小丽  |            2 |
| 小明  |            7 |
| 小王  |            7 |
| NULL  |           16 |
+--------+--------------+

其中记录 NULL 表示所有人的登录次数。

我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:select coalesce(a,b,c);,表示如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

如果名字为空我们使用总数代替:

SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;

-- 结果
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+--------------------------+--------------+

8. JOIN 查询 (连接)

A 为左表,B 为右表

1. inner join

在这里插入图片描述
求两张表的交集,会丢弃掉没有等值关联的行

2. left join

在这里插入图片描述
A独有+AB共有(交集)

显示 A 表的所有行,B 表对应 A 表中这些没有关联到的行用 null 显示

3. right join

在这里插入图片描述

4. A 独有

在这里插入图片描述

5. B 独有

在这里插入图片描述

6. AB 全有

由于 mysql 中不支持 full outer join,所以这里通过 union 进行转换

AB并集 = AB交集+A独有+B独有
在这里插入图片描述

7. AB 独有

在这里插入图片描述
AB 独有 = A 独有 + B 独有
在这里插入图片描述

9. 事务

MySQL 的事务机制默认是自动提交的,我们可以通过手动 start transaction来开启一个事务

1. MySQL 事务控制语句

在这里插入图片描述

10. 函数

1.DATE_ADD()

作用:向日期添加指定的时间间隔。
格式:DATE_ADD(date,INTERVAL expr type)

date 参数是合法的日期表达式。expr 参数是你希望添加的时间间隔。
type 参数可以是下列值:

  1. MICROSECOND
  2. SECOND
  3. MINUTE
  4. HOUR
  5. DAY
  6. WEEK
  7. MONTH
  8. QUARTER
  9. YEAR
  10. SECOND_MICROSECOND
  11. MINUTE_MICROSECOND
  12. MINUTE_SECOND
  13. HOUR_MICROSECOND
  14. HOUR_SECOND
  15. HOUR_MINUTE
  16. DAY_MICROSECOND
  17. DAY_SECOND
  18. DAY_MINUTE
  19. DAY_HOUR
  20. YEAR_MONTH

案例:
向 “OrderDate” 添加 45 天,这样就可以找到付款日期

SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 45 DAY) AS OrderPayDate
FROM Orders

添加前:
在这里插入图片描述
执行结果:
在这里插入图片描述

2. DATE_SUB()

作用:从日期减去指定的时间间隔
格式:DATE_SUB(date,INTERVAL expr type)

参数同上

3. DATEDIFF()

作用:返回两个日期之间的天数
格式:DATEDIFF(date1,date2)

date1 和 date2 参数是合法的日期或日期/时间表达式

案例:

SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate

结果:
在这里插入图片描述

4. DATE_FORMAT()

作用:以不同的格式显示日期/时间数据
格式:DATE_FORMAT(date,format)

date 参数是合法的日期。format 规定日期/时间的输出格式。
输出格式有:

  1. %a 缩写星期名
  2. %b 缩写月名
  3. %c 月,数值
  4. %D 带有英文前缀的月中的天
  5. %d 月的天,数值(00-31)
  6. %e 月的天,数值(0-31)
  7. %f 微秒
  8. %H 小时(00-23)
  9. %h 小时(01-12)
  10. %I 小时(01-12)
  11. %i 分钟,数值(00-59)
  12. %j 年的天(001-366)
  13. %k 小时(0-23)
  14. %l 小时(1-12)
  15. %M 月名
  16. %m 月,数值(00-12)
  17. %p AM或PM
  18. %r 时间,12-小时(hh:mm:ssAM或PM)
  19. %S 秒(00-59)
  20. %s 秒(00-59)
  21. %T 时间,24-小时(hh:mm:ss)
  22. %U 周(00-53)星期日是一周的第一天
  23. %u 周(00-53)星期一是一周的第一天
  24. %V 周(01-53)星期日是一周的第一天,与%X使用
  25. %v 周(01-53)星期一是一周的第一天,与%x使用
  26. %W 星期名
  27. %w 周的天(0=星期日,6=星期六)
  28. %X 年,其中的星期日是周的第一天,4位,与%V使用
  29. %x 年,其中的星期一是周的第一天,4位,与%v使用
  30. %Y 年,4位
  31. %y 年,2位

案例:
使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间

select  
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p'),
DATE_FORMAT(NOW(),'%m-%d-%Y'),
DATE_FORMAT(NOW(),'%d %b %y'),
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

结果
在这里插入图片描述

5. NOW()

作用:获取当前日期和时间
格式:NOW()

案例:

SELECT NOW(),CURDATE(),CURTIME();

结果
在这里插入图片描述
使用 NOW() 创建表时:

CREATE TABLE Orders (
OrderId int NOT NULL,
ProductName varchar(50) NOT NULL,
OrderDate datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (OrderId)
);

OrderDate 列规定 NOW() 作为默认值。作为结果,当你向表中插入行时,当前日期和时间会自动插入列中。

6. CURDATE()

作用:返回当前的日期
格式:CURDATE()

同样的,CURDATE() 用于建表语句时,当你向表中插入行时,当前日期会自动插入列中。

7. CURTIME()

作用:返回当前的时间
格式:CURTIME()

同样的,CURTIME() 用于建表语句时,当你向表中插入行时,当前时间会自动插入列中。

8. DATE()

作用:提取日期或日期/时间表达式的日期部分
格式:DATE(date)

date 参数是合法的日期表达式。

案例:

SELECT ProductName, DATE(OrderDate) AS OrderDate
FROM Orders
WHERE OrderId=1

原来表中数据
在这里插入图片描述
结果
在这里插入图片描述

9. EXTRACT()

作用:返回日期/时间的单独部分,比如年、月、日、小时、分钟等等
格式:EXTRACT(unit FROM date)

date 参数是合法的日期表达式。unit 参数可以是下列的值:

  1. MICROSECOND
  2. SECOND
  3. MINUTE
  4. HOUR
  5. DAY
  6. WEEK
  7. MONTH
  8. QUARTER
  9. YEAR
  10. SECOND_MICROSECOND
  11. MINUTE_MICROSECOND
  12. MINUTE_SECOND
  13. HOUR_MICROSECOND
  14. HOUR_SECOND
  15. HOUR_MINUTE
  16. DAY_MICROSECOND
  17. DAY_SECOND
  18. DAY_MINUTE
  19. DAY_HOUR
  20. YEAR_MONTH

案例:

SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,
EXTRACT(MONTH FROM OrderDate) AS OrderMonth,
EXTRACT(DAY FROM OrderDate) AS OrderDay,
FROM Orders
WHERE OrderId=1

结果
在这里插入图片描述

10. CONCAT()

作用:返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
格式:CONCAT(str1,str2,…)

注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
一个数字参数会被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如:

SELECT CONCAT(CAST(int_col AS CHAR), char_col)

MySQL的concat函数可以连接一个或者多个字符串,如:

select concat('10');
-- 结果
10

select concat('11','22','33');
-- 结果
112233

MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

select concat('11','22',null);

--结果
NULL

mysql向表中某字段后追加一段字符串

update table_name set field=CONCAT(field,'',str);

mysql 向表中某字段前加字符串

update table_name set field=CONCAT('str',field);

11. CONCAT_WS()

作用:CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。另外,函数会忽略任何分隔符参数后的 NULL 值。

格式:CONCAT_WS(separator,str1,str2,...)

案例:

select concat_ws(',','11','22','33');
-- 结果
11,22,33

-- 和MySQL中concat函数不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
select concat_ws(',','11','22',NULL,'33');
--结果
11,22,33

12. GROUP_CONCAT()

作用:在分组后,会将同一组的值按要求拼接起来
格式:GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

案例:
表的内容为:
在这里插入图片描述
以id分组,把name字段的值打印在一行,逗号分隔(默认)

select id,group_concat(name) from aa group by id;

-- 结果
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+

以id分组,把name字段的值打印在一行,分号分隔

select id,group_concat(name separator ';') from aa group by id;

-- 结果
+------+----------------------------------+
| id| group_concat(name separator ';') |
+------+----------------------------------+
|1 | 10;20;20 |
|2 | 20|
|3 | 200;500   |
+------+----------------------------------+

以id分组,把去冗余的name字段的值打印在一行,逗号分隔

select id,group_concat(distinct name) from aa group by id;

-- 结果
+------+-----------------------------+
| id| group_concat(distinct name) |
+------+-----------------------------+
|1 | 10,20|
|2 | 20   |
|3 | 200,500 |
+------+-----------------------------+

以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序

select id,group_concat(name order by name desc) from aa group by id;

-- 结果
+------+---------------------------------------+
| id| group_concat(name order by name desc) |
+------+---------------------------------------+
|1 | 20,20,10   |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+

13. REPEAT()

作用:用来复制字符串
格式:REPEAT(字符串,复制的份数)

案例:
将 ab 复制两份

select repeat('ab',2);

-- 结果
+----------------+
| repeat('ab',2) |
+----------------+
| abab           |
+----------------+

14. LEFT()

作用:从左开始截取字符串
格式:LEFT(被截取字段,截取长度)

案例:

select left(content,200) as abstract from my_content_t;

15. RIGHT()

作用就是从右开始截取字符串,其他同上

案例:

select right(content,200) as abstract from my_content_t;

16. SUBSTRING()

作用:截取字符串
格式:SUBSTRING(被截取字段,从第几位开始截取)SUBSTRING(被截取字段,从第几位开始截取,截取长度)

案例:

select substring(content,5) as abstract from my_content_t;

select substring(content,5,200) as abstract from my_content_t;

注意:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度

SUBSTRING(str,pos) , SUBSTRING(str FROM pos) , SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len):
不带有 len 参数的格式,表示从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度为len的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可让pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。

17. SUBSTRING_INDEX()

作用:按关键字截取字符串
格式:SUBSTRING_INDEX(被截取字段,关键字,关键字出现的次数)

案例:

select substring_index("www.w3cschool.cn",".",2) as abstract;

-- 结果
www.w3cschool

注意:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束

18. - 号

SELECT - 2;

-- 结果
-2

注意,如果这个操作符被用于一个 BIGINT,返回值也是一个 BIGINT!这就意味着,应该避免在一个可能有值 -2^63 的整数上使用 - 操作符

19. ABS(X)

作用:返回 X 的绝对值

案例:

SELECT ABS(2);
-- 结果
2 

SELECT ABS(-32);
-- 结果
32

20. SIGN(X)

作用:以 -1 、 0 或 1 的方式返回参数的符号,它取决于参数 X 是负数、0 或正数。

案例:

SELECT SIGN(-32);
-- 结果
-1 

SELECT SIGN(0);
-- 结果
0 

SELECT SIGN(234);
-- 结果
1

21. MOD(N,M)

作用:取模 (就如 C 中的 % 操作符)。返回 N 被 M 除后的余数

案例:

SELECT MOD(234, 10);
-- 结果
4

SELECT 253 % 7;
-- 结果
1 

SELECT MOD(29,9);
-- 结果
2

SELECT 29 MOD 9;
-- 结果
2

22. FLOOR(X)

作用:返回不大于 X 的最大整数值

案例:

SELECT FLOOR(1.23);
-- 结果
1

SELECT FLOOR(-1.23);
-- 结果
-2

注意,返回值被转换为一个 BIGINT

23. CEILING(X)

作用:返回不小于 X 的最小整数

案例:

SELECT CEILING(1.23);
-- 结果
2

SELECT CEILING(-1.23);
-- 结果
-1

注意,返回值被转换为一个 BIGINT

24. ROUND(X) / ROUND(X,D)

作用:将参数 X 四舍五入到最近的整数,然后返回。两个参数的形式是将一个数字四舍五入到 D 个小数后返回。

案例:

SELECT ROUND(-1.23);
-- 结果
-1 

SELECT ROUND(-1.58);
-- 结果
-2 

SELECT ROUND(1.58);
-- 结果
2 

SELECT ROUND(1.298, 1);
-- 结果
1.3

SELECT ROUND(1.298, 0);
-- 结果
1

注意,当参数在两个整数之间时, ROUND() 的行为取决于 C 库的实现。某些取整到最近的偶数,总是向下取,总是向上取,也可能总是接近于零。如果你需要某种取整类型,应该使用一个明确定义的函数比如 TRUNCATE() 或 FLOOR() 代替。

25. DIV

作用:删除,类似于 FLOOR() ,但是它可安全地用于 BIGINT 值。

案例:

SELECT 5 DIV 2

-- 结果
2

26. EXP(X)

作用:返回值 e (自然对数的底) 的 X 次方

案例:

SELECT EXP(2);
-- 结果:e 的平方
7.389056

SELECT EXP(-2);
-- 结果
0.135335

17. LN(X)

作用:返回 X 的自然对数

案例:

SELECT LN(2);
-- 结果:e的 0.693147 次方等于 2
0.693147 

SELECT LN(-2);
-- 结果:e的多少次方都是正数
NULL

28. LOG(X) / LOG(B,X)

作用:如果以一个参数调用,它返回 X 的自然对数(e 就是自然对数);如果以两个参数调用,这个函数返回 X 任意底 B 的对数

案例:

SELECT LOG(2);
-- 结果:e的 0.693147 次方等于 2
0.693147 

SELECT LOG(-2);
-- 结果:e的多少次方都是正数
NULL
SELECT LOG(2,65536);
-- 结果:2 的 16 次方等于 65536
16.000000 

SELECT LOG(1,100);
-- 结果:1 的任意次方都等于 1,不可能等于 100
NULL

29. LOG2(X)

作用:返回 X 的以 2 为底的对数

案例:

SELECT LOG2(65536);
-- 结果:2的16次方等于65536
16.000000

SELECT LOG2(-100);
-- 结果
NULL

LOG2() 通常可以用于计数出一个数字需要多少个比特位用于存储它。这个函数在 MySQL 4.0.3 中被添加。在更早的版本中,可以使用 LOG(X)/LOG(2) 来代替它。

30. LOG10(X)

作用:返回 X 以 10 为底的对数

案例:

SELECT LOG10(2);
-- 结果
0.301030 

SELECT LOG10(100);
-- 结果
2.000000 

SELECT LOG10(-100);
-- 结果
NULL

31. POW(X,Y)

作用:返回 X 的 Y 幂

案例:

SELECT POW(2,2);
-- 结果
4.000000 

SELECT POW(2,-2);
-- 结果
0.250000

31. SQRT(X)

作用:返回 X 的非负平方根

案例:

SELECT SQRT(4);
-- 结果
2.000000 

SELECT SQRT(20);
-- 结果
4.472136

32. PI()

作用:返回 PI 值(圆周率)。缺少显示 5 位小数,但是在 MySQL 内部,为 PI 使用全部的双精度

案例:

SELECT PI();
-- 结果:返回的只显示五位
3.141593 

SELECT PI()+0.000000000000000000;
-- 结果:但实际参与运算的是双精度范围内的数,双精度有8个字节
3.141592653589793116

33. COS(X)

作用:返回 X 的余弦

案例:

SELECT COS(PI());

--结果
-1.000000

34. SIN(X)

作用: 返回 X 的正弦

案例:

SELECT SIN(PI());

--结果
0.000000

35. TAN(X)

作用:返回 X 的正切

案例:

SELECT TAN(PI()+1);

--结果
1.557408

36. ACOS(X)

作用:返回 X 的反余弦,更确切地说,返回余弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL

案例:

SELECT ACOS(1);
-- 结果
0.000000 

SELECT ACOS(1.0001);
-- 结果
NULL 

SELECT ACOS(0);
-- 结果
1.570796

37. ASIN(X)

作用:返回 X 的反正弦,更确切地说,返回正弦值为 X 的值。如果 X 不在 -1 到 1 之间的范围内,返回 NULL

案例:

SELECT ASIN(0.2);
-- 结果
0.201358 

SELECT ASIN('foo');
-- 结果
0.000000

38. ATAN(X)

作用:返回 X 的反正切,更确切地说,返回正切值为 X 的值

案例:

SELECT ATAN(2);
-- 结果
1.107149 

SELECT ATAN(-2);
-- 结果
-1.107149

39. ATAN(Y,X)

作用:返回两个变量 X 和 Y 的反正切。它类似于计算 Y / X 的反正切,除了两个参数的符号用于决定结果的象限

案例:

SELECT ATAN(-2,2);
-- 结果
-0.785398 

SELECT ATAN2(PI(),0);
-- 结果
1.570796

40. COT(X)

作用:返回 X 的余切

案例:

SELECT COT(12);
-- 结果
-1.57267341 

SELECT COT(0);
-- 结果
NULL

41. RAND() / RAND(N)

作用:返回一个范围在 0 到 1.0 之间的随机浮点值。如果一个整数参数 N 被指定,它被当做种子值使用(用于产生一个可重复的数值)

案例:

SELECT RAND();
-- 结果
0.9233482386203

SELECT RAND(20);
-- 结果:指定了种子
0.15888261251047 

SELECT RAND(20);
-- 结果:指定种子是20.无论调用多少次,都是产生相同的值
0.15888261251047 

SELECT RAND();
-- 结果
0.63553050033332 

SELECT RAND();
-- 结果
0.70100469486881

在一个 ORDER BY 子句中,不可以使用 RAND() 值使用一个列,因为 ORDER BY 将多次重复计算列。从 MySQL 3.23 开始,你可以使用: SELECT * FROM table_name ORDER BY RAND(),这有利于得到一个来自 SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000 的集合中的随机样本。 注意,在一个 WHERE 子句中的 RAND() 将在每次 WHERE 执行时被重新计算。 RAND() 并不是预期完美的随机数发生器,但是可以代替做为产生特别的随机数一个快速的方法,这样便于在两个不同平台下的同一 MySQL 版本间移动。

42. LEAST(X,Y,…)

作用:有两个或更多个参数,返回最小(最小值)的参数。

参数使用下列规则进行比较:

  1. 如果返回值用于一个 INTEGER 语境,或所有的参数是整数值,它们作为整数比较。
  2. 如果返回值用于一个 REAL 语境,或所有的参数均是实数值,它们作为实数被比较。
  3. 如果任何一个参数是字母大小写敏感的,参数作为大小写敏感的字符串进行比较。
  4. 在其它情况下,参数做为忽略大小写的字符中进行比较:

案例:

SELECT LEAST(2,0);
-- 结果
0 

SELECT LEAST(34.0,3.0,5.0,767.0);
-- 结果
3.0 

SELECT LEAST("B","A","C");
-- 结果
"A"

在早于 MySQL 3.22.5 的版本中,你可以使用 MIN() 代替 LEAST()

43. GREATEST(X,Y,…)

作用:返回最大(最大值)参数。

参数使用与 LEAST 一致的规则进行比较

案例:

SELECT GREATEST(2,0);
-- 结果
2 

SELECT GREATEST(34.0,3.0,5.0,767.0);
-- 结果
767.0

SELECT GREATEST("B","A","C");
-- 结果
"C"

在早于 MySQL 3.22.5 的版本中,可以使用 MAX() 代替 GREATEST()。

44. DEGREES(X)

作用:将参数 X 从弧度转换为角度,然后返回

案例:

SELECT DEGREES(PI());

-- 结果
180.000000

45. RADIANS(X)

作用:将参数 X 从角度转换为弧度,然后返回

案例:

SELECT RADIANS(90);

-- 结果
1.570796

46. TRUNCATE(X,D)

作用:将数值 X 截到 D 个小数,然后返回。如果 D 为 0 ,结果将不包含小数点和小数部分

案例:

SELECT TRUNCATE(1.223,1);
-- 结果
1.2 

SELECT TRUNCATE(1.999,1);
-- 结果
1.9 

SELECT TRUNCATE(1.999,0);
-- 结果
1 

SELECT TRUNCATE(-1.999,1);
-- 结果
-1.9

从 MySQL 3.23.51 开始,所有数字被四舍五入到零。 如果 D 是负数,那么数字的整个部分被对准零位输出

SELECT TRUNCATE(122,-1);
-- 结果
120

SELECT TRUNCATE(122,-2);
-- 结果
100

SELECT TRUNCATE(122,-3);
-- 结果
0

注意,十进值小数在计算机中通常不以精确数字存储,而是双精度型的值,你可能会被下列结果所愚弄:

SELECT TRUNCATE(10.28*100,0);

--结果
1027
-- 我的测试结果是 1028

上面结果的发生是因为 10.28 实际上是以某些像 10.2799999999999999 的形式被存储的。

47. SUBSTR()

作用:返回原字符串的子字符串,该字符串是原字符串从<始>位置开始,长度为<长>的一段。如果没有指定<长>或指定得超过字符串长度,则子字符串从<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,则返回空字符串。
格式:SUBSTR(string string,num start,num length)

string为字符串;start为起始位置(若为负数则表示从末尾开始);length为长度。注意:mysql中的start是从1开始的。

案例:

-- 查出kename字段中第一次出现`.`之前的字符串
select kename,substr(kename,1,locate('.',kename)) as subkename from  web_dev_api where 1;

-- 截取末尾两位
select substr(kename,-2,2);

11. 索引

1. 概念

索引是一种可以帮助 数据库(MySQL)高效获取数据的一种数据结构,它会以某种方式指向数据,从而可以在这些数据结构上实现一些高级查找算法。索引的目的是为了提高查询效率,就好像书的目录一样

没有特殊指明,索引默认使用 B 树, 聚集索引、次要索引、覆盖索引、前缀索引、唯一索引默认都是用 B 树

优缺点

  1. 优点:

    1. 类似书的目录 ,可以提高数据的检索效率,降低数据库的IO成本
    2. 通过索引列对数据进行排序,可以降低数据的排序成本,从而降低CPU的消耗
  2. 缺点:

    1. 索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用物理空间
    2. 索引虽然能够提升查询效率,但是对于更新操作,MySQL 除了要保存数据之外,还需要去额外维护索引
    3. 对于 MySQL 中有大量数据表的情况下,需要花时间去研究建立最优秀的索引或查询语句

是否建立索引

  1. 需要建立
    1. 主键自动建立唯一索引(主键索引不允许存在 null 值,但唯一索引是允许的)
    2. 经常需要查询到的字段
    3. 需要排序的字段
    4. 需要分组的字段
    5. 查询中与外表关联的字段,外键关系建立索引
    6. 高并发下使用联合索引
  2. 不需要建立
    1. 表很小
    2. 表特别大的情况下应该使用
    3. 经常更新(增删改)操作的字段
    4. 重复值比较多, 如国籍、性别,不适合创建索引
    5. where 条件里用不到的字段

2. 添加、查询和删除索引

  1. 主键索引
    当一张表,把某个列设为主键的时候,则该列就是主键索引,下面的id 列就是主键索引

    create table user
    (id int unsigned primary key auto_increment ,
    name varchar(32) not null defaul ‘’);
    

    如果你创建表时,没有指定主键索引,也可以在创建表后,再添加, 指令:

    alter table 表名 add primary key (列名);
    
    //举例
    alter table user add primary key (id);
    
  2. 普通索引
    一般来说,普通索引的创建,是先创建表,然后在创建普通索引。比如:

    create table user(
    id int unsigned,
    name varchar(32)
    )
    
    create index 索引名 on(1,列名2);
    
  3. 全文索引
    全文索引,主要是针对对文件、文本的检索, 比如文章, 全文索引针对MyISAM有用。创建如下:

    CREATE TABLE articles (
           id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
           title VARCHAR(200),
           body TEXT,
           FULLTEXT (title,body)
         )engine=myisam charset utf8;
    

    注意:

    1. 在mysql中fulltext 索引只针对 myisam生效
    2. mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
    3. 使用方法是match(字段名…) against(‘关键字’)
    4. 全文索引一个 叫 停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.
  4. 唯一索引
    当表的某列被指定为unique约束时,这列就是一个唯一索引

    // 创建
    create table user(id int primary key auto_increment , name varchar(32) unique);
    

    这时, name 列就是一个唯一索引,unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,主键字段,不能为NULL,也不能重复。

    创建唯一索引的另一种方式:

    create table user(id int primary key auto_increment, name varchar(32));
    
    create unique index 索引名  on 表名 (列表..);
    
  5. 查询索引

    desc 表名  //不能够显示索引名
    show index(es) from 表名
    show keys from 表名
    
  6. 删除索引

    alter table 表名 drop index 索引名; 
    
    //如果删除主键索引。
    alter table 表名 drop primary key
    

由于索引本身很大,占用磁盘空间,对dml操作有影响,变慢,满足以下条件的字段,才应该创建索引。

  1. 肯定在where条经常使用
  2. 该字段的内容不是唯一的几个值
  3. 字段内容不是频繁变化

12. 批量插入数据

使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用。

1. 准备

13. 练习

create table Student(
 s_no char(6) primary key,
 class_no char(6) not null,
 s_name varchar(10) not null,
 s_sex char(2) check(s_sex in ('男','女')),
 s_birthday datetime
);

create table Class(
class_no char(6) primary key,
class_name char(20) not null,
class_special varchar(20),
class_dept char(20)
);

create table Course(
    course_no char(5) primary key,
    course_name char(20) not null,
    course_score numeric(6,2)
);

create table Choise(
    s_no char(6),
    course_no char(5),
    score numeric(6,1)
);

CREATE TABLE Teacher(
    t_no CHAR(6) PRIMARY KEY,
    t_name VARCHAR(10) NOT NULL,
    t_sex SET('男','女'),
    t_birthday DATETIME,
    t_title CHAR(10)
);

create table Teaching(
    course_no char(5),
    t_no char(6)
);

insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991101','js9901','张彬','男','1981-10-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991102','js9901','王蕾','女','1980-8-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991103','js9901','李建国','男','1981-4-5');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991104','js9901','李平方','男','1981-5-12');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991201','js9902','陈东辉','男','1980-2-8');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991202','js9902','葛鹏','男','1979-12-23');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991203','js9902','潘桃枝','女','1980-2-6');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('991204','js9902','姚一峰','男','1981-5-7');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001101','js0001','宋大芳','男','1980-4-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001102','js0001','许辉','女','1978-8-1');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001201','js0002','王一山','男','1980-12-4');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('001202','js0002','牛莉','女','1981-6-9');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002101','xx0001','李丽丽','女','1981-9-19');
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values('002102','xx0001','李王','男','1980-9-23');

insert into Class(class_no,class_name,class_special,class_dept) values('js9901','计算机99-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js9902','计算机99-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0001','计算机00-1','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('js0002','计算机00-2','计算机','计算机系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0001','信息00-1','信息','信息系');
insert into Class(class_no,class_name,class_special,class_dept) values('xx0002','信息00-2','信息','信息系');

insert into Course(course_no,course_name,course_score) values('01001','计算机基础',3);
insert into Course(course_no,course_name,course_score) values('01002','程序设计语言',5);
insert into Course(course_no,course_name,course_score) values('01003','数据结构',6);
insert into Course(course_no,course_name,course_score) values('02001','数据库原理与应用',6);
insert into Course(course_no,course_name,course_score) values('02002','计算机网络',6);
insert into Course(course_no,course_name,course_score) values('02003','微机原理与应用',8);

insert into Choise(s_no,course_no,score) values('991101','01001',88.0);
insert into Choise(s_no,course_no,score) values('991102','01001',);
insert into Choise(s_no,course_no) values('991103','01001',91.0);
insert into Choise(s_no,course_no,score) values('991104','01001',78.0);
insert into Choise(s_no,course_no,score) values('991201','01001',67.0);
insert into Choise(s_no,course_no,score) values('991101','01002',90.0);
insert into Choise(s_no,course_no,score) values('991102','01002',58.0);
insert into Choise(s_no,course_no,score) values('991103','01002',71.0);
insert into Choise(s_no,course_no,score) values('991104','01002',85.0);

insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000001','李英','女','1964-11-3','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000002','王大山','男','1955-3-7','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000003','张朋','男','1960-10-5','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000004','陈为军','男','1970-3-2','助教');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000005','宋浩然','男','1966-12-4','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000006','徐红霞','女','1951-5-8','副教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000007','徐永军','男','1948-4-8','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000008','李桂清','女','1940-11-3','教授');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000009','王一帆','女','1962-5-9','讲师');
insert into Teacher(t_no,t_name,t_sex,t_birthday,t_title) values('000010','田丰','男','1972-11-5','助教');

insert into Teaching(course_no,t_no) values('01001','000001');
insert into Teaching(course_no,t_no) values('01002','000002');
insert into Teaching(course_no,t_no) values('01003','000002');
insert into Teaching(course_no,t_no) values('02001','000003');
insert into Teaching(course_no,t_no) values('02002','000004');
insert into Teaching(course_no,t_no) values('01001','000005');
insert into Teaching(course_no,t_no) values('01002','000006');
insert into Teaching(course_no,t_no) values('01003','000007');
insert into Teaching(course_no,t_no) values('02001','000007');
insert into Teaching(course_no,t_no) values('02002','000008');

#查询所有学生的基本信息
select s_no,class_no,s_name,s_sex,s_birthday from Student;
#查询所有学生 显示学号姓名
select s_no,s_name from Student;
#查询男同学 显示学号姓名出生日期
select s_no,s_name,s_birthday from Student where s_sex = '男';
#查询出生日期在80-1-1前女学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='女' and s_birthday<'1980-01-01';
#查询李姓男学生
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_sex='男' and s_name like "李%"; 
#查询名字含一
select s_no,class_no,s_name,s_sex,s_birthday from Student where s_name like "%一%";
#查询职称不是讲师
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_title != '讲师';
#查询未参加考试的学生
SELECT co.s_name
FROM(
	SELECT s.s_name s_name,c.score score
	FROM student s LEFT JOIN choise c
	ON s.`s_no` = c.`s_no`
	) co
WHERE co.score IS NULL;
#查询考试不及格的学生并按成绩排序
SELECT co.*
FROM (
	SELECT s.*,c.score score
	FROM student s
	LEFT JOIN choise c ON s.`s_no` = c.`s_no`
	) co
WHERE co.score < 60.0 OR co.score IS NULL
ORDER BY co.score;
#查询课程号为01001 02001 02003所有课程
select course_no,course_name,course_score from Course where course_no in ('01001','02001','02003');
#查询1970年出生的讲师
SELECT *
FROM teacher
WHERE t_birthday >= '1970-01-01 00:00:00' AND t_birthday < '1971-01-01 00:00:00';
#查询各课程号选修人数
select course_no,count(course_no) from Choise group by course_no ;
#查询教授两门课程以上的讲师
select t_no,count(course_no) from Teaching group by t_no having count(course_no)=>2  ;
#查询01001平均分最低分最高分
select avg(score),min(score),max(score) from Choise where course_no = '01001';
#查询1960年后出生职称为讲师并按出生日期升序
select t_no,t_name,t_sex,t_birthday,t_title from Teacher where t_birthday > '1960' and t_title = '讲师' ORDER BY t_birthday ASC;
#查询所有学生选课和成绩s_no s_name course_no score
select Student.s_no,s_name,course_no,score from Student join Choise on Student.s_no = Choise.s_no;
#查询计算机99-1同学的选课及成绩s_no s_name course_no course_name score
select Student.s_no,s_name,Course.course_no,course_name,score from Student join Choise,Course,Class where Student.s_no = Choise.s_no and Course.course_no = Choise.course_no and Student.class_no = Class.class_no and Class.class_name = '计算机99-1'; 
#查询所有学生及格科目
select Student.s_no,s_name,Course.course_no,course_name,score from Student join Choise,Course where Student.s_no = Choise.s_no and Course.course_no = Choise.course_no and Choise.score >= 60; 
#查询所有学生平均成绩和所选科目数
select Student.s_no,s_name,avg(score),count(score) from Choise join Student  where Student.s_no = Choise.s_no group by s_no;
#查询未参加考试的学生和课程
select Student.s_no,s_name,Course.course_no,course_name,score from Choise join Student,Course where Course.course_no = Choise.course_no and Student.s_no = Choise.s_no and score is NULL;
#查询不及格的学生和课程
select Student.s_no,s_name,Course.course_no,course_name,score from Choise join Student,Course where Course.course_no = Choise.course_no and Student.s_no = Choise.s_no and score < 60;
#查询"程序设计语言"的所有同学和成绩 ANY
select s_name,score from Student,Choise where course_no = any(select course_no from Course where course_name = '程序设计语言') and Student.s_no = Choise.s_no;
#查询所有教师的任课
select t_name,course_name from Teaching,Teacher,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no;
#查询李建国的同学 子查询
select s_name from Student where class_no = (select class_no from Student where s_name = '李建国') and s_name != '李建国';
#查询没有选修计算机基础NOTEXISTS
select s_name from Student,Choise where NOT EXISTS (select course_no from Course where course_name = '计算机基础' and course_no = Choise.course_no) and Student.s_no = Choise.s_no;
#查询主讲数据库原理和应用和主讲数据结构的教师姓名 UNION
select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no and Course.course_name = '数据库原理与应用' UNION select t_name from Teacher,Teaching,Course where Teacher.t_no = Teaching.t_no and Teaching.course_no = Course.course_no and Course.course_name = '数据结构'; 
#插入学生的存储过程
delimiter $$
create procedure insertStudent(
 in s_no char(6),
 in class_no char(6),
 in s_name varchar(10),
 in s_sex char(2),
 in s_birthday datetime
)
begin
insert into Student(s_no,class_no,s_name,s_sex,s_birthday) values(s_no,class_no,s_name,s_sex,s_birthday);
end$$
delimiter ;
#插入课程 学分默认2
#delimiter $$
#create procedure insertCourse(
#in course_no char(5),
#in course_name char(20),
#in course_score numeric(6,2) DEFAULT 2
#)
#begin
#insert into Course(course_no,course_name,course_score) values(course_no,course_name,course_score);
#end$$
#delimiter ;
#根据姓名查询学生信息
delimiter $$
create procedure queryStudent(
 in name varchar(10)
)
begin
select s_no,s_name from Student where s_name = name;
end$$
delimiter ;
#触发器
drop trigger StudentTrigger;
delimiter $$
create trigger StudentTrigger
AFTER INSERT ON Student FOR EACH ROW
begin
select NEW.s_no into @arg1;
select NEW.s_name into @arg2;
end$$
delimiter ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值