Monday, May 3, 2010

Absolute Beginners Guide to Joomla!

As someone who has not used Joomla! before, you need to know how to get started. Maybe you have a friend or a neighbour who uses Joomla! and you want a Joomla! web site of your very own. Maybe you have a small business or a club or a community that needs a web presence, and you want to use Joomla! for that purpose. Maybe you are a seasoned Information Technology professional, but you have never Joomla! before. If so, you are just starting a very enjoyable journey and we warmly welcome you to Joomla! and encourage you to read the
Absolute Beginner's Guide to Joomla!

Absolute Beginners Guide to Joomla!

Welcome to Joomla!, a leading open source Content Management System (CMS) platform. Joomla! is a well-tested, extensible and effective tool supported by a very active and friendly community of developers and users.
Do you want to get started with Joomla!, but you have no idea where to begin? If so, you have come to the right place. The Absolute Beginner's Guide to Joomla! is just for you.
Although you could spend a lifetime learning Joomla!, if you master the basics you will be able to make a vary attractive and useful basic website in very little time and with no no special technical skills.

What is Joomla!?

Joomla! is software that lets you make and update web pages easily.
You can think of a Joomla! website as bringing together three elements.
  • Your content, which is mainly stored in a database.
  • Your template, which controls the design and presentation of your content (such as fonts, colors and layout).
  • Joomla! which is the software that bring the content and the template together to produce webpages.

Installing Joomla!

There are several ways to install Joomla!.
First, make sure that you have an account on a web server. For most people this means signing up with a hosting company and purchasing a domain that will serve as your site's main address.
  • Option One: One Click Installs. Many hosting companies offer "instant" installation of Joomla!. Follow the instructions your host provides for a one click install.
  • Option Two: Conventional Installs. This method requires that you copy the Joomla! zip file to your hosting account, unzip, create a database, and then run the installation. Complete instructions can be found in the Joomla! Installation Manual. This video takes you through the steps

For support with installation, you can ask questions in the installation forum.

Learn to Use Joomla!

Now that you have a working Joomla! site, you will want to start filling it with your own content and making it look just the way you want. Before doing that, it is a good idea to learn more about how Joomla! works. There are a number of very useful resources to help you with this.
This article shows you how to create an article from the front end.
One way is to learn by working with the sample data.
There is also a very nice beginners visual guide to getting started with Joomla! 1.5 here: Learn Joomla! 1.5 Fast! Scribd (PDF 1.3Mb) written by Saurabh Bhide.
The Joomla! v 1.5 Quick Start Guide Scribd, written by Kevin Hayne. As you read the guide, walk through the video accompaniment created by Michael Casha.

The Joomla! Core Features Guide scribd, written by James Ramsay describes the features are available in each download of Joomla!.
Joomla! works using various extensions, some that come with your installation and some that you add yourself. This document explains the types of Joomla! extensions.
For support as you are learning, ask questions in the New to Joomla1/General Joomla! v 1.5 forum.
The Joomla! Demo site is a good place to try out many of these features if you have not yet done an installation.
The Glossary will help you as learn more.

Start Creating Your Site

Now you're ready to start making your own articles, weblinks, contacts, banners, and newsfeeds.
Before you jump into doing this you may want to review Planning_Your_Web_site
One of the first tasks you may want to do is to modify one of the templates that comes with Joomla! so that it displays your site name and logo.

Finally, you may want to install one or more of the thousands of extensions to Joomla!

Read How to install an extension.
Please remember that all extensions are developed by independent developers. If you need help with a specific extension the best source will be that developer.

For help visit:

Keep Your Site Secure

Security is always a big concern on the web. Make sure you are using best security practices. The basic techniques on the Security Check List will get your site off to a good start in terms of security.

Getting Help

The Joomla! forums are the among the busiest (and most friendly) support forums in the world, and they are a great place to get help and meet other Joomla! users.
  • Please make certain you search, first, before posting a question. Nine times out of ten someone else had the same issue that you had. As it turns out, we all travel a similar path.
  • Also, check the FAQs--Frequently Asked Question.
  • Make sure you are posting in the right forum for your topic.
  • Be clear and specific in your request for help. Entries like “Help! It doesn’t work!” tend to get ignored. Try to explain everything that led up to your problem. Try to explain what your problem is. Be clear about what you want to happen. And, thank those who bother to help!
  • If your question/problem was solved, mark your thread as solved by editing the first post you made in that thread and changing the topic icon to the green check mark with a circle. You can also add [Solved] to your topic title. By doing this you allow other members who are doing searches to easily differentiate between solved and unsolved issues. This also saves the volunteers' time of having to open up solved topics.
  • As soon as you know things, start answering questions. Answering questions is one of the best ways to learn.
  • If someone helps you, say thank you and pay it forward by answering a question yourself.

Selected Advanced Beginner and Intermediate Topics

The remainder of this document briefly covers some slightly more advanced topics for web masters.


Learn to Backup and Restore

Learn to backup your Joomla! database. Learn to restore your Joomla! database. Frequent backups are the best way to make sure you can recover if your site has a problem. This video entitled How to backup and restore a Joomla! database using phpMyAdmin by kristofdb.

How to Recover Your System Administration Password

Watch this video by James Ramsey entitled How to Recover your Administrator Password using phpMyAdmin.

Exploring the possibilities with Joomla! v 1.5 Core


Creating a Local Installation

People creating complex websites often like to work on their own computer and to move the whole site to their web server when it is ready.
To do this you will need to install a webserver (such as Apache or IIS), PHP and MySQL on your local machine. There are a number of tools that make it easy to do this.

Apache

For Apache you can install XAMPP and then perform a normal web based Joomla! installation on your computer.
The Joomla! Quickstart Guide and accompanying video explain XAMPP installation in detail.

IIS

For IIS you can install the Windows Web platform.

Using Mootools

There are many great things you can do with Mootools, included in Joomla! v 1.5. Check out these resources to learn how:

Learn the Basics of Joomla! Templating


Using CSS Class Suffixes

There are other simple things you can do with templates to achieve the look you need. These simple tutorials could be very helpful.

Getting Rid of Tables


Adding Javascript to your Template


Troubleshooting a Template Installation

If you are having trouble installing a template, see How to resolve problems with a template installation Scribd by Chad Windnagle (drmmr763).

Questions?


Address Search Engine Optimization

Search Engine Optimization is the practice of doing whatever is needed to help make your Web site rank higher in return results for a search engine. For some, this is very important aspect of attracting visitors to their site. Most experts agree, however, that the single best way to improve your chance of getting attention on the Internet is to provide good content on a regular basis. There are several things that you can do using core functionality to make your Joomla! Web site more SEO friendly. Here are some important areas to focus.

Configure and troubleshoot SEF URLs


Remove WWW from your domain name


Create a Custom 404 Page


SEO Questions

Questions on these topics should be asked in the Joomla! v 1.5 SEO Forum.

SEF URL Questions?


Converting an Existing Website to Joomla!

Check out the How to Convert an existing Web site to a Joomla! Web site guide for great step by step instructions.

Thanks to our GHOP Contestants!

Most of this material was written by Joomla! Google Highly Open Participation Contestants. This work is of the highest quality and the students were inspiring to work with. Sincere thanks to all of our participants for sharing their gifts with the Joomla! community. You guys rock!

hack wid cmd

CMD, the basics and a few scripts

CMD

CMD is short for commander.
It is great for a lot of things and it's also very clean.



-----------------------------------------------------------------------------------------------
Lets learn how to make the computer shut down everytime it's booted, shall we?
-----------------------------------------------------------------------------------------------



First open CMD,

Next open notepad.

If you write "start shutdown -r" in CMD and press enter, your computer will restart. Also if you write the same in "run".
(Change -r to -s to shutdown computer, or write -l to logg off.)

If you write
---------------------------------------
@echo off

cls
start shutdown -r

cls
goto :a
---------------------------------------
in notepad and save it as something.bat (bat is important) and then open it, your computer will restart in the same way.

So, lets get into autostart. Put that bat file in autostart (autostart can be found in start menu) and each time your
computer is booted it will start that file and your computer will restart.
If you write the next script your computer will try to shutdown several times at once. it will freak for about half a minute
and then turn off.


Lets get a better understanding how scripts works. The above script shuts down your computer, but a bat file normaly opens
CMD and does whatever you told it to do.


@echo off - This is where you put commands that shouldn't be shown as text. For example cls. You don't want that to be text,
it's a command.

cls - This one is pretty good, it clears the text in the CMD screen

CMD - This command gives you a new CMD session.

start - this triggers stuff, in this case it's shutdown.

color - changes the colour in the cmd window, I recommend writing "color 0a", which is a green color thats really cool
on a black window.

title - write "title something" to change title.

goto :a - This one is really, really, really, really cool. It's used for making loops and some more advanced stuff that I
wont go into. Lets say you write
--------------------------------------
@echo off
:a
cls
start shutdown -r

cls
goto :a
--------------------------------------

The goto :a tells you to go to :a higher up in the script. so it starts the script again, then it does the goto :a command
again and the script reloads. Basicaly a loop. You can change the "a" to whatever you want, for example "error". This is
only to make it easier for you to read your script.

The : infront of "a" must stay where it is.
Bad example:
goto: a

Good example:
goto :a

--------------------------------------

dir - This shows you the files in the directory you are in.

dir /s - This shows you all the files on your computer.

echo - write "echo something" and it will be as a text in cmd.

echo. This is a linebrake.

cd - Write cd followed up with a location, to go there in cmd. For example "cd c:\windows".

