第一篇:结构化查询语言
SQL是高级的非过程化编程语言,它允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解其具体的数据存放方式。而它的界面,能使具有底层结构完全不同的数据库系统和不同数据库之间,使用相同的SQL作为数据的输入与管理。
描述 说明 数据定义语言(DDL) CREATE DATABASE\\TABLE、ALTER DATABASE\\TABLE、DROP TABLE\\INDEX 数据操作语言(DML) SELECT、UPDATE、DELETE、INSERT INTO 数据查询语言(DQL) WHERE、ORDER BY、GROUP BY 数据控制语言(DCL) GRANT、REVOKE、COMMIT、ROLLBACK 一.SELECT查询语句
SELECT语句是查询语句,其语法规则如下: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr, ... [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position}[ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position}[ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}]] 1.select语句 SELECT column_name,column_name FROM table_name; 或者 SELECT * FROM table_name; 2.SELECT DISTINCT语句
在表中,可能会包含重复值,但有时也许希望仅仅列出不同(distinct)的值.关键词DISTINCT用于返回唯一不同的值. SELECT DISTINCT column_name,column_name FROM table_name; 3.WHERE Clause SELECT column_name,column_nameFROM table_nameWHERE column_name operator value; 下面的运算符可以在WHERE从句中出现: 运算符 = <> > < 描述 等于 不等于 大于 小于 运算符 >= <= AND OR 描述 大于等于 小于或等于 且 或 运算符 BETWEEN LIKE IN 描述 在某个范围内 搜索某种模式 规定若干个列可能值 (1).AND和OR
AND和OR可在WHERE子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。
SELECT * FROM Customers WHERE Country='Germany' AND City='Berlin'; SELECT * FROM Customers WHERE City='Berlin' OR City='München'; SELECT * FROM CustomersWHERE Country='Germany'AND(City='Berlin' OR City='München'); (2).BETWEEN
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。 SELECT column_name(s)FROM table_name WHERE column_nameBETWEEN value1 AND value2; (3).LINK LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 SELECT column_name(s)FROM table_name WHERE column_nameLIKE pattern; Note:在MySQL中对数据进行模糊查询时需要使用LIKE关键字。SQL语句中支持多种通配符,可以和
LIKE一起使用的通配符有:百分号通配符'%'(匹配任意长度的字符,甚至包括零字符)和下划线通配符'_'(一次只能匹配任意一个字符)。 (4).IN
IN 操作符允许我们在 WHERE 子句中规定多个值。 SELECT column_name(s)FROM table_name WHERE column_nameIN (value1,value2,...); 4.GROUP BY分组查询
分组查询是对数据按照某个或多个字段进行分组,MySQL中使用GROUP BY关键字对数据进行分组,基本语法形式为: SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name Note:HAVINGwhere_condition指定满足表达式限定条件的结果将被显示。 (1).创建分组
GROUP BY函数通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。例如要返回每个水果供应商的水果种类,这里就要在分组过程中用到COUNT()函数把数据分为多个逻辑组,并对每个组进行集合计算。 select s_id,COUNT(*) AS total from fruits GROUP BY s_id; (2).使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示.例如根据S_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息: select s_id,GROUP_CONCAT(f_name) AS names from fruits GROUP BY s_id HAVING COUNT(f_name)>1 Note:HAVING关键字与WHERE关键字都用来过滤数据的,但HAVING是在数据分组之后进行过滤来选择分组,而WHERE在分组之前用来选择记录.MySQL中可以在GROUP BY字节中使用GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来.
(3).在GROUP BY子句中使用WITH ROLLUP
使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量.例如根据s_id对fruits表中的数据进行分组,并显示记录数量:
Select s_id,COUNT(*) AS total from fruits GROUP BY s_id WITH ROLLUP; Note:GROUP BY分组后,在显示结果的最后面新添加了一行,该行total列的值正好是上面所有数值之
和。
5.ORDER BY
ORDER BY 语句用于根据指定的列对结果集进行排序。默认按照升序(ASC)对记录进行排序。如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
SELECT Company, OrderNumber FROM Orders ORDER BY CompanyDESC Note:默认情况下,查询数据按字母升序进行排序(从A~Z),使用关键字DESC可以对查询结果进行降
序排序(从Z~A) 6.LIMIT
SELECT返回所有匹配的行,有可能是表中所有的行,如仅仅需要返回第一行或者前几行,使用LIMIT关键字,基本语法如下:
SELECTselect_expr, ... [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] Note:offset为LIMIT中可选的\位置偏移量\参数,指示MySQL从哪一行开始显示,如果不指定\位置偏移量\将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的偏移量是1……依次类推);第二个参数row_count为\行数\指示返回的记录条数。带一个参数的LIMIT指定从查询结果的首行开始,唯一的参数表示返回的行数,即\n\与\0,n\等价.带两个参数的LIMIT可以返回从任何一个位置开始的指定的行数。
二、INSERT
INSERT INTO 语句用于向表格中插入新的行。 INSERT INTO table_name VALUES (value1,value2,value3,...); 我们也可以指定所要插入数据的列: INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...); 三、UPDATE
Update 语句用于修改表中的数据。 UPDATEtable_nameSET column1=value1,column2=value2,...WHEREsome_column=some_value; Note:当使用UPDATE语句时请小心,如果我们忘记了WHERE从句,结果改变是整个字段的值。 UPDATE Customers SET ContactName='Alfred Schmidt', City='Hamburg'; 四、DELETE
DELETE语句用于删除表中的行。 DELETE FROM table_name WHERE some_column=some_value; 1.删除某行
\会被删除: DELETE FROM Person WHERE LastName = 'Wilson' 2.删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的: DELETE FROM table_name 五、CREATE
1.CREATE DATABASE创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name] 2.CREATE TABLE创建表 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_option ...] [partition_options] 3.CREATE INDEX创建索引 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option ...] 4.CREATE USER创建用户 CREATE USER user_specification [, user_specification] ... user_specification: user@host [IDENTIFIED BY [PASSWORD] 'password'| IDENTIFIED WITH auth_plugin [AS 'auth_string']] Note:user表示创建的用户的名称;host表示允许登录的用户主机名称;IDENTIFIED BY表示用来设置用
户的密码;[PASSWORD]该参数可选,表示使用哈希值设置密码;'password'表示用户登录时使用的普通明文密码。IDENTIFIED WITH语句为用户指定一个身份验证插件;auth_plugin是插件的名称,插件的名称可以是一个带有单引号的字符串,或者带引号的字符串;auth_string是可选的字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义【IDENTIFIED WITH只能在PHP 5.5.7及以上版本中使用,IDENTIFIED BY和IDENTIFIED WITH是互斥的,所以对于一个账户来说只能使用一个验证方法】。
?
使用CREATE USER创建一个用户,用户名是jeffrey,密码是mypass,主机名是localhost,命令如下: CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; Note:如果只指定用户名部分'jeffrey',主机名部分则默认为'%'(即对所有的主机开放权限)。通过CREATE USER语句可以在user表中添加一条新的记录,但是CREATE USER语句创建的新用户没有任何权限,还需要使用GRANT语句赋予用户权限。【建议使用GRANT语句创建新用户】
六、DROP删除
1.DROP DATABASE删除数据库 DROP DATABASE [IF EXISTS] db_name 2.DROP TABLE删除数据表 DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... Note:使用DROP TABLE命令可以一次删除一个或多个没有被其他表关联的数据表,只需将要删除的表名依次写在后面,想到之间用逗号隔开即可。如果要删除的数据表不存在,则MySQL会提示一条错误信息:\ERROR 1051 (42S02): Unknown table 'tb12'\;参数\用于在删除前判断删除的表是否存在,加上该参数后再删除表的时,如果表不存在,SQL语句可以顺利执行,但是会发出警告:\OK, 0 rows affected, 1 warnings (0.00 sec)\。
? 删除被其他表关联的主表
数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性。如果必须要删除,可以先删除与它关联的子表,再删除父表,只是这样同时删除了两个表中的数据。但有的情况下可能要保留子表,这时如要单独删除父表,只需将关联的表的外键约束条件取消,然后就可以删除父表。
3.DROP INDEX删除索引 DROP INDEX index_name ON tbl_name 七、ALTER
1.ALTER DATABASE
ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name... 2.ALTER TABLE修改数据表
修改表指的是修改数据库中已经存在的数据表的结构。MySQL使用ALTER TABLE语句修改表,常用的修改表的操作有:修改表名、修改字段数据类型/字段名、增加/删除字段、修改字段的排列位置、更改表存储引擎、删除表的外键约束等。
1.修改表名 ALTER TABLEtbl_nameRENAME [TO] new_tbl_name 2.修改字段的数据类型 ALTER TABLEtbl_nameMODIFY [COLUMN] column_definition 3.修改字段名 ALTER TABLEtbl_nameCHANGE [COLUMN] old_col_namecolumn_definition 4.添加字段 ALTER TABLE tbl_name ADD [COLUMN] column_definition [FIRST | AFTER col_name ] 5.删除字段 ALTER TABLE tbl_name DROP [COLUMN] col_name 6.修改字段的排列位置 ALTER TABLE tbl_name MODIFY [COLUMN] column_definition [FIRST | AFTER col_name] ? column_definition:col_namedata_type ? FIRST为可选参数,指将column_definition中的col_name字段修改为表的第一个字段。 ? AFTER col_name,指将column_definition中的col_name字段插入到col_name后面。 7.更改表的存储引擎 ALTER TABLE tbl_nameENGINE [=] engine_name 8.删除表的外键约束 ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol ? fk_symbol为外键约束名,指在定义表时CONSTRAINT关键字后面的参数。
八、GRANT权限设置
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] {tbl_name | * | *.* | db_name.*} TO user@host [IDENTIFIED BY [PASSWORD] 'password'] ->priv_type为赋予用户的权限类型,如下:Select_priv|Insert_priv|Update_priv|Delete_priv| Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections
->tbl_name | * | *.* | db_name.*表示用户的权限所作用的数据库中的表;IDENTIFIED BY关键字用来设置密;'password'表示用户密码。
? 下面为my_db数据指定用户名为admin,密码为admin888. grant all onmy_db.* to 'admin'@'localhost' identified by 'admin888'; ? 创建一个新的用户myuser,密码为mypwd,并授于用户所有数据表的SELECT和UPDATE权限。 mysql>grant select,update on *.* to 'myuser'@'localhost' identified by 'mypwd'; 执行成功后,使用SELECT语句查询用户myuser的权限: mysql> select host,user,select_priv,update_priv from mysql.user where user='myuser'; +-----------+--------+-------------+-------------+ | host | user | select_priv | update_priv | +-----------+--------+-------------+-------------+ | localhost | myuser | Y | Y |