cd .. - This goes back one step in the directory. For example if your in c:\windows and write "cd .." you go back to c:\.

So now you know the basics, which we'll use to make you computer do stuff. In cmd you can write "help" to get a list of most
commands.

Moving away from learning commands now.



-----------------------------------------------------------------------------------------------
Lets make a spamm script.
-----------------------------------------------------------------------------------------------



-----------------------------------------------
@echo off
cls
:a
start notepad.exe
goto :a

-----------------------------------------------
this script will continue to open notepad until you close cmd. Not recommended to run this on a slow computer.
As we said before, "start" triggers things, this script triggers notepad and then the loop (goto :a) is triggered.



-----------------------------------------------------------------------------------------------
Lets just mess around.
-----------------------------------------------------------------------------------------------



-----------------------------------------------
@echo off
cls
:a
taskkill /im explorer.exe /f
goto :a
-----------------------------------------------

This will close the bar where start menu and tasks are shown, for example if you open internet you will see it at the bottom
of the screen on the explorer bar.
Closing this will leave people with little things to do.

IP Address Hack, n all bt it !!

In here I have figure out some very easy but cool ways to trace out the geographical location and various other infos like ISP details etc of a remote computer using its IP.




Well I guess its one of the most important must learn manul for boys out there if you want to impress your friends particularly gals whom you’ll meet online in a chat room and tell them their geographical locations and ISP details and make them surprised and impressed .



In the practical execution of this manual you don’t have to work much as it is very simple only you have to use your brain to understand some symbols and some format of expressions and use your IQ to execute things the right way.









What is IP and how to get the IP of a remote system::







Getting the IP or Internet Protocol of a remote system is the most important and the first step of hacking into it. Probably it is the first thing a hacker do to get info for researching on a system. Well IP is a unique number assigned to each computer on a network. It is this unique address which represents the system on the network. Generally the IP of a particular system changes each time you log on to the network by dialing to your ISP and it is assigned to you by your ISP. IP of a system which is always on the network remains generally the same. Generally those kind of systems are most likely to suffer a hacking attack because of its stable IP. Using IP you can even execute system commands on the victim’s computer.



Lets take the example of the following IP address: 202.144.49.110 Now the first part, the numbers before the first decimal i.e. 209 is the Network number or the Network Prefix.. This means that it identifies the number of the network in which the host is. The second part i.e. 144 is the Host Number that is it identifies the number of the host within the Network. This means that in the same Network, the network number is same. In order to provide flexibility in the size of the Network, here are different classes of IP addresses:







Address Class Dotted Decimal Notation Ranges



Class A ( /8 Prefixes) 1.xxx.xxx.xxx through 126.xxx.xxx.xxx



Class B ( /16 Prefixes) 128.0.xxx.xxx through 191.255.xxx.xxx



Class C ( /24 Prefixes) 192.0.0.xxx through 223.255.255.xxx







The various classes will be clearer after reading the next few lines.







Each Class A Network Address contains a 8 bit Network Prefix followed by a 24-bit host number. They are considered to be primitive. They are referred to as "/8''s" or just "8's" as they have an 8-bit Network prefix.



In a Class B Network Address there is a 16 bit Network Prefix followed by a 16-bit Host number. It is referred to as "16's".







A class C Network address contains a 24-bit Network Prefix and a 8 bit Host number. It is referred to as



"24's" and is commonly used by most ISP's.







Due to the growing size of the Internet the Network Administrators faced many problems. The Internet routing tables were beginning to grow and now the administrators had to request another network number from the Internet before a new network could be installed at their site. This is where sub-netting came in.







Now if your ISP is a big one and if it provides you with dynamic IP addresses then you will most probably see that whenever you log on to the net, your IP address will have the same first 24 bits and only the last 8 bits will keep changing. This is due to the fact that when sub-netting comes in then the IP Addresses structure becomes:







xxx.xxx.zzz.yyy







where the first 2 parts are Network Prefix numbers and the zzz is the Subnet number and the yyy is the host number. So you are always connected to the same Subnet within the same Network. As a result the first 3 parts will remain the same and only the last part i.e. yyy is variable.



***********************







For Example, if say an ISP xyz is given the IP: 203.98.12.xx Network address then you can be awarded any IP, whose first three fields are 203.98.12. Get it?







So, basically this means that each ISP has a particular range in which to allocate all its subscribers. Or in other words, all subscribers or all people connected to the internet using the same ISP, will have to be in this range. This in effect would mean that all people using the same ISP are likely to have the same first three fields of their IP Addresses.







This means that if you have done a lot of (By this I really mean a lot) of research, then you could figure out which ISP a person is using by simply looking at his IP. The ISP name could then be used to figure out the city and the country of the person. Right? Let me take an example to stress as to how cumbersome but easy (once the research is done) the above method can be.







In my country, say there are three main ISP’s:







ISP Name Network Address Allotted







ISP I 203.94.47.xx



ISP II 202.92.12.xx



ISP III 203.91.35.xx







Now, if I get to know the IP of an e-pal of mine, and it reads: 203.91.35.12, then I can pretty easily figure out that he uses ISP III to connect to the internet. Right? You might say that any idiot would be able to do this. Well, yes and no. You see, the above method of finding out the ISP of a person was successful only because we already had the ISP and Network Address Allotted list with us. So, what my point is, that the above method can be successful only after a lot of research and experimentation. And, I do think such research can be helpful sometimes.







Also, this would not work, if you take it all on in larger scale. What if the IP that you have belongs to someone living in a remote igloo in the North Pole? You could not possibly get the Network Addresses of all the ISP’s in the world, could you? If yes please send it to me J.







Well now I guess you have pretty good knowledge about what an IP is and what you can do by knowing the IP of a remote system. Now lets come to the point of finding out the IP of remote system.



Well you can easily figure out the IP of a remote system using the netstat utility available in the microsoft’s version of DOS. The netstat command shows the connections in which your system is engaged to and the ports they are using. Suppose you are checking your mail in hotmail and you want to find out the IP of msn. All you need to do is to open a dos window (command.com) and type netstat. You will see all the open connections of your system. There you will see something :







Proto Local Address Foreign Address State



TCP abhisek:1031 64.4.xx.xx:80 ESTABLISHED







Now you got the IP address of hotmail ass 64.4.xx.xx .



Similarly you can figure out the IP address of most http or ftp connections.







To know your own IP type the following command in a dos windows



C:\netstat –n



[this commands converts the IP name into IP addresses]



this is what you will probably see on typing the above command :







Proto Local Address Foreign Address State



TCP 203.xx.251.161:1031 194.1.129.227:21 ESTABLISHED



TCP 203.xx.251.161:1043 207.138.41.181:80 FIN_WAIT_2



TCP 203.xx.251.161:1053 203.94.243.71:110 TIME_WAIT



TCP 203.xx.251.161:1058 194.1.129.227:20 TIME_WAIT



TCP 203.xx.251.161:1069 203.94.243.71:110 TIME_WAIT



TCP 203.xx.251.161:1071 194.98.93.244:80 ESTABLISHED



TCP 203.xx.251.161:1078 203.94.243.71:110 TIME_WAIT







Here 203.xx.251.161 is your IP address.







Now lets clarify the format used by netstat :







Proto : It shows the type of protocol the connection with the remote system is using.



Here TCP (transmission control protocol) is the protocol used by my system to connect to other systems.







Local Address : It shows the local address ie the local IP. When the netstat command is executed without –n switch then the name of the local system is displayed and when the netstat is executed with –n switch then the IP of the local system is displayed. Here you can also find out the port used by the connection.



xxx.yyy.zzz.aaa:1024



in this format you will see the local address. Here 1024 is the port to which the remote system is connected in your system







Foreign Address :: It shows the IP address of the remote system to which your system is connected. In this case also if the netstat command is excuted with –n switch then you directly get the IP of the victim but if the netstat is executed without –n switch then you will get the address of the remote system. Something like







C:\netstat



Proto Local Address Foreign Address State



TCP abhisek:1031 msgr.lw4.gs681.hotmail.com:80 ESTABLISHED







Here msgr.lw4.gs681.hotmail.com is the address of the foreign system . putting this address in any IP lookup program and doing a whois lookup will reveal the IP of the remote system.







Note: The port to which your system is connected can be found from this in the same way as I have shown in the case of local address. The difference is that, this is the port of the remote system to which your computer is connected to.
Below I have produced a list of ports and popular services generally found to be running.

21 :: FTP port

80 :: http port

23 :: Telnet port

Note: If your execute the netstat command and find ports like 12345,27374 are open and are in use then make it sure that your sweat heart computer is infected with her boyfriend.. J J J J I mean your computer is infected with some sort of Trojan.

Below I have produced a list of commonly known Trojans and the ports they use by default. So if you find these ports open then get a good virus buster and get these stupid servers of the Trojans kicked out. Well if you want to play with these Trojan by keeping them in your computer but not letting them ruin your system performance then just disble it from the system registry run and they wont be loaded to memory each time when windows starts up[This trick doesn’t work for all Trojans].



Netbus :: 12345(TCP)
Subseven :: 27374(TCP)
Girl Friend :: 21554(TCP)
Back Oriface :: 31337 (UDP)

Well guys and gals I hope you are now well familiar with the term IP and what is the utility of IP in cyber world and how to get the IP of a remote system to which you are connected. I hope you find my writings very easy to undertstand. I know I lack the capacity of explaining myself but I try my level best to make things very easy and clear for you’ll.

How to get the IP of a remote system while chatting through msn messenger ::

This is a tutorial on how to get IP address from MSN messenger. This is actually
a really easy thing to do. It is not like going through the hard time and reversing
MSN messenger like many people think.

The IP address is only given when you accept or are sending a file through MSN
messenger. When you send IM's, the message is sent through the server thus hiding
your victims IP and your. But when you send a file or recieve a file, it is direct
connection between the two computers.

To obtain the IP accept a file transfer or send a file to the victim, when the file
sending is under way from the dos prompt type "netstat" without the quotation marks.
You should get a table like this:



Proto Local Address Foreign Address State
TCP kick:1033 msgr-ns29.msgr.hotmail.com:1863 ESTABLISHED
TCP kick:1040 msgr-sb36.msgr.hotmail.com:1863 ESTABLISHED

TCP kick: ESTABLISHED



The top name in the list is the server's address for IMing. There could be many of

the second name in the list, as a new connection is made to the server for every

room you are IMing to. You are looking for the address of the remote host in

this table it may be something similar to "host63-7-102-226.ppp.cal.vsnl.com" or “203..64.90.6”.

without the quotation marks.

All you need to do now is to put this address in you IP lookup programe and get the IP of the remote system.





Well 50%of the work is done now. Now you know how to get the IP of a remote system, so its time to trace it down and find some details about the IP.







Tracing an IP is quite simple. You can do it the easy way by using some sweet softwares like Visual Trace 6.0b



[ftp://ftp.visualware.com/pub/vr/vr.exe]



Neotrace



[http://www.neoworx.com/download/NTX325.exe]



or by our way ie. Using MS DOS or any other version of DOS.



Well I suggest you to use DOS and its tracert tool for tracing the IP cause using it will give you a clear conception about the art of tracing an IP and I guarantee that you will feel much satisfied on success than using a silly software. Furthur you will know how things work and how the IP is traced down and the different networks associated in this tracing process.







Let us take a look at tracert tool provided for DOS by Microsoft.



It is a very handy tool for peoples need to trace down an IP.



Just open any DOS windows and type tracert.







C:\windows>tracert







Usage: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name





Options:



-d Do not resolve addresses to hostnames.



-h maximum_hops Maximum number of hops to search for target.



-j host-list Loose source route along host-list.



-w timeout Wait timeout milliseconds for each reply.





You will now see a description of the tracert command and the switches associated with it.



Well these switches doesn’t makes much difference. All you can do is to increase the timeout in milliseconds by using –w switch if you are using a slow connection and the –d switch if you wish not resolve address to hostnames by default.



By default tracert performs a maximum of 30 hops trace. Using the –h switch you can specify the number of hops to perform.



Now its time for execution.



Let us trace down the IP yahoo.com [216.115.108.243]

TIP: If you have done a long research (I mean a lot) then simply looking at the IP you can figure out some info from it. For example the IP 203.90.68.8 indicates that the system is in India. In India IPs generally begin with 203 and 202

C:\WINDOWS>tracert yahoo.com
Tracing route to yahoo.com [216.115.108.243] over a maximum of 30 hops:

1 308 ms 142 ms 127 ms 203.94.246.35



2 140 ms 135 ms * 203.94.246.1



3 213 ms 134 ms 132 ms 203.94.255.33



4 134 ms 130 ms 129 ms 203.200.64.29



5 122 ms 135 ms 131 ms 203.200.87.75



6 141 ms 137 ms 121 ms 203.200.87.15



7 143 ms 170 ms 154 ms vsb-delhi-stm1.Bbone.vsnl.net.in [202.54.2.241]



8 565 ms 589 ms 568 ms if-7-0.bb8.NewYork.Teleglobe.net [207.45.198.65]



9 596 ms 584 ms 600 ms if-3-0.core2.NewYork.teleglobe.net [207.45.221.66]



10 * * * Request timed out.



11 703 ms 701 ms 719 ms if-3-0.core2.PaloAlto.Teleglobe.net [64.86.83.205]



12 694 ms 683 ms 681 ms if-6-1.core1.PaloAlto.Teleglobe.net [207.45.202.33]



13 656 ms 677 ms 700 ms ix-5-0.core1.PaloAlto.Teleglobe.net [207.45.196.90]



14 667 ms 673 ms 673 ms ge-1-3-0.msr1.pao.yahoo.com [216.115.100.150]



15 653 ms 673 ms 673 ms vl20.bas1.snv.yahoo.com [216.115.100.225]



16 666 ms 676 ms 674 ms yahoo.com [216.115.108.243]

Trace complete.


Note: Here I have traced yahoo.com. In place of yahoo.com you can give the IP of yahoo or any other IP you want to trace, the result will be the same.

Now carefully looking at the results you can figure out many information about yahoo’s server [216.115.108.243]

First packets of data leave my ISP which is at 203.94.246.35 .Similarly you can find out the different routers through which the packets of data are send and received to and from the target system. Now take a look at the 13th line you’ll see that the router is in PaloAlto.Teleglobe.net from this you can easily figure out that the router is in Palo Alto. Now finally look at the target system ie. Yahoo’s server vl20.bas1.snv.yahoo.com . Now you got the address of yahoo’s server. Now put this address in any IP lookup programe and perform and reverse DNS lookup and you will get most of the info about this address,like the place where it is in.



Well another thing you can find out using the tracert tool is that the number of hops (routers) the target system is away from you. In case of tracerouting yahoo.com we find that the target system ie yahoo’s server is 16 hops away from my system. This indicates that there are 16 routers between my system and yahoo’s server.

Apart from tracing an IP you can find out many usefull details about the target system using the tracert tool.

Firewall Detection

While tracerouting a target system, if you get * as an output then it indicates timeout error. Now if you peform another tracerout to the same taeget system at some other time with a good connection and in this way few times more and if you always get * as the output then take it for sure that the target system is running a firewall which prevents sending of data packets from the target system.

Example

Some days ago I tried to tracert hotmail’s server in plain and simple way using tracert without any trick.This is what I found out :

c:\windows>tracert 64.4.53.7

Tracing route to lc2.law5.hotmail.com [64.4.53.7]

over a maximum of 30 hops:


1 * * * Request timed out.
2 161 ms 147 ms 85 ms 203.90.69.81
3 126 ms 261 ms 219 ms 203.90.66.9
4 121 ms 115 ms 228 ms delswp2.hclinfinet.com [203.90.66.133]
5 727 ms 725 ms 711 ms 203-195-147-250.now-india.net.in [203.195.147.250]
6 1006 ms 794 ms 952 ms core-fae-0-0.now-india.net.in [203.195.147.3]
7 826 ms 731 ms 819 ms 213.232.106.9
8 885 ms 744 ms 930 ms 213.166.3.209
9 851 ms 1020 ms 1080 ms 213.232.64.54
10 1448 ms 765 ms 1114 ms pos8-0.core2.London1.Level3.net [212.113.0.118]
11 748 ms 789 ms 750 ms ge-4-2-1.mp2.London1.Level3.net [212.187.131.146]
12 719 ms 733 ms 846 ms so-3-0-0.mp1.London2.Level3.net [212.187.128.46]
13 775 ms 890 ms 829 ms so-1-0-0.mp2.Weehawken1.Level3.net [212.187.128.138]
14 853 ms 852 ms 823 ms so-3-0-0.mp1.SanJose1.Level3.net [64.159.1.129]
15 889 ms 816 ms 803 ms so-7-0-0.gar1.SanJose1.Level3.net [64.159.1.74]
16 * * * Request timed out.
17 * * * Request timed out.
18 * * * Request timed out.
19 * * * Request timed out.
20 * * * Request timed out.
21 * * * Request timed out.
22 * * * Request timed out.
23 * * * Request timed out.
24 * * * Request timed out.
25 * * * Request timed out.
26 * * * Request timed out.
27 * * * Request timed out.
28 * * * Request timed out.
29 * * * Request timed out.
30 * * * Request timed out.
Trace complete.

I performed the same tracert many times a day but concluded with the same result. This indicates that the systems after the router SanJose1.Level3.net has firewalls installed which prevents the outgoing of data packets.

Detecting Traceroute Attempts on your System

You can detect that an attacker is performing a traceroute on your system, if you see the following symptoms:

1. If you observe port scans on very high UDP ports. This symptom means that the attacker has performed a traceroute on your system. However, it could also mean a simply port scan. Either way, it signifies the fact that your system is being scanned.

2. If the packet-monitoring tool installed in your network, picks up several outgoing TTL-exceeding messages, then it is yet another sign that someone is doing a traceroute on your system.

3. If in these log files, you also observer an outgoing ICMP port unreachable error message, then it means that since a traceroute was done on your system and as the target system i.e. your system, was reached, it responded with this error message.

You can also find our more information on the attacker (if he performs a traceroute on your system) by simply studying the sniffer log files. If you observer the TTL values, then we can easily figure out the following information on the attacker by making use of OS detection techniques discussed earlier in this white paper:

The Operating System running on the attacker’s target system.

Number of hops away, the attacker is from you.

OKI DOKI that’s all for this article. Hope you will find this article very easy to understand and implement.

What is Gpedit.msc ?

Group Policy Editor (gpedit.msc) in Windows XP Professional
The Group Policy Editor in Windows XP Professional is a management console that provides convenient configuration of many system properties and for running scripts. How It might be used is illustrated with several examples.

About the Group Policy Editor- How it works

Although the Group Policy Editor console (gpedit.msc) is mostly used by administrators of networks and domains, it also has uses for a stand-alone home computer. One application is to allow convenient and easy editing of the Registry so that a variety of tweaks or changes to the system can be made. These settings are known as policies and are stored in a special hidden folder %SystemRoot%\System32\GroupPolicy\
(For most home systems the environment variable %SystemRoot% is C:\Windows.)
Policies that apply to the machine are stored in a sub-folder "Machine" and policies that apply to a user are stored in a sub-folder "User". In each case the settings are in a file named "Registry.pol". Thus the settings for the machine are in %SystemRoot%\System32\GroupPolicy\Machine\Registry.pol and in similar fashion user settings are in User\Registry.pol. Policies are used to write to a special key of the Registry and override any settings elsewhere in the Registry. Since only the administrator account can access the policy settings, limited account users can be prevented from making unwanted system changes.
Another useful application of the Group Policy Editor (GPE) is to provide for the automatic running of scripts or programs whenever the computer is started up or shut down or when a user logs on or off. This may be the application of most practical use to a typical home PC user.
(Note that the GPE is not present in the Home Edition of Windows XP. The usual warnings about being careful when editing the Registry apply.)

 

Using the Group Policy Editor

Like many other management consoles, the GPE is not listed in Start-All Programs. To open it, go to Start-Run and enter "gpedit.msc" (without quotes). Figure 1 shows one view of the console. Note that there are entries for the computer configuration and for the user configuration. Selecting either one then gives the entries shown in the right panel of the figure. Clicking plus signs in the left panel will expand the selections.
Figure 1. Group Policy Editor
Group
 Policy Editor

Administrative templates- Example of removing the Desktop Cleanup Wizard

The editing possibilities are quite numerous and too many to cover in detail here but I will illustrate the procedure with an example that an average home PC user might be interested in. Custom configurations can be made but there are also a number of pre-existing templates that provide for a variety of standard choices. One of these is whether to turn the desktop cleanup wizard off. Personally, I am irritated by the Windows nanny that is always nagging me to remove unused icons from the desktop. This nuisance can be turned off in other ways but I will use the GPE to illustrate the general procedure for using a template. Figure 2 shows an expanded view of the GPE with Desktop templates shown.
Figure 2. Expanded view of Group Policy Editor
The right panel in Figure 2 shows the numerous tweaks that can be made to the Desktop. To illustrate the process for making changes, Figure 3 shows the dialog box obtained by double-clicking the the right-panel entry "Remove the Desktop Cleanup Wizard". The radio buttons are used to enable or disable the wizard. "Not configured" will leave the setting up to the user's discretion.
Figure 3. Dialog for configuring Desktop Cleanup Wizard

Running scripts or programs at startup/shutdown or user logon/logoff

A very useful feature of GPE is the ability to to set scripts or programs to run automatically when the computer is turned on or shut down or when a user logs on or off (Figure 4). Any executable file can be invoked. This would include files with the extensions BAT, CMD, EXE, JS, VBS and others. There are other ways to run scripts or programs at startup but not so many for shutdown so I will illustrate the script capabilities of GPE with a discussion of shutdown or logoff scripts.
In Figure 4, the entry "Windows Settings" entry has been expanded and you can see entries that provide a way to add scripts for both startup and shutdown. Scripts can also be set to run when a user logs on or off by selecting "User Configuration-Windows Settings". More than one script can be run and in a particular order. Also, command-line parameters can be specified.
Figure 4. Running scripts
To add a script, double-click the entry "shutdown" in the right pane shown in Figure 4 and the window shown in Figure 5 will open.
Figure 5. adding a shutdown script
Click the "Add..." button to get the dialog box shown in Figure 6.
Figure 6. Choosing the file for a script
Browse to the file that you wish to add and indicate any parameters that are needed to go with the script or program. Scripts or programs may be located anywhere on the computer but a convenient location for scripts is provided by the folder C:\WINDOWS\System32\GroupPolicy\Machine\Scripts\Shutdown There are corresponding folders for Startup, User\Scripts\Logon and User\Scripts\Logoff

Monday, April 12, 2010

Intro To RDBMS



This tutorial explains what a relational database management system (RDBMS) is.  It describes basic RDBMS functions and contrasts RDBMS with other database management systems (DBMS) and alternate forms of data storage.
Database design is also discussed, including the important concept of database normalization. The most widely used database management systems and RDBMS vendors are introduced at the end of the tutorial.
The integration of Internet applications with relational databases is explored in the "Dynamic Website" portion of our site.  It explains how an Internet website can be integrated with a RDBMS to create a dynamic, data driven website.

                           Database Functionality
A relational DBMS is special system software that is used to manage the organization, storage, access, security and integrity of data.  This specialized software allows application systems to focus on the user interface, data validation and screen navigation.  When there is a need to add, modify, delete or display data, the application system simply makes a "call" to the RDBMS.
Although there are many different types of database management systems, relational databases are by far the most common.  Other types include hierarchical databases and network databases.
Although database management systems have been around since the 1960s, relational databases didn't become popular until the 1980s when the power of the computer skyrocketed and it became feasible to store data is sets of related tables and provided real-time data access.
             

By storing data in a RDBMS, undesirable data redundancy can be avoided.  This not only makes data management easier, but it also makes for a flexible database that can respond to changing requirements.
 http://rdbms.ca/database/alternatives.html 


When designing a relational database, it is normally a good thing to "normalize" the database.  There are different degrees of normalization, but in general, relational databases should be normalized to the "third normal form".  Simply put, this means that the attributes in each table should "depend on the key, the whole key and nothing but the key".
An example of a de-normalized database table is provided below. The database designer has assumed that there will never be a need to have more than two order items in any one order:
By moving repeating groups of attributes to a separate database table, the database design becomes more flexible. A single order can now support any number of order items; not just just two. The primary key (PK) of the Order Item table is the "Order Nbr" (represented by the relationship) plus the "Order Item Nbr":
The "Order Item Description" field is dependent on the "Order Item Code"; not the unique identifier of the Order Item Table (i.e. "Order Nbr" + "Order Item Nbr").  By creating a classification table, the database become even more flexible.  New codes can easily be added.  The "Order Item Description" for a given code can easily be altered should the need ever arise (e.g. "blue widget" => "light blue widget"):
A RDBMS alone will not solve all data management issues. A good data analyst and/or database analyst is needed to design a flexible and efficient relational database.
                                          RDBMS VENDORS
There are many different vendors that currently produce relational database management systems (RDBMS).  Relational databases vary significantly in their capabilities and in costs.  Some products are proprietary while others are open source.  The leading vendors of RDBMS are listed below:
   RDBMS Vendors      RDBMS     
Computer AssociatesINGRES
IBMDB2
INFORMIX SoftwareINFORMIX
Oracle CorporationOracle
Microsoft CorporationMS Access
Microsoft CorporationSQL Server
MySQL ABMySQL
NCR Teradata 
PostgreSQL Dvlp GrpPostgreSQL
SybaseSybase 11
 
                                        ALTERNATIVES TO RDBMS
Although most businesses manage their corporate data in relational database management systems (RDBMS), many businesses still operate application systems that use flat files for data storage.  Many of these systems are legacy "batch" systems that can't support online data transactions.  A flat file can be stored on computer tape or on a hard drive of some sort.
Network databases such as IDMS became popular in the 1980s, when computers were much less powerful than the ones that exist today.  Although network databases supported online transactions, the databases were relatively inflexible.  Once a database was designed, it was often costly to implement changes.
Hierarchical databases were also popular in the 1970s and 1980s.




A Tutorial on Database Concepts, SQL using MySQL.

This tutorial may be reproduced without any modifications to this document for non-commercial, non-profit purposes.All other forms of usage requires the permission of the author - Jitendra Yadav, email: yadavjitendra07@gmail.com

This tutorial aims to provide the reader with the following:
  • A lucid and quick understanding of databases, RDBMS and related jargon such as triggers, replication, procedures etc.
  • A clear understanding of how SQL works.
  • Lots of examples with SQL using MySQL that make understanding the process of contructing SQL queries easy and also using MySQL and to illustrate the mechanism of storing and retrieving information from databases.
(If you find any errors, please send me an email and I'll promptly set it right. If there's something you'd like to see here let me know too.)

What's a database ?
A database is a collection of data organized in a particular way.Databases can be of many types such as Flat File Databases, Relational Databases, Distributed Databases etc.

What's SQL ?
In 1971, IBM researchers created a simple non-procedural language called Structured English Query Language. or SEQUEL. This was based on Dr. Edgar F. (Ted) Codd's design of a relational model for data storage where he described a universal programming language for accessing databases.
In the late 80's ANSI and ISO (these are two organizations dealing with standards for a wide variety of things) came out with a standardized version called Structured Query Language or SQL. SQL is prounced as 'Sequel'. There have been several versions of SQL and the latest one is SQL-99. Though SQL-92 is the current universally adopted standard.
SQL is the language used to query all databases. It's simple to learn and appears to do very little but is the heart of a successful database application. Understanding SQL and using it efficiently is highly imperative in designing an efficient database application. The better your understanding of SQL the more versatile you'll be in getting information out of databases.

What's an RDBMS ?
This concept was first described around 1970 by Dr. Edgar F. Codd in an IBM research publication called "System R4 Relational".
A relational database uses the concept of linked two-dimensional tables which comprise of rows and columns. A user can draw relationships between multiple tables and present the output as a table again. A user of a relational database need not understand the representation of data in order to retrieve it. Relational programming is non-procedural.
[What's procedural and non-procedural ?
Programming languages are procedural if they use programming elements such as conditional statements (if-then-else, do-while etc.). SQL has none of these types of statements.]
In 1979, Relational Software released the world's first relational database called Oracle V.2
What a DBMS ?
MySQL and mSQL are database management systems or DBMS. These software packages are used to manipulate a database. All DBMSs use their own implementation of SQL. It may be a subset or a superset of the instructions provided by SQL 92.
MySQL, due to it's simplicity uses a subset of SQL 92 (also known as SQL2).

What's Database Normalization ?
Normalization is the process where a database is designed in a way that removes redundancies, and increases the clarity in organizing data in a database.
In easy English, it means take similar stuff out of a collection of data and place them into tables. Keep doing this for each new table recursively and you'll have a Normalized database. From this resultant database you should be able to recreate the data into it's original state if there is a need to do so.
The important thing here is to know when to Normalize and when to be practical. That will come with experience. For now, read on...
Normalization of a database helps in modifying the design at later times and helps in being prepared if a change is required in the database design. Normalization raises the efficiency of the datatabase in terms of management, data storage and scalability.
Now Normalization of a Database is achieved by following a set of rules called 'forms' in creating the database.
These rules are 5 in number (with one extra one stuck in-between 3&4) and they are:
1st Normal Form or 1NF:
Each Column Type is Unique.
2nd Normal Form or 2NF:
The entity under consideration should already be in the 1NF and all attributes within the entity should depend solely on the entity's unique identifier.
3rd Normal Form or 3NF:
The entity should already be in the 2NF and no column entry should be dependent on any other entry (value) other than the key for the table.
If such an entity exists, move it outside into a new table.

Now if these 3NF are achieved, the database is considered normalized. But there are three more 'extended' NF for the elitist.
These are:
BCNF (Boyce & Codd):
The database should be in 3NF and all tables can have only one primary key.
4NF:
Tables cannot have multi-valued dependencies on a Primary Key.
5NF:
There should be no cyclic dependencies in a composite key.
Well this is a highly simplified explanation for Database Normalization. One can study this process extensively though. After working with databases for some time you'll automatically create Normalized databases. As, it's logical and practical.
For now, don't worry too much about Normalization. The quickest way to grasp SQL and Databases is to plunge headlong into creating tables and start messing around with SQL statements. After you go through the tutorial examples and also the example contacts database, look at the example provided in creating a normalized database near the very end of this tutorial. And then try to think how you would like to create your own database.
Much of database design depends on how YOU want to keep the data. In real life situations often you may find it more convenient to store data in tables designed in a way that does fall a bit short of keeping all the NFs happy. But that's what databases are all about. Making your life simpler.

Onto SQL
There are four basic commands which are the workhorses for SQL and figure in almost all queries to a database.
INSERT - Insert Data
DELETE - Delete Data
SELECT - Pull Data
UPDATE - Change existing Data
As you can see SQL is like English.
Let's build a real world example database using MySQL and perform some SQL operations on it.
A database that practically anyone could use would be a Contacts database.
In our example we are going to create create a database with the following fields:
  • FirstName
  • LastName
  • BirthDate
  • StreetAddress
  • City
  • State
  • Zip
  • Country
  • TelephoneHome
  • TelephoneWork
  • Email
  • CompanyName
  • Designation
First, lets decide how we are going to store this data in the database. For illustration purposes, we are going to keep this data in multiple tables.

This will let us exercise all of the SQL commands pertaining to retrieving data from multiple tables. Also we can separate different kinds of entities into different tables. So let's say you have thousands of friends and need to send a mass email to all of them, a SELECT statement (covered later) will look at only one table.

Well, we can keep the FirstName, LastName and BirthDate in one table.
Address related data in another.
Company Details in another.
Emails can be separated into another.
Telephones can be separated into another.

Let's build the database in MySQL.
While building a database - you need to understand the concept of data types. Data types allow the user to define how data is stored in fields or cells within a database. It's a way to define how your data will actually exist. Whether it's a Date or a string consisting of 20 characters, an integer etc. When we build tables within a database we also define the contents of each field in each row in the table using a data type. It's imperative that you use only the data type that fits your needs and don't use a data type that reserves more memory than the data in the field actually requires.
Let's look at various Data Types under MySQL.



 
Type
Size in bytes
Description
 TINYINT (length)
1
Integer with unsigned range of 0-255 and a signed range from -128-127
SMALLINT (length)
2
Integer with unsigned range of 0-65535 and a signed range from -32768-32767
MEDIUMINT(length)
3
Integer with unsigned range of 0-16777215 and a signed range from -8388608-8388607
INT(length)
4
Integer with unsigned range of 0-429467295 and a signed range from -2147483648-2147483647
BIGINT(length)
8
Integer with unsigned range of 0-18446744 and a signed range from 
-9223372036854775808-9223372036854775807
FLOAT(length, decimal)
4
Floating point number with max. value +/-3.402823466E38 and min.(non-zero) value +/11.175494351E-38
DOUBLEPRECISION(length, decimal)
8
Floating point number with max. value +/- -1.7976931348623157E308 and min. (non-zero) value +/-2.2250738585072014E-308
DECIMAL(length, decimal)
length
Floating point number with the range of the DOUBLE type that is stored as a CHAR field type.
TIMESTAMP(length)
4
YYYYMMDDHHMMSS or YYMMDDHHMMSS or YYYYMMDD, YYMMDD. A Timestamp value is updated each time the row changes value. A NULL value sets the field to the current time.
DATE
3
YYYY-MM-DD
TIME
3
HH:MM:DD
DATETIME
8
YYYY-MM-DD HH:MM:SS
YEAR
1
YYYY or YY
CHAR(length)
length
A fixed length text string where fields shorter than the assigned length are filled with trailing spaces.
VARCHAR(length)
length
A fixed length text string (255 Character Max) where unused trailing spaces are removed before storing.
TINYTEXT
length+1
A text field with max. length of 255 characters.
TINYBLOB
length+1
A binary field with max. length of 255 characters.
TEXT
length+1
64Kb of text
BLOB
length+1
64Kb of data
MEDIUMTEXT
length+3
16Mb of text
MEDIUMBLOB
length+3
16 Mb of data
LONGTEXT
length+4
4GB of text
LONGBLOB
length+4
4GB of data
ENUM
1,2
This field can contain one of a possible 65535 number of options. Ex: ENUM('abc','def','ghi')
SET
1-8
This type of field can contain any number of a set of predefined possible values.
 



The following examples will make things quite clear on declaring Data Types within SQL statements.
Steps in Creating the Database using MySQL
From the shell prompt (either in DOS or UNIX):
mysqladmin create contacts;
This will create an empty database called "contacts".
Now run the command line tool "mysql" and from the mysql prompt do the following:
mysql> use contacts;
(You'll get the response "Database changed")
The following commands entered into the MySQL prompt will create the tables in the database.
mysql> CREATE TABLE names (contact_id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName CHAR(20), LastName CHAR(20), BirthDate DATE);
mysql> CREATE TABLE address(contact_id SMALLINT NOT NULL PRIMARY KEY, StreetAddress CHAR(50), City CHAR(20), State CHAR(20), Zip CHAR(15), Country CHAR(20));
mysql> CREATE TABLE telephones (contact_id SMALLINT NOT NULL PRIMARY KEY, TelephoneHome CHAR(20), TelephoneWork(20));
mysql> CREATE TABLE email (contact_id SMALLINT NOT NULL PRIMARY KEY, Email CHAR(20));
mysql> CREATE TABLE company_details (contact_id SMALLINT NOT NULL PRIMARY KEY, CompanyName CHAR(25), Designation CHAR(15));
Note: Here we assume that one person will have only one email address. Now if there were a situation where one person has multiple addresses, this design would be a problem. We'd need another field which would keep values that indicated to whom the email address belonged to. In this particular case email data ownership is indicated by the primary key. The same is true for telephones. We are assuming that one person has only one home telephone and one work telephone number. This need not be true. Similarly one person could work for multiple companies at the same time holding two different designation. In all these cases an extra field will solve the issue. For now however let's work with this small design.

KEYS:
The relationships between columns located in different tables are usually described through the use of keys.
As you can see we have a PRIMARY KEY in each table. The Primary key serves as a mechanism to refer to other fields within the same row. In this case, the Primary key is used to identify a relationship between a row under consideration and the person whose name is located inside the 'names' table. We use the AUTO_INCREMENT statement only for the 'names' table as we need to use the generated contact_id number in all the other tables for identification of the rows.
This type of table design where one table establishes a relationship with several other tables is known as a 'one to many'relationship.
In a 'many to many' relationship we could have several Auto Incremented Primary Keys in various tables with several inter-relationships.

Foreign Key:
A foreign key is a field in a table which is also the Primary Key in another table. This is known commonly as 'referential integrity'.
Execute the following commands to see the newly created tables and their contents.
To see the tables inside the database:
mysql> SHOW TABLES;
+-----------------------+
| Tables in contacts |
+-----------------------+
| address |
| company_details |
| email |
| names |
| telephones |
+----------------------+
5 rows in set (0.00 sec)

To see the columns within a particular table:
mysql>SHOW COLUMNS FROM address;
+---------------+-------------+------+-----+---------+-------+---------------------------------+
| Field | Type | Null | Key | Default | Extra | Privileges
|
+---------------+-------------+------+-----+---------+-------+---------------------------------+
| contact_id | smallint(6) | | PRI | 0 | | select,insert,update,references |
| StreetAddress | char(50) | YES | | NULL | | select,insert,update,references |
| City | char(20) | YES | | NULL | | select,insert,update,references |
| State | char(20) | YES | | NULL | | select,insert,update,references |
| Zip | char(10) | YES | | NULL | | select,insert,update,references |
| Country | char(20) | YES | | NULL | | select,insert,update,references |
+---------------+-------------+------+-----+---------+-------+------------------ ---------------+
6 rows in set (0.00 sec)

So we have the tables created and ready. Now we put in some data.Let's start with the 'names' table as it uses a unique AUTO_INCREMENT field which in turn is used in the other tables.
Inserting data, one row at a time:
mysql> INSERT INTO names (FirstName, LastName, BirthDate) VALUES ('Yamila','Diaz ','1974-10-13');
Query OK, 1 row affected (0.00 sec)

Inserting multiple rows at a time:
mysql> INSERT INTO names (FirstName, LastName, BirthDate) VALUES ('Nikki','Taylor','1972-03-04'),('Tia','Carrera','1975-09-18');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

Let's see what the data looks like inside the table. We use the SELECT command for this.
mysql> SELECT * from NAMES;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+
3 rows in set (0.06 sec)

Try another handy command called 'DESCRIBE'.
mysql> DESCRIBE names;
+------------+-------------+------+-----+---------+----------------+---------------------------------+
| Field | Type | Null | Key | Default | Extra | Privileges
|
+------------+-------------+------+-----+---------+----------------+---------------------------------+
| contact_id | smallint(6) | | PRI | NULL | auto_increment | select,insert,update,references |
| FirstName | char(20) | YES | | NULL | | select,insert,update,references |
| LastName | char(20) | YES | | NULL | | select,insert,update,references |
| BirthDate | date | YES | | NULL | | select,insert,update,references |
+------------+-------------+------+-----+---------+----------------+---------------------------------+
4 rows in set (0.00 sec)

Now lets populate the other tables. Observer the syntax used.
mysql> INSERT INTO address(contact_id, StreetAddress, City, State, Zip, Country) VALUES ('1', '300 Yamila Ave.', 'Los Angeles', 'CA', '300012', 'USA'),('2','4000 Nikki St.','Boca Raton','FL','500034','USA'),('3','404 Tia Blvd.','New York','NY','10011','USA');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM address;
+------------+-----------------+-------------+-------+--------+---------+
| contact_id | StreetAddress | City | State | Zip | Country |
+------------+-----------------+-------------+-------+--------+---------+
| 1 | 300 Yamila Ave. | Los Angeles | CA | 300012 | USA |
| 2 | 4000 Nikki St. | Boca Raton | FL | 500034 | USA |
| 3 | 404 Tia Blvd. | New York | NY | 10011 | USA |
+------------+-----------------+-------------+-------+--------+---------+
3 rows in set (0.00 sec)

mysql> INSERT INTO company_details (contact_id, CompanyName, Designation) VALUES ('1','Xerox','New Business Manager'), ('2','Cabletron','Customer Support Eng'),('3','Apple','Sales Manager');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM company_details;
+------------+-------------+----------------------+
| contact_id | CompanyName | Designation |
+------------+-------------+----------------------+
| 1 | Xerox | New Business Manager |
| 2 | Cabletron | Customer Support Eng |
| 3 | Apple | Sales Manager |
+------------+-------------+----------------------+
3 rows in set (0.06 sec)

mysql> INSERT INTO email (contact_id, Email) VALUES ('1', 'yamila@yamila.com'),( '2', 'nikki@nikki.com'),('3','tia@tia.com');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM email;
+------------+-------------------+
| contact_id | Email |
+------------+-------------------+
| 1 | yamila@yamila.com |
| 2 | nikki@nikki.com |
| 3 | tia@tia.com |
+------------+-------------------+
3 rows in set (0.06 sec)

mysql> INSERT INTO telephones (contact_id, TelephoneHome, TelephoneWork) VALUES ('1','333-50000','333-60000'),('2','444-70000','444-80000'),('3','555-30000','55 5-40000');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM telephones;
+------------+---------------+---------------+
| contact_id | TelephoneHome | TelephoneWork |
+------------+---------------+---------------+
| 1 | 333-50000 | 333-60000 |
| 2 | 444-70000 | 444-80000 |
| 3 | 555-30000 | 555-40000 |
+------------+---------------+---------------+
3 rows in set (0.00 sec)

Okay, so we now have all our data ready for experimentation.

Before we start experimenting with manipulating the data let's look at how MySQL stores the Data.
To do this execute the following command from the shell prompt.
mysqldump contacts > contacts.sql
Note: The reverse operation for this command is:
mysql contacts < contacts.sql
The file generated is a text file that contains all the data and SQL instruction needed to recreate the same database. As you can see, the SQL here is slightly different than what was typed in. Don't worry about this. It's all good ! It would also be obvious that this is a good way to backup your stuff.
# MySQL dump 8.2
#
# Host: localhost Database: contacts
#--------------------------------------------------------
# Server version 3.22.34-shareware-debug

#
# Table structure for table 'address'
#

CREATE TABLE address (
contact_id smallint(6) DEFAULT '0' NOT NULL,
StreetAddress char(50),
City char(20),
State char(20),
Zip char(10),
Country char(20),
PRIMARY KEY (contact_id)
);

#
# Dumping data for table 'address'
#

INSERT INTO address VALUES (1,'300 Yamila Ave.','Los Angeles','CA','300012','USA');
INSERT INTO address VALUES (2,'4000 Nikki St.','Boca Raton','FL','500034','USA');
INSERT INTO address VALUES (3,'404 Tia Blvd.','New York','NY','10011','USA');

#
# Table structure for table 'company_details'
#

CREATE TABLE company_details (
contact_id smallint(6) DEFAULT '0' NOT NULL,
CompanyName char(25),
Designation char(20),
PRIMARY KEY (contact_id)
);

#
# Dumping data for table 'company_details'
#

INSERT INTO company_details VALUES (1,'Xerox','New Business Manager');
INSERT INTO company_details VALUES (2,'Cabletron','Customer Support Eng');
INSERT INTO company_details VALUES (3,'Apple','Sales Manager');

#
# Table structure for table 'email'
#

CREATE TABLE email (
contact_id smallint(6) DEFAULT '0' NOT NULL,
Email char(20),
PRIMARY KEY (contact_id)
);

#
# Dumping data for table 'email'
#

INSERT INTO email VALUES (1,'yamila@yamila.com');
INSERT INTO email VALUES (2,'nikki@nikki.com');
INSERT INTO email VALUES (3,'tia@tia.com');

#
# Table structure for table 'names'
#

CREATE TABLE names (
contact_id smallint(6) DEFAULT '0' NOT NULL auto_increment,
FirstName char(20),
LastName char(20),
BirthDate date,
PRIMARY KEY (contact_id)
);

#
# Dumping data for table 'names'
#

INSERT INTO names VALUES (3,'Tia','Carrera','1975-09-18');
INSERT INTO names VALUES (2,'Nikki','Taylor','1972-03-04');
INSERT INTO names VALUES (1,'Yamila','Diaz','1974-10-13');

#
# Table structure for table 'telephones'
#

CREATE TABLE telephones (
contact_id smallint(6) DEFAULT '0' NOT NULL,
TelephoneHome char(20),
TelephoneWork char(20),
PRIMARY KEY (contact_id)
);

#
# Dumping data for table 'telephones'
#

INSERT INTO telephones VALUES (1,'333-50000','333-60000');
INSERT INTO telephones VALUES (2,'444-70000','444-80000');
INSERT INTO telephones VALUES (3,'555-30000','555-40000');


Let's try some SELECT statement variations:
To select all names whose corresponding contact_id is greater than 1.
mysql> SELECT * FROM names WHERE contact_id > 1;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
+------------+-----------+----------+------------+
2 rows in set (0.00 sec)

As a condition we can also use NOT NULL. This statement will return all names where there exists a contact_id.
mysql> SELECT * FROM names WHERE contact_id IS NOT NULL;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+
3 rows in set (0.06 sec)

Result's can be arranged in a particular way using the statement ORDER BY.
mysql> SELECT * FROM names WHERE contact_id IS NOT NULL ORDER BY LastName;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 1 | Yamila | Diaz | 1974-10-13 |
| 2 | Nikki | Taylor | 1972-03-04 |
+------------+-----------+----------+------------+
3 rows in set (0.06 sec)

'asc' and 'desc' stand for ascending and descending respectively and can be used to arrange the results.
mysql> SELECT * FROM names WHERE contact_id IS NOT NULL ORDER BY LastName desc;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
| 3 | Tia | Carrera | 1975-09-18 |
+------------+-----------+----------+------------+
3 rows in set (0.04 sec)

You can also place date types into conditional statements.
mysql> SELECT * FROM names WHERE BirthDate > '1973-03-06';
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+

2 rows in set (0.00 sec)
LIKE is a statement to match field values using wildcards. The % sign is used for denoting wildcards and can represent multiple characters.
mysql> SELECT FirstName, LastName FROM names WHERE LastName LIKE 'C%';
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Tia | Carrera |
+-----------+----------+
1 row in set (0.06 sec)

'_' is used to represent a single wildcard.
mysql> SELECT FirstName, LastName FROM names WHERE LastName LIKE '_iaz';
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Yamila | Diaz |
+-----------+----------+
1 row in set (0.00 sec)

SQL Logical Operations (operates from Left to Right)
1.NOT or !
2. AND or &&
3. OR or ||
4. = : Equal
5. <> or != : Not Equal
6. <=
7. >=
8 <,>
Here are some more variations with Logical Operators and using the 'IN' statement.
mysql> SELECT FirstName FROM names WHERE contact_id < 3 AND LastName LIKE 'D%';
+-----------+
| FirstName |
+-----------+
| Yamila |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT contact_id FROM names WHERE LastName IN ('Diaz','Carrera');
+------------+
| contact_id |
+------------+
| 3 |
| 1 |
+------------+
2 rows in set (0.02 sec)

To return the number of rows in a table
mysql> SELECT count(*) FROM names;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.02 sec)

mysql> SELECT count(FirstName) FROM names;
+------------------+
| count(FirstName) |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)

To do some basic arithmetic aggregate functions.
mysql> SELECT SUM(contact_id) FROM names;
+-----------------+
| SUM(contact_id) |
+-----------------+
| 6 |
+-----------------+
1 row in set (0.00 sec)

To select a largest value from a row. Substitute 'MIN' and see what happens next.
mysql> SELECT MAX(contact_id) FROM names;
+-----------------+
| MAX(contact_id) |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.00 sec)

HAVING
Take a look at the first query using the statement WHERE and the second statement using the statement HAVING.
mysql> SELECT * FROM names WHERE contact_id >=1;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 1 | Yamila | Diaz | 1974-10-13 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 3 | Tia | Carrera | 1975-09-18 |
+------------+-----------+----------+------------+
3 rows in set (0.03 sec)

mysql> SELECT * FROM names HAVING contact_id >=1;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+
3 rows in set (0.00 sec)


Now lets work with multiple tables and see how information can be pulled out of the data.
mysql> SELECT names.contact_id, FirstName, LastName, Email FROM names, email WHERE names.contact_id = email.contact_id;
+------------+-----------+----------+-------------------+
| contact_id | FirstName | LastName | Email |
+------------+-----------+----------+-------------------+
| 1 | Yamila | Diaz | yamila@yamila.com |
| 2 | Nikki | Taylor | nikki@nikki.com |
| 3 | Tia | Carrera | tia@tia.com |
+------------+-----------+----------+-------------------+
3 rows in set (0.11 sec)

mysql> SELECT DISTINCT names.contact_id, FirstName, Email, TelephoneWork FROM names, email, telephones WHERE names.contact_id=email.contact_id=telephones.contact_id;
+------------+-----------+-------------------+---------------+
| contact_id | FirstName | Email | TelephoneWork |
+------------+-----------+-------------------+---------------+
| 1 | Yamila | yamila@yamila.com | 333-60000 |
| 2 | Nikki | nikki@nikki.com | 333-60000 |
| 3 | Tia | tia@tia.com | 333-60000 |
+------------+-----------+-------------------+---------------+
3 rows in set (0.05 sec)


So what's a JOIN ?
JOIN is the action performed on multiple tables that returns a result as a table. It's what makes a database 'relational'.
There are several types of joins. Let's look at LEFT JOIN (OUTER JOIN) and RIGHT JOIN
Let's first check out the contents of the tables we're going to use
mysql> SELECT * FROM names;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM email;
+------------+-------------------+
| contact_id | Email |
+------------+-------------------+
| 1 | yamila@yamila.com |
| 2 | nikki@nikki.com |
| 3 | tia@tia.com |
+------------+-------------------+
3 rows in set (0.00 sec)

A LEFT JOIN First:
mysql> SELECT * FROM names LEFT JOIN email USING (contact_id);
+------------+-----------+----------+------------+------------+------------------+
| contact_id | FirstName | LastName | BirthDate | contact_id | Email|
+------------+-----------+----------+------------+------------+-------------------+
| 3 | Tia | Carrera | 1975-09-18 | 3 | tia@tia.com |
| 2 | Nikki | Taylor | 1972-03-04 | 2 | nikki@nikki.com |
| 1 | Yamila | Diaz | 1974-10-13 | 1 | yamila@yamila.com |
+------------+-----------+----------+------------+------------+-------------------+
3 rows in set (0.16 sec)

To find the people who have a home phone number.
mysql> SELECT names.FirstName FROM names LEFT JOIN telephones ON names.contact_id = telephones.contact_id WHERE TelephoneHome IS NOT NULL;
+-----------+
| FirstName |
+-----------+
| Tia |
| Nikki |
| Yamila |
+-----------+
3 rows in set (0.02 sec)

These same query leaving out 'names' (from names.FirstName) is still the same and will generate the same result.
mysql> SELECT FirstName FROM names LEFT JOIN telephones ON names.contact_id = telephones.contact_id WHERE TelephoneHome IS NOT NULL;
+-----------+
| FirstName |
+-----------+
| Tia |
| Nikki |
| Yamila |
+-----------+
3 rows in set (0.00 sec)

And now a RIGHT JOIN:
mysql> SELECT * FROM names RIGHT JOIN email USING(contact_id);
+------------+-----------+----------+------------+------------+----------------- --+
| contact_id | FirstName | LastName | BirthDate | contact_id | Email |
+------------+-----------+----------+------------+------------+-------------------+
| 1 | Yamila | Diaz | 1974-10-13 | 1 | yamila@yamila.com |
| 2 | Nikki | Taylor | 1972-03-04 | 2 | nikki@nikki.com
|
| 3 | Tia | Carrera | 1975-09-18 | 3 | tia@tia.com
|
+------------+-----------+----------+------------+------------+-----------------
--+
3 rows in set (0.03 sec)


BETWEEN
This conditional statement is used to select data where a certain related contraint falls between a certain range of values. The following example illustrates it's use.
mysql> SELECT * FROM names;
+------------+-----------+----------+------------+
| contact_id | FirstName | LastName | BirthDate |
+------------+-----------+----------+------------+
| 3 | Tia | Carrera | 1975-09-18 |
| 2 | Nikki | Taylor | 1972-03-04 |
| 1 | Yamila | Diaz | 1974-10-13 |
+------------+-----------+----------+------------+
3 rows in set (0.06 sec)

mysql> SELECT FirstName, LastName FROM names WHERE contact_id BETWEEN 2 AND 3;
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Tia | Carrera |
| Nikki | Taylor |
+-----------+----------+
2 rows in set (0.00 sec)


ALTER
The ALTER statement is used to add a new column to an existing table or to make changes to it.
mysql> ALTER TABLE names ADD Age SMALLINT;
Query OK, 3 rows affected (0.11 sec)
Records: 3 Duplicates: 0 Warnings: 0

Now let's take a look at the 'ALTER'ed Table.
mysql> SHOW COLUMNS FROM names;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| contact_id | smallint(6) | | PRI | 0 | auto_increment |
| FirstName | char(20) | YES | | NULL | |
| LastName | char(20) | YES | | NULL | |
| BirthDate | date | YES | | NULL | |
| Age | smallint(6) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.06 sec)

But we don't require Age to be a SMALLINT type when a TINYINT would suffice. So we use another ALTER statement.
mysql> ALTER TABLE names CHANGE COLUMN Age Age TINYINT;
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SHOW COLUMNS FROM names;
+------------+-------------+------+-----+---------+--------+----------------+
| Field | Type | Null | Key | Default | Extra | 
+------------+-------------+------+-----+---------+--------+----------------+
| contact_id | smallint(6) | | PRI | NULL |
| FirstName | char(20) | YES | | NULL | | 
| LastName | char(20) | YES | | NULL | | 
| BirthDate | date | YES | | NULL | |
| Age | tinyint(4) | YES | | NULL | |
+------------+-------------+------+-----+---------+--------+----------------+
5 rows in set (0.00 sec)

MODIFY
You can also use the MODIFY statement to change column data types.
mysql> ALTER TABLE names MODIFY COLUMN Age SMALLINT;
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SHOW COLUMNS FROM names;
+------------+-------------+------+-----+---------+----------------+---------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+---------------+
| contact_id | smallint(6) | | PRI | NULL | auto_increment | 
| FirstName | char(20) | YES | | NULL | |
| LastName | char(20) | YES | | NULL | |
| BirthDate | date | YES | | NULL | |
| Age | smallint(6) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+---------------+
5 rows in set (0.00 sec)

To Rename a Table:
mysql> ALTER TABLE names RENAME AS mynames;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLES;
+--------------------+
| Tables_in_contacts |
+--------------------+
| address |
| company_details |
| email |
| mynames |
| telephones |
+--------------------+
5 rows in set (0.00 sec)

We rename it back to the original name.
mysql> ALTER TABLE mynames RENAME AS names;
Query OK, 0 rows affected (0.01 sec)


UPDATE
The UPDATE command is used to add a value to a field in a table.
mysql> UPDATE names SET Age ='23' WHERE FirstName='Tia';
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

The Original Table:
mysql> SELECT * FROM names;
+------------+-----------+----------+------------+------+
| contact_id | FirstName | LastName | BirthDate | Age |
+------------+-----------+----------+------------+------+
| 3 | Tia | Carrera | 1975-09-18 | 23 |
| 2 | Nikki | Taylor | 1972-03-04 | NULL |
| 1 | Yamila | Diaz | 1974-10-13 | NULL |
+------------+-----------+----------+------------+------+
3 rows in set (0.05 sec)

The Modified Table:
mysql> SELECT * FROM names;
+------------+-----------+----------+------------+------+
| contact_id | FirstName | LastName | BirthDate | Age |
+------------+-----------+----------+------------+------+
| 3 | Tia | Carrera | 1975-09-18 | 24 |
| 2 | Nikki | Taylor | 1972-03-04 | NULL |
| 1 | Yamila | Diaz | 1974-10-13 | NULL |
+------------+-----------+----------+------------+------+
3 rows in set (0.00 sec)


DELETE
mysql> DELETE FROM names WHERE Age=23;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM names;
+------------+-----------+----------+------------+------+
| contact_id | FirstName | LastName | BirthDate | Age |
+------------+-----------+----------+------------+------+
| 2 | Nikki | Taylor | 1972-03-04 | NULL |
| 1 | Yamila | Diaz | 1974-10-13 | NULL |
+------------+-----------+----------+------------+------+
2 rows in set (0.00 sec)

A DEADLY MISTAKE...
mysql> DELETE FROM names;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM names;
Empty set (0.00 sec)

One more destructive tool...
DROP TABLE
mysql> DROP TABLE names;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW TABLES;
+--------------------+
| Tables in contacts |
+--------------------+
| address |
| company_details |
| email |
| telephones |
+--------------------+
4 rows in set (0.05 sec)

mysql> DROP TABLE address ,company_details, telephones;
Query OK, 0 rows affected (0.06 sec)

mysql> SHOW TABLES;
Empty set (0.00 sec)

As you can see, the table 'names' no longer exists. MySQL does not give a warning so be careful.

FULL TEXT INDEXING and Searching
Since version 3.23.23, Full Text Indexing and Searching has been introduced into MySQL. FULLTEXT indexes can be created from VARCHAR and TEXT columns. FULLTEXT searches are performed with the MATCH function. The MATCH function matches a natural language query on a text collection and from each row in a table it returns relevance.The resultant rows are organized in order of relevance.
Full Text searches are a very powerful way to search through text. But is not ideal for small tables of text and may produce inconsistent results. Ideally it works with large collections of textual data.

Optimizing your Database
Well, databases do tend to get large at some or the other. And here arises the issue of database optimization. Queries are going to take longer and longer as the database grows and certain things can be done to speed things up.
Clustering
The easiest method is that of 'clustering'. Suppose you do a certain kind of query often, it would be faster if the database contents were arranged in a in the same way data was requested. To keep the tables in a sorted order you need a clustering index. Some databases keep stuff sorted automatically.
Ordered Indices
These are a kind of 'lookup' tables of sorts. For each column that may be of interest to you, you can create an ordered index.It needs to be noted that again these kinds of optimization techniques produce a system load in terms of creating a new index each time the data is re-arranged.
There are additional method such as B-Trees, Hashing which you may like to read up about but will not be discussed here.

Replication
Replication is the term given to the process where databases synchronize with each other. In this process one database updates it's own data with respect to another or with reference to certain criteria for updates specified by the programmer. Replication can be used under various circumstances. Examples may be : safety and backup, to provide a closer location to the database for certain users.

What are Transactions ?
In an RDBMS, when several people access the same data or if a server dies in the middle of an update, there has to be a mechanism to protect the integrity of the data. Such a mechanism is called a Transaction. A transaction groups a set of database actions into a single instantaneous event. This event can either succeed or fail. i.e .either get the job done or fail.
The definition of a transaction can be provided by an Acronym called 'ACID'.
(A)tomicity: If an action consists of multiple steps - it's still considered as one operation.
(C) Consistency: The database exists in a valid and accurate operating state before and after a transaction.
(I) Isolation: Processes within one transaction are independent and cannot interfere with that in others.
(D) Durability: Changes affected by a transaction are permanent.
To enable transactions a mechanism called 'Logging' needs to be introduced. Logging involves a DBMS writing details on the tables, columns and results of a particular transaction, both before and after, onto a log file. This log file is used in the process of recovery. Now to protect a certain database resource (ex. a table) from being used and written onto simulatneously several techniques are used. One of them is 'Locking' another is to put a 'time stamp' onto an action. In the case of Locking, to complete an action, the DBMS would need to acquire locks on all resources needed to complete the action. The locks are released only when the transaction is completed.
Now if there were say a large numbers of tables involved in a particular action, say 50, all 50 tables would be locked till a transaction is completed.
To improve things a bit, there is another technique used called 2 Phase Locking or 2PL. In this method of locking, locks are acquired only when needed but are released only when the transaction is completed.
This is done to make sure that that altered data can be safely restored if the transaction fails for any reason.
This technique can also result in problems such as "deadlocks".
In this case - 2 processes requiring the same resources lock each other up by preventing the other to complete an action. Options here are to abort one, or let the programmer handle it.
MySQL implements transactions by implementing the Berkeley DB libraries into its own code. So it's the source version you'd want here for MySQL installation. Read the MySQL manual on implementing this.

Beyond MySQL

What are Views ?
A view allows you to assign the result of a query to a new private table. This table is given the name used in your VIEW query.
Although MySQL does not support views yet a sample SQL VIEW construct statement would look like:

CREATE VIEW TESTVIEW AS SELECT * FROM names;

What are Triggers ?
A trigger is a pre-programmed notification that performs a set of actions that may be commonly required. Triggers can be programmed to execute certain actions before or after an event occurs. Triggers are very useful as they they increase efficiency and accuracy in performing operations on databases and also are increase productivity by reducing the time for application development. Triggers however do carry a price in terms of processing overhead.

What are Procedures ?
Like triggers, Procedures or 'Stored' Procedures are productivity enhancers. Suppose you needed to perform an action using a programming interface to the database in say PERL and ASP. If a programmed action could be stored at the database level, it's obvious that it has to be written only once and cam be called by any programming language interacting with the database.
Procedures are executed using triggers.

Beyond RDBMS

Distributed Databases (DDB)
A distributed database is a collection of several, logically interrelated database located at multiple locations of a computer network. A distributed database management system permits the management of such a database and makes the operation transparent to the user. Good examples of distributed databases would be those utilized by banks, multinational firms with several office locations where each distributed data system works only with the data that is relevant to it's operations. DDBs have have full functionality of any DBMS. It's also important to know that the distributed databases are considered to be actually one database rather than discrete files and data within distributed databases are logically interrelated.

Object Database Management Systems or ODBMS
When the capabilities of a database are integrated with object programming language capababilities, the resulting product is an ODBMS. Database objects appear as programming objects in an ODBMS. Using an ODBMS offers several advantages. The ones that can be most readily appreciated are:
1. EfficiencyWhen you use an ODBMS, you're using data the way you store it. You will use less code as you're not dependent on an intermediary like SQL or ODBC. When this happens you can create highly complex data structures through your programming language.
2. SpeedWhen data is stored the way you'd like it to be stored (i.e. natively) there is a massive performance increase as no to-and-fro translation is required.

A Quick Tutorial on Database Normalization
Let's start off by taking some data represented in a Table.
Table Name: College Table
StudentNameCourseID1CourseTitle1CourseProfessor1CourseID2CourseTitle2CourseProfessor2StudentAdvisorStudentID
Tia CarreraCS123Perl Regular ExpressionsDon CorleoneCS003Object Oriented Programming 1Daffy DuckFred Flintstone400
John WayneCS456Socket ProgrammingDJ TiestoCS004AlgorithmsHomer SimpsonBarney Rubble401
Lara CroftCS789OpenGLBill ClintonCS001Data StructuresPapa SmurfSeven of Nine402
(text size has been shrunk to aid printability on one page)

The First Normal Form: (Each Column Type is Unique and there are no repeating groups [types] of data)
This essentially means that you indentify data that can exist as a separate table and therefore reduce repetition and will reduce the width of the original table.
We can see that for every student, Course Information is repeated for each course. So if a student has three course, you'll need to add another set of columns for Course Title, Course Professor and CourseID. So Student information and Course Information can be considered to be two broad groups.
Table Name: Student Information
StudentID (Primary Key)
StudentName
AdvisorName

Table Name: Course Information
CourseID (Primary Key) 
CourseTitle
CourseDescription
CourseProfessor
It's obvious that we have here a Many to Many relationship between Students and Courses.
Note: In a Many to Many relationship we need something called a relating table which basically contains information exclusively on which relatioships exist between two tables. In a One to Many relationship we use a foreign key.
So in this case we need another little table called: Students and Courses
Table Name: Students and Courses
SnCStudentID
SnCCourseID

The Second Normal Form: (All attributes within the entity should depend solely on the entity's unique identifier)
The AdvisorName under Student Information does not depend on the StudentID. Therefore it can be moved to it's own table.
Table Name: Student Information
StudentID (Primary Key)
StudentName

Table Name: Advisor Information
AdvisorID
AdvisorName

Table Name: Course Information
CourseID (Primary Key) 
CourseTitle
CourseDescription
CourseProfessor

Table Name: Students and Courses
SnCStudentID
SnCCourseID
Note: Relating Tables can be created as required.

The Third Normal Form:(no column entry should be dependent on any other entry (value) other than the key for the table)
In simple terms - a table should contain information about only one thing.
In Course Information, we can pull CourseProfessor information out and store it in another table.
Table Name: Student Information
StudentID (Primary Key)
StudentName

Table Name: Advisor Information
AdvisorID
AdvisorName

Table Name: Course Information
CourseID (Primary Key) 
CourseTitle
CourseDescription

Table Name: Professor Information
ProfessorID
CourseProfessor

Table Name: Students and Courses
SnCStudentID
SnCCourseID
Note: Relating Tables can be created as required.
Well that's it. One you are done with 3NF the database is considered Normalized.
Now lets consider some cases where normalization would have to avoided for practical purposes.
Suppose we needed to store a students home address along with State and Zip Code information. Would you create a separate table for every zipcode in your country along with one for cities and one for states ? It actually depends on you. I would prefer just using a non-normalized address table and stick everything in there. So exceptions crop up often and it's up to your better judgement.